关于内存配置相关内核参数的再学习

发布时间 2023-05-23 06:38:03作者: 济南小老虎

关于内存配置相关内核参数的再学习


摘要

上周一台192G内存的跑着重型拆分微服务的服务器宕机了.
服务器上面还有一套30个pdb的Oracle数据库. 

实际原因是因为内存耗尽. 导致机器无响应.
控制台没有任何反馈. 没办法的情况下进行了重启操作. 

当时没有进行彻查. 今天有同事反馈这台服务器上面的消息队列出现异常
怀疑跟上次宕机有关系, 但是实际上.消息队列服务器不在同一台机器上面.

但是为了自证清白, 想着将宕机问题给梳理一下. 

涉及到的内存参数

vm.swappiness
vm.min_free_kbytes 
vm.vfs_cache_pressure
vm.dirty_ratio
vm.dirty_background_ratio 
vm.dirty_expire_centisecs
vm.dirty_writeback_centisecs

本次学习参考了比较多的文档主要有如下几个:
https://www.modb.pro/db/34028
https://blog.csdn.net/weixin_35974217/article/details/116740461
https://blog.csdn.net/weixin_39472686/article/details/124707607

参数说明-1

vm.swappiness :
swappiness参数是将数据从RAM交换到swap空间的频率。
这是一个介于0和100之间的值,代表一个百分比。

!! 如果值接近 0,除非绝对必要,否则内核不会将数据交换到硬盘。

记住,与swap文件的交互是“昂贵的”,因为它们比与RAM的交互花费的时间要长得多,并且会导致性能显著降低。
告诉系统不要太依赖swap通常会使系统更快。

!! 如果接近100的值将尝试将更多数据放入swap,以保持更多的RAM空间。

根据应用程序的内存配置文件或服务器的用途,在某些情况下这可能会更好。

应用服务器其实可以关闭swap 执行swpaoff -a 的命令.
数据库服务器不建议如此操作, 如果当时数据库crash, 会出现灾难性的问题. 

参数说明-2

vm.min_free_kbytes
表示强制Linux VM最低保留多少空闲内存
当可用内存低于这个参数时,系统开始回收cache内存,以释放内存,直到可用内存大于这个值
注意单位是 KB

vm.vfs_cache_pressure
该文件表示内核回收用于directory和inode cache内存的倾向;

缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;
降低该值低于100,将导致内核倾向于保留directory和inode cache;
增加该值超过100,将导致内核倾向于回收directory和inode cache。

建议给机器保留最较大的最小可用内存.
并且建议适当改大这个数值. 保证内存可以有合理的使用期间, 避免被缓存占用. 
# 注意服务器比较大可以等比例扩大, 我暂时写一个5G
# 因为我们这边对稳定性要求高于RT,所以我把数值改大.

参数说明-3

vm.dirty_background_ratio 
当cached中缓存当数据占总内存的比例达到这个参数设定的值时将触发刷磁盘操作。
把这个参数适当调小,这样可以把原来一个大的IO刷盘操作变为多个小的IO刷盘操作,从而把IO写峰值削平。

对于内存很大和磁盘性能比较差的服务器,应该把这个值设置的小一点。

vm.dirty_ratio
如果cached的数据所占比例(这里是占总内存的比例)超过这个设置,
系统会停止所有的应用层的IO写操作,等待刷完数据后恢复IO。
所以万一触发了系统的这个操作,对于用户来说影响非常大的。

对于写压力特别大的,建议把这个参数适当调大;对于写压力小的可以适当调小;

因为我这边机器的IO都很垃圾, 我把参数修改为默认值的一半. 如果IO很好,并且有BBU,可以适当改大. 

参数说明-4

vm.dirty_expire_centisecs
这个参数会和参数vm.dirty_background_ratio一起来作用,
一个表示大小比例,一个表示时间;
即满足其中任何一个的条件都达到刷盘的条件。
跟Redis的 save方式是一样的, 量或者是时间有一个打到就可以进行刷盘处理. 
单位是 1/100 秒. 默认值是30秒

vm.dirty_writeback_centisecs
理论上调小这个参数,可以提高刷磁盘的频率,从而尽快把脏数据刷新到磁盘上。
但一定要保证间隔时间内一定可以让数据刷盘完成。
默认值是 5 秒. 理论上可以改短. 保证数据安全. 根据性能来单独确定. 

理论上改小了 可以实现削峰填谷. 对整天的吞吐量有一定的好处. 
但是如果是经常突发流量请求. 可能表现不如持久均衡的流量来的好.
任何决策都是需要均衡的. 

某些情况下的最佳实践

sysctl -w vm.swappiness=10
sysctl -w vm.min_free_kybtes=5,242,880
sysctl -w vm.vfs_cache_pressure=200
sysctl -w vm.dirty_background_ratio=5
sysctl -w vm.dirty_ratio=10
sysctl -w vm.dirty_expire_centisecs=1500
sysctl -w vm.dirty_writeback_centisecs=300