关于I/O阻塞导致内核hang_task分析
- 问题表象
ssh远程登陆系统失败,本地登陆后,输入系统指令,响应慢。
- 问题分析
经分析可以肯定的是i/o繁忙导致的
- 查看io繁忙的进程
- 经诊断为Oracel rman备份进程
- 问题处理过程
3.1 禁用120s超时消息
echo 0 > /proc/sys/kernel/hung_task_timeout_secs"
3.2. 调小缓存
sysctl -w vm.dirty_background_ratio=5
sysctl -w vm.dirty_ratio=10
- 问题总结
关于内核hang住,导致ssh登录失败,系统响应缓慢。是由io阻塞应用程序导致的。
默认情况下, Linux会最多使用40%的可用内存作为文件系统缓存。当超过这个阈值后,文件系统会把将缓存中的数据全部写入磁盘,导致后续的IO请求都是同步的。将缓存写入磁盘时,有一个默认120秒的超时时间。
出现上面的问题的原因是IO子系统的处理速度不够快,不能在120秒将缓存中的数据全部写入磁盘。IO系统响应缓慢,导致越来越多的请求堆积,导致系统失去响应。
参数说明
vm.dirty_background_ratio:
当文件缓存中脏数据到到vm.dirty_background_ratio设定的阀值,启动pdflush/flush/kdmflush进程将脏数据写入磁盘,
vm.dirty_ratio:
当文件缓存中脏数据到到vm.dirty_background_ratio设定的阀值后,所有新的I/O块都会被阻塞,直到脏页被写入磁盘。
观察当前系统等待写盘的脏页数数量:74页
cat /proc/vmstat |egrep "dirty|writeback"