摘要:今天有台服务器的应用没有响应,SSH远程也无法登录。通过控制台界面查看该Linux系统,出现多个错误信息echo 0 /proc/sys/kernel/hung_task_timeout,初步断定系统hung住了。
本文将呈现本初问题的解决过程,详细内容请参考下文。
一、出现问题
1、错误信息
2、问题状况
系统中的缓存数据过大导致系统中的应用无法访问,SSH远程登录不成功。
二、分析问题
说明:文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。
当然,也存在缓存被写爆的情况。还可能出现一次性往磁盘写入过多数据,以致使系统卡顿。这些卡顿是因为系统认为,缓存太大用异步的方式来不及把它们都写进磁盘,于是切换到同步的方式写入。
1、默认情况下, Linux会最多使用40%的可用内存作为文件系统缓存。当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘,导致后续的IO请求都是同步的。
将缓存写入磁盘时,有一个默认120秒的超时时间。 出现上面的问题的原因是IO子系统的处理速度不够快,不能在120秒将缓存中的数据全部写入磁盘。IO系统响应缓慢,导致越来越多的请求堆积,最终系统内存全部被占用,导致系统失去响应。
2、初步认为应该是内存的清理机制出问题,优化处理。
三、解决问题
1、根据应用程序实际情况,由于服务器上所运行的应用都是需要短时间响应大量的访问,因此需要对vm.dirty_ratio,vm.dirty_background_ratio两个参数进行调优设置。增加方框内的两项内容:
2、需要说明的是,先达到vm.dirty_background_ratio的条件然后触发flush进程进行异步的回写操作,但是这一过程中应用进程仍然可以进行写操作,如果多个应用进程写入的量大于flush进程刷出的量那自然会达到vm.dirty_ratio这个参数所设定的坎,此时操作系统会转入同步地处理脏页的过程,阻塞应用进程。
3、通过修改/etc/sysctl.conf文件使得系统配置永久生效。
首先执行指令# cp /etc/sysctl.conf /etc/sysctl.conf20230317备份sysctl.conf文件。
然后执行指令# vim /etc/sysctl.conf 在后面加入以下两行。
vm.dirty_background_ratio=5
vm.dirty_ratio=10
最后reboot重启系统生效。