Есть ли решение для блокировки XFS в Linux?

Очевидно, существует известная проблема блокировки XFS ядра / процессов и повреждения томов в условиях интенсивного трафика. Об этом говорят некоторые веб-страницы, но я не смог выяснить, какие страницы являются новыми и могут иметь решение.

У моей компании есть Debian с ядром 3.4.107, xfsprogs 3.1.4 и большими массивами хранения. У нас есть большие данные (PB) и высокая пропускная способность (ГБ / с) с использованием асинхронного ввода-вывода для нескольких больших томов. Мы постоянно испытываем эти непредсказуемые блокировки в нескольких системах. Журналы ядра /dmesg показывают что-то вроде следующего:

2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986515] INFO: task Sr2dReceiver-5:46829 blocked for more than 120 seconds.
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986518] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986520] Sr2dReceiver-5  D ffffffff8105b39e     0 46829   7284 0x00000000
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986524]  ffff881e71f57b38 0000000000000082 000000000000000b ffff884066763180
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986529]  0000000000000000 ffff884066763180 0000000000011180 0000000000011180
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986532]  ffff881e71f57fd8 ffff881e71f56000 0000000000011180 ffff881e71f56000
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986536] Call Trace:
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986545]  [<ffffffff814ffe9f>] schedule+0x64/0x66
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986548]  [<ffffffff815005f3>] rwsem_down_failed_common+0xdb/0x10d
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986551]  [<ffffffff81500638>] rwsem_down_write_failed+0x13/0x15
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986555]  [<ffffffff8126b583>] call_rwsem_down_write_failed+0x13/0x20
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986558]  [<ffffffff814ff320>] ? down_write+0x25/0x27
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986572]  [<ffffffffa01f29e0>] xfs_ilock+0xbc/0x12e [xfs]
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986580]  [<ffffffffa01eec71>] xfs_rw_ilock+0x2c/0x33 [xfs]
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986586]  [<ffffffffa01eec71>] ? xfs_rw_ilock+0x2c/0x33 [xfs]
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986593]  [<ffffffffa01ef234>] xfs_file_aio_write_checks+0x41/0xfe [xfs]
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986600]  [<ffffffffa01ef358>] xfs_file_buffered_aio_write+0x67/0x179 [xfs]
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986603]  [<ffffffff8150099a>] ? _raw_spin_unlock_irqrestore+0x30/0x3d
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986611]  [<ffffffffa01ef81d>] xfs_file_aio_write+0x163/0x1b5 [xfs]
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986614]  [<ffffffff8106f1af>] ? futex_wait+0x22c/0x244
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986619]  [<ffffffff8110038e>] do_sync_write+0xd9/0x116
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986622]  [<ffffffff8150095f>] ? _raw_spin_unlock+0x26/0x31
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986634]  [<ffffffff8106f2f1>] ? futex_wake+0xe8/0xfa
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986637]  [<ffffffff81100d1d>] vfs_write+0xae/0x10a
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986639]  [<ffffffff811015b3>] ? fget_light+0xb0/0xbf
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986642]  [<ffffffff81100dd3>] sys_pwrite64+0x5a/0x79
2016 Mar 24 04:42:34 hmtmzhbgb01-ssu-1 kernel: [2358750.986645]  [<ffffffff81506912>] system_call_fastpath+0x16/0x1b

Блокировки оставляют систему в плохом состоянии. Процессы в состоянии D, которые зависают, даже не могут быть прерваны сигналом 9. Единственный способ возобновить операции - это перезагрузить компьютер, восстановить XFS, а затем система будет работать еще некоторое время. Но иногда после блокировки мы не можем даже восстановить некоторые тома, так как они полностью повреждены, и нам нужно восстановить их с помощью mkfs.

В качестве последнего средства мы теперь периодически запускаем xfs-repair, и это в некоторой степени снижает частоту блокировок и потери данных. Но инциденты все еще происходят достаточно часто, поэтому нам нужно какое-то решение.

Мне было интересно, есть ли решение для этого с ядром 3.4.107, например, какой-нибудь патч, который мы можем применить. Из-за большого количества развертываний и других проблем с программным обеспечением мы не сможем обновить ядро ​​в ближайшем будущем.

Однако мы работаем над обновлением наших приложений, чтобы мы могли работать на ядре 3.16 в наших следующих выпусках. Кто-нибудь знает, была ли эта проблема блокировки XFS была исправлена ​​в 3.16?

2 ответа

Кто-нибудь знает, была ли эта проблема блокировки XFS была исправлена ​​в 3.16?

Об этом говорится в Кратком руководстве по отладке ядра:

Поиск "xfs splice deadlock" приводит к появлению в 2011 году цепочки писем, в которой описана эта проблема. Однако разделение репозитория исходного кода ядра показывает, что ошибка не была устранена до апреля 2014 г. (8d02076) для выпуска в Linux 3.16.

Некоторые люди сталкивались с этим, но это не было проблемой с XFS, потому что ядро ​​не могло сбрасывать грязные страницы в течение периода 120 с. Посмотрите здесь, но, пожалуйста, проверьте номера, которые они используют по умолчанию в вашей собственной системе.

http://blog.ronnyegner-consulting.de/2011/10/13/info-task-blocked-for-more-than-120-seconds/

и здесь

http://www.blackmoreops.com/2014/09/22/linux-kernel-panic-issue-fix-hung_task_timeout_secs-blocked-120-seconds-problem/

Вы можете увидеть, что вы грязный коэффициент кэша, запустив этот

sysctl -a | grep dirty

или же

cat /proc/sys/vm/dirty_ratio

Лучшее, что я могу найти, можно найти здесь...

https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

По сути, вам необходимо настроить приложение так, чтобы оно могло записывать грязные буферы на диск в течение определенного периода времени или изменять период таймера и т. Д.

Вы также можете увидеть некоторые интересные параметры следующим образом

sysctl -a | grep hung

Вы можете увеличить время ожидания постоянно, используя /etc/sysctl.conf следующее...

kernel.hung_task_timeout_secs = 300
Другие вопросы по тегам