Назад | Перейти на главную страницу

Анализ сбоев ядра Linux. Заблокированные процессы, ввод-вывод и непрерывное ожидание

У меня есть многопользовательское приложение ERP, работающее на платформе CentOS 5.5. Оборудование - HP ProLiant DL380 G6. В прошлом году это была стабильная система, но за последнюю неделю возникли проблемы. Проблема заключается в постепенном повышении нагрузки на систему в течение нескольких часов до уровня 60+. Система остается отзывчивой, но в какой-то момент срабатывает сторожевой таймер HP ASR и перезагружает сервер.

У меня есть много таких систем, но раньше у меня не было этой конкретной проблемы. Сбой произошел четыре раза за последнюю неделю, но я смог поймать его сегодня утром, прежде чем система полностью перестала отвечать на запросы.

На этот раз я обнаружил, что загрузка системы составляет около 75, но было 14 зомби-процессов, которые я не мог убить. PPID равнялся 1, поэтому я знал, что перезагрузка будет правильной. Интересно, что ниже приводится отрывок из вывода dmesg, в котором содержатся сообщения, которых я не видел в предыдущих сбоях. Что означают эти записи? PID соответствуют зомби-процессам, которых я не мог убить. in.telnetd это демон Telnet для конкретного сеанса пользователя и dbc - это экземпляр приложения ERP для каждого пользователя.

INFO: task in.telnetd:12210 blocked for more than 600 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
in.telnetd    D ffff81000102e4a0     0 12210   8899         16297 12762 (L-TLB)
 ffff8103848d7d38 0000000000000046 ffff8108272c1738 ffff81082328ae80
 ffff81082644d9c0 0000000000000009 ffff8102d8d7a080 ffff81011c9df100
 00011ef007c2d74b 0000000000002358 ffff8102d8d7a268 0000000500000001
Call Trace:
 [<ffffffff80063c6f>] __mutex_lock_slowpath+0x60/0x9b
 [<ffffffff8003db0d>] lock_timer_base+0x1b/0x3c
 [<ffffffff80063cb9>] .text.lock.mutex+0xf/0x14
 [<ffffffff8009dc66>] flush_workqueue+0x3f/0x87
 [<ffffffff801a96ee>] release_dev+0x503/0x67b
 [<ffffffff800646f9>] __down_failed+0x35/0x3a
 [<ffffffff80225b40>] sock_destroy_inode+0x0/0x10
 [<ffffffff800537af>] tty_release+0x11/0x1a
 [<ffffffff80012ad9>] __fput+0xd3/0x1bd
 [<ffffffff80023c39>] filp_close+0x5c/0x64
 [<ffffffff80038f19>] put_files_struct+0x63/0xae
 [<ffffffff80015860>] do_exit+0x31c/0x911
 [<ffffffff800491a7>] cpuset_exit+0x0/0x88
 [<ffffffff8005d116>] system_call+0x7e/0x83


INFO: task dbc:9054 blocked for more than 600 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
dbc           D ffff810001036b20     0  9054      1          3272  1795 (L-TLB)
 ffff81028e0c3d38 0000000000000046 0000000000000000 00000000000001d0
 0000000000000000 0000000000000009 ffff8107d60ff100 ffff81011c9ed080
 00011edea224420a 00000000000ebaee ffff8107d60ff2e8 0000000600000000
Call Trace:
 [<ffffffff80063c6f>] __mutex_lock_slowpath+0x60/0x9b
 [<ffffffff8003db0d>] lock_timer_base+0x1b/0x3c
 [<ffffffff80063cb9>] .text.lock.mutex+0xf/0x14
 [<ffffffff8009dc66>] flush_workqueue+0x3f/0x87
 [<ffffffff801a96ee>] release_dev+0x503/0x67b
 [<ffffffff8837dd1d>] :xfs:xfs_free_eofblocks+0x9d/0x1fe
 [<ffffffff800537af>] tty_release+0x11/0x1a
 [<ffffffff80012ad9>] __fput+0xd3/0x1bd
 [<ffffffff80023c39>] filp_close+0x5c/0x64
 [<ffffffff80038f19>] put_files_struct+0x63/0xae
 [<ffffffff80015860>] do_exit+0x31c/0x911
 [<ffffffff800491a7>] cpuset_exit+0x0/0x88
 [<ffffffff8006149d>] sysenter_do_call+0x1e/0x76

Эти сообщения означают, что что-то использует все доступные операции ввода-вывода. Это происходит либо из-за (а) сбоя оборудования (диск / контроллер / и т.д.), что приводит к тому, что доступный ввод / вывод равен 0, либо (б) процесс (или процессы) используют весь ввод / вывод.

Виновный процесс не может быть указан в dmesg. Это была жертва.

Поскольку я сомневаюсь, что in.telnetd (в сторону: зачем вам когда-либо работал telnetd?), Касается / data, и у вас есть другие системы, которые не испытывают этой проблемы, я предполагаю, что c0d0 плохой или прошивку необходимо обновить.

Запустите на нем программу HP Insight Diagnostics. В противном случае в следующий раз, когда это произойдет, посмотрите, можете ли вы запустить iostat, чтобы проверить, действительно ли диск перегружен.