脏页刷盘策略,导致应用写日志阻塞,响应时间变长

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zqz_zqz/article/details/82847005

今天大数据组的同学与测试组的同学对系统做压测,发现qps怎么也上不去,于是去帮忙看了一下;

根据统计,发现接口响应时间不稳定,时好时坏,好的时候几十毫秒,不好的时候好几秒,差别非常大,而且几次压测完成后,最后的一些请求时间全都是两三秒的样子;于是使用greys去定位了一下相应慢的代码,发现竟然是写日志操作,难道是日志打印太多了,系统写日志将IO打满了?于是又重新做了一轮压测,压测的同时使用iostat命令监控系统的io状况,然后就问题了,通过iostat发现,连续几秒钟基本没有什么IO操作,然后突然出现几秒钟的IO的写操作将IO打满,整个压测过程中都是这样;

这就解释清楚了为什么压测时有时候请求响应时间只需要几十毫秒,有时候连续的好多请求响应时间要好几秒,好几秒的情况是系统刷盘,将IO写操作阻塞了;被阻塞的请求要等待刷盘结束后才能继续执行;

我们的写操作通常不会直接写入硬盘,而是先写入到内存的cache中,当dirty页到达一定数量的时候才会执行写盘操作,那么何时会往硬盘上写呢?其中两个参数非常重要:

这里有两个相关的参数控制着脏页的刷盘策略,通过sysctl -a

[root@VM_0_6_centos ~]# sysctl -a| grep vm.dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500

vm.dirty_background_ratio = 10

当文件系统缓存脏页数量达到系统内存10%时就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入硬盘;

vm.dirty_ratio = 30

当文件系统缓存脏页数量达到系统内存30%时,系统开始同步的将缓存脏页刷入硬盘,同时会阻塞其他进程的写操作;

10与30这两个值是系统默认值,这也就解释清楚了为什么通过iostat观察到io操作一会有,一会没有,同时应用请求时而请求时间非常短,时而请求时间变成了好几秒的情况,因为系统脏页超过30%,所有写日志的io操作被阻塞了;这里的两个值是百分比,所以要根据内存的大小设置一个合理的值;

猜你喜欢

转载自blog.csdn.net/zqz_zqz/article/details/82847005