报错信息如下:
Dec 8 20:12:43 dzyx-DataNode1 kernel: Tainted: G --------------- T 2.6.32-431.20.3.el6.x86_64 #1
Dec 8 20:12:43 dzyx-DataNode1 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Dec 8 20:12:43 dzyx-DataNode1 kernel: java D 0000000000000017 0 4929 3801 0x00000000
Dec 8 20:12:43 dzyx-DataNode1 kernel: ffff881059633cf0 0000000000000082 0000000000000000 0000000159633ca8
Dec 8 20:12:43 dzyx-DataNode1 kernel: ffffffff81ed63d8 0000010000000005 ffff881059633f38 ffffffff6ed16000
Dec 8 20:12:43 dzyx-DataNode1 kernel: ffff881059fdc638 ffff881059633fd8 000000000000fbc8 ffff881059fdc638
Dec 8 20:12:43 dzyx-DataNode1 kernel: Call Trace:
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff8152aea5>] rwsem_down_failed_common+0x95/0x1d0
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff8152b036>] rwsem_down_read_failed+0x26/0x30
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff8128f1e4>] call_rwsem_down_read_failed+0x14/0x30
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff8152a534>] ? down_read+0x24/0x30
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff8104a92e>] __do_page_fault+0x18e/0x480
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff810097cc>] ? __switch_to+0x1ac/0x320
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff8100bb8e>] ? apic_timer_interrupt+0xe/0x20
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff8152e37e>] do_page_fault+0x3e/0xa0
Dec 8 20:12:43 dzyx-DataNode1 kernel: [<ffffffff8152b735>] page_fault+0x25/0x30
Dec 8 20:12:43 dzyx-DataNode1 kernel: INFO: task java:23818 blocked for more than 120 seconds.
日志分析和解决办法:
系统默认可用内存作为文件系统缓存,当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘,导致后续的IO请求都是同步的。
对内核参数调优,解决办法如下:
vim /etc/sysctl.conf
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
这个vm.dirty_background_ratio值达到后触发flush进程进行异步的回写操作,此时应用进程仍可写,如果多个应用进程写入的量大于flush进程刷出的量那自然会达到vm.dirty_ratio的值,此时OS系统会转入同步地处理脏页的过程,阻塞应用进程。
网友评论