本篇介绍Linux服务器系统内存调优。
内存是影响Linux性能的主要因素之一,内存资源的充足与否直接影响应用系统的使用性能。内存调优的主要目标是合理分配和利用内存资源,减少内存浪费,提高内存利用率,从而提升系统整体性能。
1.内存相关重要命令及参数(不同版本略有区别,大家注意):
- uptime
功能:查看系统当前时间、运行时间、登录用户数和平均负载。
平均负载:显示系统在过去1、5和15分钟内的平均负载,有助于了解系统的负载情况。
- free
功能:查看内存使用的详细情况。
参数:
-k:以KB为单位显示内存的使用情况(默认);
-m:以MB为单位显示内存的使用情况;
-b:以byte为单位显示内存的使用情况;
-h:以GB为单位显示内存的使用情况(常用)。
输出内容:包括物理内存和交换空间的总量、已用量、空闲量和共享量等:
- /proc/meminfo
功能:查看buffer和cache的显示值,了解内存的使用情况:
buffer:缓冲,向磁盘中写入数据。
cache:缓存,向磁盘中读数据。 - vmstat(Virtual Memory Statistics)
功能:性能监控工具,显示关于系统各种资源之间相关性能的简要信息。
输出内容:包括进程、内存、交换分区、块设备I/O、系统、CPU等方面的信息:
参数:
-a:查看正在使用的内存量和一短时间内没有使用的内存量。
-f:获取当前服务器的forks数量。
-s:查看内存指标及系统事件信息。
-d:查看磁盘的统计信息。
-p:查看某一特定分区I/O信息。 - mpstat
功能:统计处理器的详细信息:
参数:
-P ALL:每秒钟打印一条所有CPU最新消息。
-I:展示中断处理情况。 - iostat(这个命令主要是磁盘性能监控的,但也和内存息息相关,所以在此一并介绍)
功能:监控磁盘使用情况。
输出内容:包括CPU使用情况、设备(磁盘)的I/O统计信息等:
经验总结:
–%idle值高,表示CPU较空闲。若%idle值高但系统响应慢,可能是CPU等待分配内存,此时应加大内存容量。
–%idle小于70,I/O压力较大。
–%idle值如果持续低于10,表明系统中最需要解决的资源是CPU。
–如果%util比较大,说明I/O请求太多,硬盘可能存在瓶颈。
–await大于svctm,差值越小,说明队列时间越短;反之差值越大,队列时间越长,说明系统出现了问题。
–avgqu-sz队列长度也可衡量I/O负荷,avgqu-sz是单位时间内的平均值。 - cachestat命令
功能:显示系统缓存的命中率等统计信息:
输出内容:
TOTAL:总的I/O次数。
MISSES:缓存未命中的次数。
HITS:缓存命中的次数。
DIRTIES:新增到缓存中的脏页数。
BUFFERS_MB:Buffers的大小(以MB为单位)。
CACHED_MB:Cache的大小(以MB为单位)。 - cachetop命令
功能:实时显示每个进程的缓存命中情况。
输出内容:
PID:进程ID。
UID:用户ID。
CMD:命令名。
HITS:缓存命中次数。
MISSES:缓存未命中次数。
DIRTIES:新增到缓存中的脏页数。
READ_HIT%:读缓存命中率。
WRITE_HIT%:写缓存命中率。
2.内核参数调整
- vm.swappiness:定义了系统将内存页交换到磁盘的倾向程度。值为 0 表示尽量不使用交换分区,值为 100 表示积极使用交换分区(控制交换空间(swap)的使用)。值越低表示系统越倾向于使用物理内存,而不是交换空间;值越高表示系统越倾向于使用交换空间。对于内存较大的服务器,可以将这个值设置得较低,比如 10以下,以减少对交换分区的依赖,提高性能。
–查看当前值:
cat /proc/sys/vm/swappiness
–设置swappiness:sudo sysctl vm.swappiness=[0,100]。
或者
–使用sysctl命令查看当前vm.swappiness的值:
sysctl vm.swappiness
–使用sysctl命令设置新的vm.swappiness值:sysctl -w vm.swappiness=新值,例如,设置为1:
sysctl -w vm.swappiness=1;
–为了使更改永久生效,可以将新的值添加到/etc/sysctl.conf文件中:echo “vm.swappiness=新值” >> /etc/sysctl.conf:
2. vm.vfs_cache_pressure:
控制内核回收目录项缓存和 inode 缓存的倾向程度。值较低时,内核倾向于保留缓存,以提高文件系统的访问速度;值较高时,内核会更积极地回收缓存,为其他内存需求让出空间。
查看当前值:cat /proc/sys/vm/vfs_cache_pressure。
设置值:sudo sysctl vm.vfs_cache_pressure=[新的值]。
3. vm.min_free_kbytes:
指定系统保留的最小空闲内存量。适当调整这个值可以确保系统在高负载时有足够的内存可用,避免内存耗尽。
查看当前值:cat /proc/sys/vm/min_free_kbytes。
设置值:sudo sysctl vm.min_free_kbytes=[新的值]。
4. dirty_background_ratio和vm.dirty_ratio=40
这两个参数也很关键,我自己就碰到过这两参数设置不当引起的服务器内存飙升问题,具体参见《基于Oracle DB的linux服务器性能调优》(博文地址:https://blog.csdn.net/qq_45732829/article/details/142098261),大家可以参考。
3. 大页内存(Huge Pages)和透明大页(Transparent Huge Pages)
很多人可能对大页内存(Huge Pages)和透明大页(Transparent Huge Pages)存在很多迷糊,尤其是是在数据库服务器和大型应用上,这个内容较多,下篇博文专题介绍。
4. 内存分配策略
–对于某些内存密集型应用,可以考虑调整内存分配器的策略。例如,使用glibc的malloc函数时,可以通过设置环境变量来调整分配策略:
MALLOC_ARENA_MAX:限制malloc使用的内存区域数量,避免过多的内存碎片;
MALLOC_MMAP_THRESHOLD:控制何时使用mmap进行内存分配,而不是从堆中分配。
–一些应用程序可能提供了特定的内存分配选项,可以根据应用程序的文档进行调整。
本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。