CPU のワークキューが hpsa ドライバーによって停止しているため、タスクがブロックされる
Environment
- Red Hat Enterprise Linux 6.5
- Red Hat Enterprise Linux 6.6
- 以下のパッケージに含まれるバージョン 3.4.4-1-RH1 または 3.4.4-1-RH2 の HP HPSA ドライバー
- kmod-hpsa-3.4.4_1_RH1-1.el6_5.x86_64
- kernel-2.6.32-504.el6.x86_64
- kernel-2.6.32-504.1.3.el6.x86_64
- kernel-2.6.32-504.3.3.el6.x86_64
- kernel-2.6.32-504.8.1.el6.x86_64
- kernel-2.6.32-504.12.2.el6.x86_64
- i686 32 ビットバージョンも影響を受ける可能性があります。
- Firmware のバージョンが 2.14、3.04、または 3.22 である HP Smart Array P220i または P420i
- オプションで hp-snmp-agents パッケージ (このパッケージを使用するとこの事象を早く引き起こします)
Issue
-
"INFO: task foo:666 blocked for more than 120 seconds." メッセージがコンソールまたはログに表示されます。
-
遅延した作業が完了するまで、タスクが停止します。
-
サーバーは、以下のメッセージでハングアップまたはパニックになります。
INFO: task sshd:6425 blocked for more than 120 seconds. Not tainted 2.6.32-431.11.2.el6.x86_64 #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. sshd D 000000000000000e 0 6425 6418 0x00000080 ffff88032926f768 0000000000000086 0000000000000000 0000000000000000 ffff88032926f848 ffffffff8105a924 ffff88032926f7e8 ffff88032926f758 ffff8803262625f8 ffff88032926ffd8 000000000000fbc8 ffff8803262625f8 Call Trace: [<ffffffff81528dd5>] schedule_timeout+0x215/0x2e0 [<ffffffff81528a53>] wait_for_common+0x123/0x180 [<ffffffff81528b6d>] wait_for_completion+0x1d/0x20 [<ffffffff81095927>] flush_work+0x77/0xc0 [<ffffffff81095b44>] flush_delayed_work+0x54/0x70 [<ffffffff8133b525>] tty_flush_to_ldisc+0x15/0x20 [<ffffffff81336197>] n_tty_poll+0x67/0x1d0 [<ffffffff81331cda>] tty_poll+0x8a/0xa0 [<ffffffff811a0c92>] do_select+0x392/0x6c0 [<ffffffff811a114a>] core_sys_select+0x18a/0x2c0 [<ffffffff811a14d7>] sys_select+0x47/0x110 [<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
または、
INFO: task mingetty:5371 blocked for more than 120 seconds. Not tainted 2.6.32-504.1.3.el6.x86_64 #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. mingetty D 0000000000000008 0 5371 1 0x00000080 ffff880439c81b88 0000000000000086 0000000000000000 ffff8804bc549087 ffff880439c81b78 ffffffff812966a0 0000002debbb7c24 0000000100000001 ffffffffffffffff 00000000fffe3a75 ffff88043a08b098 ffff880439c81fd8 Call Trace: [<ffffffff8152a8e5>] schedule_timeout+0x215/0x2e0 [<ffffffff8152a563>] wait_for_common+0x123/0x180 [<ffffffff8152a67d>] wait_for_completion+0x1d/0x20 [<ffffffff810983b1>] flush_cpu_workqueue+0x61/0x90 [<ffffffff81098e84>] flush_workqueue+0x54/0x80 [<ffffffff81098ec5>] flush_scheduled_work+0x15/0x20 [<ffffffff813383bc>] tty_ldisc_release+0x3c/0x90 [<ffffffff813326db>] tty_release_dev+0x40b/0x5e0 [<ffffffff813328ce>] tty_release+0x1e/0x30 [<ffffffff8118f8d5>] __fput+0xf5/0x210 [<ffffffff8118fa15>] fput+0x25/0x30 [<ffffffff8118ac6d>] filp_close+0x5d/0x90 [<ffffffff8118ad45>] sys_close+0xa5/0x100 [<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
Resolution
-
解決策
kernel-2.6.32-504.16.2.el6
は、エラータ RHSA-2015:0864 で入手できます。- この問題は、bugzilla BZ#1193639 (非公開) で対応していました。
-
回避方法
- Smart Array のファームウェアを 3.42 にアップデートするとこの問題を回避することが報告されています。その他のバージョンのファームウェア (3.54、4.68、5.42、6.00、6.34) でも問題が修正されることが報告されています。
- 以下の組み合わせを使用すると、この問題が発生しないことが報告されています。
HP Smart Array ファームウェア | HPSA ドライバー |
---|---|
2.14、3.04、3.22 | 3.4.0-1-RH1 |
3.42、3.54、4.68、5.42、6.00、6.34 | 3.4.0-1-RH1、3.4.4-1-RH1-1、3.4.4-1-RH2 |
Root Cause
hpsa ドライバーは 10 分でタイムアウトになるまでコントローラーの応答を待つため、CPU ワークキューをブロックします。これが発生すると、ワークキューが停止します。tty ワークが同じ CPU ワークキューにあるため、ハングアップしているタスクがあります。
以下は、kmod-hpsa ソースの抜粋です。
62 #define MAX_CONFIG_WAIT 30000
<...>
6439 static void hpsa_wait_for_clear_event_notify_ack(struct ctlr_info *h)
6440 {
6441 int i;
6442 u32 doorbell_value;
6443 unsigned long flags;
6444 /* wait until the clear_event_notify bit 6 is cleared by controller.*/
6445 for (i = 0; i < MAX_CONFIG_WAIT; i++) {
6446 spin_lock_irqsave(&h->lock, flags);
6447 doorbell_value = readl(h->vaddr + SA5_DOORBELL);
6448 spin_unlock_irqrestore(&h->lock, flags);
6449 if (!(doorbell_value & DOORBELL_CLEAR_EVENTS))
6450 break;
6451 /* delay and try again */
6452 msleep(20);
6453 }
6454 }
Diagnostic Steps
-
hpsa のバージョンを確認します。
$ modinfo hpsa | grep "^version:" version: 3.4.0-1-RH1
-
sosreport を収集します。
-
問題が発生したりハングアップしたときにカーネルからコアダンプを取得してください。
-
バックトレース
crash> bt sshd PID:6425 TASK: ffff880326262040 CPU:14 COMMAND:"sshd" #0 [ffff88032926f6a8] schedule at ffffffff81527ee2 #1 [ffff88032926f770] schedule_timeout at ffffffff81528dd5 #2 [ffff88032926f820] wait_for_common at ffffffff81528a53 #3 [ffff88032926f8b0] wait_for_completion at ffffffff81528b6d #4 [ffff88032926f8c0] flush_work at ffffffff81095927 #5 [ffff88032926f930] flush_delayed_work at ffffffff81095b44 #6 [ffff88032926f950] tty_flush_to_ldisc at ffffffff8133b525 #7 [ffff88032926f960] n_tty_poll at ffffffff81336197 #8 [ffff88032926f990] tty_poll at ffffffff81331cda #9 [ffff88032926f9d0] do_select at ffffffff811a0c92 #10 [ffff88032926fd70] core_sys_select at ffffffff811a114a #11 [ffff88032926ff10] sys_select at ffffffff811a14d7
-
tty_flush_to_ldisk は、ただ、tty->buf.work のキューに入った作業がすべて終了するのを待ちます。
void tty_flush_to_ldisc(struct tty_struct *tty) { flush_delayed_work(&tty->buf.work); }
-
cpu_workqueue_struct で関数またはスレッドを確認します。
crash> cpu_workqueue_struct 0xffff880032e19540 struct cpu_workqueue_struct { lock = { raw_lock = { slock = 1548770384 } }, worklist = { next = 0xffffffff81b1d6d0 <arp_tbl+240>, prev = 0xffff880336943290 }, more_work = { lock = { raw_lock = { slock = 905852414 } }, task_list = { next = 0xffff880032e19560, prev = 0xffff880032e19560 } }, current_work = 0xffff880339dec3e0, wq = 0xffff88063a50f400, thread = 0xffff88033acdf540 <<< }
-
cpu_workqueue_struct のスレッドを確認します。
crash> kmem 0xffff88033acdf540 CACHE NAME OBJSIZE ALLOCATED TOTAL SLABS SSIZE ffff88063c880140 task_struct 2656 1247 1323 441 8k SLAB MEMORY TOTAL ALLOCATED FREE ffff88033acde040 ffff88033acde080 3 3 0 FREE / [ALLOCATED] [ffff88033acdf540] PID:99 COMMAND:"events/0" TASK: ffff88033acdf540 [THREAD_INFO: ffff88033ace8000] CPU:0 STATE:TASK_UNINTERRUPTIBLE PAGE PHYSICAL MAPPING INDEX CNT FLAGS ffffea000b4dd0c8 33acdf000 0 0 0 40000000000080 slab
-
スレッドのバックトレース:
crash> bt 99 PID:99 TASK: ffff88033acdf540 CPU:0 COMMAND:"events/0" #0 [ffff88033ace9c00] schedule at ffffffff81527ee2 #1 [ffff88033ace9cc8] schedule_timeout at ffffffff81528d52 #2 [ffff88033ace9d78] schedule_timeout_uninterruptible at ffffffff81528ebe #3 [ffff88033ace9d88] msleep at ffffffff81086380 #4 [ffff88033ace9d98] hpsa_wait_for_clear_event_notify_ack at ffffffffa003668d [hpsa] #5 [ffff88033ace9dc8] hpsa_monitor_ctlr_worker at ffffffffa003ee42 [hpsa] #6 [ffff88033ace9e38] worker_thread at ffffffff81094d10 #7 [ffff88033ace9ee8] kthread at ffffffff8109aee6 #8 [ffff88033ace9f48] kernel_thread at ffffffff8100c20a
-
したがって、hpsa_wait_for_clear_event_notify_ack で hpsa によってブロックされています。
-
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments