如何分析Linux内存性能问题
一、Linux中的buffer与cache的区别
Linux的内存管理与监控_linux服务器虚假内存和真实内存怎么区分-CSDN博客文章浏览阅读66次。本文主要是关于【Linux系统的物理内存与虚拟内存讲解】【重点对虚拟内存的作用与用法进行了讲解说明】【最后还对如何新增扩展、优化、删除内存交换空间swap进行了详细的操作流程讲解】_linux服务器虚假内存和真实内存怎么区分https://coffeemilk.blog.csdn.net/article/details/149689342
序号 | buffer与cache的区别 |
buffer与cache都是存放在物理内存中的数据。 正常情况下至于何时回收,怎么回收buffer与cache的数据是不用我们管的,操作系统的内核会自行调度处理。 不建议自己手动回收处理 | |
1 | buffer主要是针对应用程序将【数据写入硬盘】的场景(即:由于直接将应用程序的数据直接写入到硬盘时,硬盘的写入速度效率太低,因此buffer又称为硬盘的缓冲区。而将buffer缓存区的数据写入到硬盘的操作是由操作系统的文件系统来调度完成的)【Buffer(缓冲)为了提高内存和硬盘之间的写操作】(buffer把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。更细的说是针对内存和硬盘之间的写操作来设计的,目的是将写的操作集中起来进行,减少磁盘碎片和硬盘反复寻址过程,提高性能。在Linux系统内部有一个守护进程,会定期清空Buffer中的内容,将其写入硬盘内,当手动执行sync命令时也会触发上述操作)。 注意:buffer里面存储的数据虽然不是很多,但是数据都很关键(如:Linux系统正在写数据,但是突然断电,等电恢复后,系统重启时会提示你进行数据恢复【这就是由于buffer里面的数据没有写入到硬盘导致的】好消息是文件系统的日志记录功能可以帮助你进行数据的恢复【前提是文件系统拥有日志记录功能且已经开启】)。 buffer里面一般存储的数据都不是很大,一般都在几十兆到几百兆。 |
2 | cache主要是针对【CPU读取硬盘文件数据】的场景(即:首次将硬盘的数据读取后缓存在内存中,下次再使用的时候就直接从cache中获取,读取效率就提升了,方便CPU快速处理;一般cache中缓存的是最近经常使用的数据,长时间不使用的数据就会被文件系统清除掉)【Cache(缓存)是为了调高CPU和内存之间数据交换而设计的】。 一般cache里面会存在大量的缓存数据,多达几G到几十G,可以清除出大量的内存。 |
#查看Linux系统的内存使用情况命令
free -h#查看系统实时运行情况命令
top
Linux系统必学的基础操作命令——快速上手Linux(上)-CSDN博客https://coffeemilk.blog.csdn.net/article/details/148987685
二、Linux内存不足时系统回收内存的步骤
序号 | 内存不足时系统回收内存的步骤 | 说明 |
1 | 脏页面(DirtyPages)写回 | 脏页面是指:内存中已被修改但尚未写入磁盘的数据 |
vm.dirty ratio:控制脏页面占用系统内存的最大比例(可手动配置比例) | ||
vm.dirty background ratio:当脏页面达到这个比例时,系统自动触发脏数据写回操作(可手动配置比例) | ||
在内存紧张时,内核会加速将脏页面写回磁盘以释放内存 | ||
2 | 页面缓存(Page Cache)清理 | Page Cache会占用很大物理内存,它主要作用是加快文件读取速度 |
当内存不足时,系统首先会尝试清理不再频繁访问的页面缓存,以释放内存 | ||
内核通过LRU(Least Recently Used,最近最少使用)算法清理不常使用的缓存页面 | ||
3 | 使用交换分区(Swap) | Page Cache释放还是不够时,Linux系统内核会将不常用的内存页交换到swap分区 |
频繁的swap操作会导致性能下降,尤其是在涉及大量硬盘I/O的情况下 | ||
通过vm.swappiness来控制内存交换的频率 | ||
4 | OOM Killer (Out Of Memory Killer) | 当内核无法通过上述步骤回收足够的内存时,OOM Killer启动 |
OOM Killer 会基于进程的OOM分数选择占用内存较多的进程进行终止 | ||
OOM Killer 通常优先杀死占用内存过多的后台进程 | ||
注意:一旦运行到这一步OOM Killer回收内存空间则对于我们的应用程序来说就很危险了!!!很容易被OOM Killer杀掉,会导致业务中断情况发生(且这里杀掉的应用一般是占用内存较多的应用,且不确定是哪个) |
示例:如下图Linux系统的物理内存是3.5G+内存交换空间8G=11.5G的总内存空间;假如现在有一个应用程序需要11G的内存运行空间,现在空闲的物理内存是2.7G不足11G,系统回收内存的步骤如下:
1、脏页面写回(即释放脏页面占用的内存,一般也不能释放多少空间【大概几十兆到几百兆】)假设这里释放了0.1G;
2、页面缓存清理(按照LRU【最近最少使用算法】将不常使用的缓存页面移动到交换分区中【即虚拟内存中】)假设这里释放了0.5G;
3、目前的可用的空间=空闲的物理内存2.7G+脏页面写回释放的内存0.1G+页面缓存清理释放的内存0.5G=3.3G,还是不够应用程序所需的12G;此时交换分区(虚拟内存)提供了7G的内存空间,目前可用内存为=3.3G+7G=10.3G还是不足11G(这里可供使用的物理内存只占到不足一半的空间,应用程序运行响应会非常缓慢).
4、OOM Killer就会启动对运行的程序进行打分,然后将打分最高的程序杀掉释放空间比如这里释放0.8G空间,此时可用的空间=10.3G+0.8G=11.1G满足程序运行,程序就可以正常运行了(但是OOM Killer根据打分情况将我们正在运行的应用程序杀掉,十分危险)。
比如当我们使用自己编写的memload程序申请16g内存启动后,可以不断的运行【free -h】或【free -m】命令查看内存空间的使用情况(可以看到由于我们Linux系统无法提供该程序所需的16g内存导致该程序无法成功运行被杀掉,可以使用【dmesg】命令查看被杀死程序的详细信息日志),如下图所示:
从上面的示例我们可以看到,其实Linux系统的内核会自己调度系统的内存资源进行处理,效果也是很好的,根本不用我们自己手动释放内存资源(特别是生产环境一般不建议自己手动释放资源和重启系统,这样造成的风险会比较高)。
三、swappiness
swappiness值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60。
请注意:swap交换内存性能远比不上物理内存,且过多使用swap反而会降低系统整体性能,这违背了创建swap交换内存的初衷。我们希望在物理内存即将到达满荷时再使用交换内存swap,因此swappiness的值建议范围在10-60的区间,而固态硬盘可以将这个值设置的偏高一些。
3.1、手动优化swap操作命令
#查看系统当前设置的swap值(值为60表示你的物理内存在使用到100-60=40%的时候,就开始使用swap交换了)
cat /proc/sys/vm/swappiness
#从操作系统层面来说,要尽可能使用物理内存(因为物理内存是比swap内存快很多的)我们这里临时设置物理内存到70%的时候才使用swap交换
sysctl vm.swappiness=30
#设置vm.swappiness=30永久生效,则需要修改/etc/sysctl.conf配置文件在这个配置文件末尾添加上【vm.swappiness = 30】系统重启后生效
vi /etc/sysctl.conf
3.2、手动删除swap文件命令
#1-先停用内存交换空间文件
swapoff /data/swapfile1
#2-再直接移除这个内存空间交换文件
rm -rf /data/swapfile1
#3-注释或直接删除掉之前在/etc/fstab文件里追加的开机自动挂载配置内容
#/data/swapfile1 swap swap defaults 0 0