```
系统版本: CentOS Linux release 7.4.1708 (Core) 内核: 3.10.0-957.5.1.el7.x86_64 ``` ### 故障详情 前一个小时有内存使用率高告警, 然后服务器平均负载急剧升高, 出现业务应用响应慢, ssh连不上问题。 控制台报: echo 0 > /proc/sys/kernel/hung_task_timeout_secs 服务器重启后, 业务应用恢复。 ### 故障分析 日志中有多次报 “echo 0 > /proc/sys/kernel/hung_task_timeout_secs” , 这个报错是因为 文件系统缓存问题, 默认情况下Linux会把可用内存的40%作为文件系统缓存使用, 这部分缓存一旦用满, 文件系统会立刻将缓存的内存刷新到磁盘, 但是这里的刷新并非移动而是复制, 复制完成后这部分空间才会释放, 这就导致后续的IO请求都是同步的, 而它复制的时候有120s的超时时间。 如果IO系统响应慢, 没能在120s内将缓存写入磁盘, 就会出现echo 0 > /proc/sys/kernel/hung_task_timeout_secs, 同时也会导致越来越多的请求堆积在内存, 最终导致系统内存被全部占用, 系统宕机。尤其是在大内存的机器上, 这种情况尤为明显。 **结合监控数据, 也从侧面印证了这一点:** 九点半左右磁盘读写量有明显升高 IO耗时也相应增加 逻辑CPU64核, 平均负载却到了100左右, 推测也是上面io wait的问题。 ### 调优 出现阻塞问题的直接原因是缓存满了, 大量的缓存数据要写入外存, 导致IO性能大量消耗, 那么要缓解这种情况, 我们可以从两个方面进行调优: 1. 减少缓存的数据量, 避免刷写超时 2. 加快缓存的更新, 避免缓存堆积, 以处理更多的IO 可以使用这四个参数配置: **vm.dirty_background_ratio:** 内存可以填充“脏数据”的百分比, 脏页数量达到后就会触发pdflush/flush/kdmflush等后台回写进程,将一定缓存的脏页**异步**地写入外存。 **vm.dirty_ratio:** 绝对的脏数据限制, 如果内存中的脏页数量超过了这个值, 将强制刷新到外存, 这个过程是**同步**的, 也就是新的IO请求会被**阻塞**, 直到刷新完。 **vm.dirty_expire_centisecs:** 脏数据的存活时间, 默认30s, 当pdflush/flush/kdmflush等回收进程启动后, 会检查是否有数据超过了这个时间, 如果有就把它**异步**的写入外存。 **vm.dirty_writeback_centisecs:** 指定多长时间 pdflush/flush/kdmflush 这些进程运行一次。 > **vm.dirty_background_ratio**与**vm.dirty_ratio**都是可以脏数据可以使用的内存的百分比, 其区别在于回写方式, 一个异步一个同步。建议**vm.dirty_ratio** > **vm.dirty_background_ratio** #### 配置方式: ```#临时修改: sysctl -w vm.dirty_ratio=10 sysctl -w vm.dirty_background_ratio=5 sysctl -p #永久修改: vi /etc/sysctl.conf vm.dirty_background_ratio = 5 vm.dirty_ratio = 10 sysctl -p #查看: cat /proc/sys/vm/dirty_background_ratio cat /proc/sys/vm/dirty_ratio cat /proc/sys/vm/dirty_expire_centisecs cat /proc/sys/vm/dirty_writeback_centisecs ```
https://www.hugbg.com/archives/3547.html
评论