1、问题描述
 linux系统,输入dmesg -T,报“INFO: task java:xxx blocked for more than 120 seconds.”,如下

 一般情况下,linux会把可用内存的40%的空间作为文件系统的缓存。当缓存快满时,文件系统将缓存中的数据整体同步到磁盘中。但是系统对同步时间有最大120秒的限制。如果文件系统不能在时间限制之内完成数据同步,则会发生上述的错误。这通常发生在内存很大的系统上。系统内存大,则缓冲区大,同步数据所需要的时间就越长,超时的概率就越大。
 2、解决办法
 降低缓存占内存的比例,比如由40%降到10%,这样的话需要同步到磁盘上的数据量会变小,IO写时间缩短,会相对比较平稳。
 文件系统缓存的大小是由内核参数vm.dirty_ratio和vm.dirty_backgroud_ratio控制决定的。
 vm.dirty_background_ratio指定当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发后台回写进程运行,将一定缓存的脏页异步地刷入外存。
 vm.dirty_ratio则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存),在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。
 通常情况下,vm.dirty_ratio的值要大于vm.dirty_background_ratio的值。
 1)修改/etc/sysctl.conf,添加两行代码,如下
 vm.dirty_background_ratio=5
 vm.dirty_ratio=10

 2)重启系统
 3)查看
 sysctl -a | grep dirty




















