Linux Page Cache参数调优

1. pdflush刷新脏数据条件

cached中的脏数据满足如下几个条件中一个或者多个的时候就会被pdflush刷新到磁盘

(1)数据存在的时间超过了dirty_expire_centisecs(默认300厘米秒,即30秒)时间

(2)脏数据所占内存 /(MemFree + Cached - Mapped) > dirty_background_ratio。也就是说当脏数据所占用的内存占(MemFree + Cached - Mapped)内存的内存的比例超过dirty_background_ratio(默认10,即系统内存的10%)的时候会触发pdflush刷新脏数据。

可以看出这两个参数是有联系的。比如把dirty_expire_centisecss设置较小,那么pdflush就会刷新脏数据的频率就会增加,这样就会使得脏数据所占总内存的比例不会达到dirty_background_ratio,从而使得dirty_background_ratio参数没有什么作用。相反,如果dirty_background_ratio参数设置很小同时dirty_expire_centisecs设置较大,可能在达到过期时间之前脏数据就被pdflush刷新到磁盘中。

2. 参数调优

2.1.查看Page Cache参数

sysctl -a|grep dirty

2.2.操作系统Page Cache默认值

vm.dirty_background_ratio=10
vm.dirty_ratio=20
vm.dirty_expire_centisecss=3000
vm.dirty_writeback_centisecs=500

2.3.如果系统的cached中脏数据量很大,会产生两个问题

(1)、缓存的数据越多,丢数据的风险越大。
(2)、会定期出现IO峰值,这个峰值时间会较长,在这期间所有新的写IO性能会很差(极端情况直接被hang住)。

后一个问题对写负载很高的应用会产生很大影响。

2.4.如何调节内核IO参数来优化IO写性能?

2.4.1.首先调优dirty_background_ratio

把这个参数适当调小,这样可以使得cached中的脏数据减少,把原来一个大的IO刷新操作变为多个小的IO刷新操作,从而把IO写峰值削平。对于cached很大或者磁盘很慢的场景,应该把这个值设置的小一点。

设置方法:sysctl -w vm.dirty_background_ratio=2

2.4.2.第二步调节dirty_ratio参数

把这个参数适当调小,原理通(1)类似。如果cached的脏数据所占比例(这里是占MemTotal的比例)超过这个设置,系统会停止所有的应用层的IO写操作,等待刷完数据后恢复IO。所以万一触发了系统的这个操作,对于用户来说影响非常大的。

设置方法:sysctl -w vm.dirty_ratio=40

2.4.3.第三步调节dirty_expire_centisecs参数(这个参数表示page cache中的数据多久标记为脏)

这个参数调节可能意义不大。调小这个参数并不保证可以很快的把脏数据刷新下去,因为这里会有个IO拥塞问题。如果在一个dirty_expire_centisecs周期内没有刷完脏数据就会导致这个参数失效了。理想情况我们希望一个dirty_expire_centisecs刷完脏数据,但如果cached的脏数据较多或者磁盘较慢的时候就会导致IO拥塞问题。一般使用默认值就好。

扫描二维码关注公众号,回复: 10971533 查看本文章

设置方法:sysctl -w vm.dirty_expire_centisecs=1000

2.4.4.第四步调节dirty_writeback_centisecs参数(这个参数调节pdflush被唤醒的频率)

理论上调小这个参数,可以提高pdflush工作频率,从而尽快把脏数据刷新到磁盘上。但是这一样会遇到第三步IO拥塞问题。所以这个参数效果也不尽如人意。一般使用默认值就好。

设置方法:sysctl -w vm.dirty_writeback_centisecs=500

3. Swapping调优

swap空间是一块磁盘空间,操作系统使用这块空间保存从内存中换出的操作系统不常用page数据,这样可以分配出更多的内存做page cache。这样通常会提升系统的吞吐量和IO性能,但同样会产生很多问题。页面频繁换入换出会产生IO读写、操作系统中断,这些都很影响系统的性能。这个值越大操作系统就会更加积极的使用swap空间。

3.1.调节swappniess方法如下:

cat /proc/sys/vm/swappniess查看这个参数的配置(默认值是60)

echo 0 >> /proc/sys/vm/swappniess 禁止操作系统使用任何的swap空间

echo 100 >> /proc/sys/vm/swappniess 操作系统会尽量使用swap空间

swappniess设置一个适当值对于系统性能也会有明显的影响。

swappniess很小时,系统能并发的进程或者线程就会减少,但每个进程或者线程运行的速度较快,cpu利用率较好。

swappniess很大时,系统并发好,但每个进程或者线程速度较慢。较多IO读写和系统中断会消耗很多cpu资源,此时系统效率较低。

所以如果希望提高服务器的并发量,对服务的相应时间要求不很高的场景可以适当的把swappniess调节的高些。对于并发量不大但希望相应时间小的应用场景可以适当的调小这个参数,比如个人电脑可以直接禁掉swap。

4.Linux Page Cache在Kafka中的应用优化

当前数据量:入流量20000亿/天,出流量45000亿/天;
硬件配置
集群规模:500个节点;
单节配置:

CPU 内存 硬盘 网络
40核 256GB 12*8TB机械硬盘 千兆网络

在这种海量数据集群中kafka读写压力非常大。
1、当vm.dirty_background_ratio参数设置较大时磁盘IO将出现固定的峰值,波动非常大。在写入高峰期及有较多消费延迟的情况下,磁盘IO被持续打满,topic分区出现大面积缺失副本情况;
2、随着vm.dirty_background_ratio参数设置变小,磁盘IO将变得越来越平滑,无大波动;
3、当vm.dirty_ratio参数设置叫小时(小于等于10%)数据写入将定期出现波谷,流量写入定期有掉坑现象。

经过压测环境进行压测及生产环境进行实践验证,得到了我们比较合理的参数值:
sysctl -w vm.dirty_background_ratio=1
sysctl -w vm.dirty_ratio=40
sysctl -2 vm.dirty_expire_centisecss=1000
经过上述参数的设置,我们的磁盘IO负责得到很好的缓解,kafka出入流量也变得更加平滑;

发布了12 篇原创文章 · 获赞 16 · 访问量 387

猜你喜欢

转载自blog.csdn.net/yangyijun1990/article/details/105341785