
Я нахожусь в процессе миграции данных в разделы LUKS. Теперь, когда диск операционной системы работает от LUKS, я попытался начать миграцию дисков с данными. Затем сервер перестал отвечать.
Это устройство LUKS было открыто:
cryptsetup luksOpen /dev/sdc data1
И любая из этих команд душила сервер:
pv /dev/zero > /dev/mapper/data1
pv /dev/zero > /dev/sdc
Не сразу, но в течение нескольких секунд сервер стал невыносимо медленным. Все заблокировано на I/O:
root@node51 [~]# ps aux | awk '{if($8~"D"||$8=="STAT"){print $0}}'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1197 0.0 0.0 0 0 ? D 06:39 0:00 [jbd2/dm-1-8]
root 1687 0.1 0.0 0 0 ? D 11:15 0:12 [kworker/u96:5]
root 13057 2.0 0.0 0 0 ? D 13:10 0:01 [dmcrypt_write]
root 13644 10.9 0.0 7452 784 pts/1 D+ 13:10 0:08 pv /dev/zero
root 14159 0.0 0.0 98256 6836 ? DNs 13:10 0:00 sshd: root [priv]
root 14772 0.0 0.0 29008 92 ? D 13:11 0:00 /usr/sbin/CRON -f
root 14773 0.0 0.0 98256 6748 ? DNs 13:11 0:00 sshd: root [priv]
root 15411 0.0 0.0 98256 6876 ? DNs 13:11 0:00 sshd: root [priv]
root 16009 0.1 0.0 98256 6840 ? DNs 13:11 0:00 sshd: root [priv]
root 16632 0.5 0.0 98256 6892 ? DNs 13:11 0:00 sshd: root [priv]
root 16900 0.0 0.0 5448 356 pts/3 D+ 13:11 0:00 awk {if($8~"D"||$8=="STAT"){print $0}}
root 28553 0.6 0.0 0 0 ? D 12:12 0:21 [txg_sync]
Примечательно, что в течение примерно двух секунд pv
сообщалось, что копирование данных происходит со скоростью более 2GiB/s
. Это как кэш обратной записи, так и заполнение грязных страниц (обнаружено мониторингом /proc/meminfo
).
После этого pv
зафиксировал нормальную 200MiB/s
скорость записи, но все еще имел преимущество между 2GiB
и 3GiB
в кэше обратной записи.
Средняя нагрузка на сервер превысила 10,00 из-за всех блокировок ввода-вывода.
Прерывание теста записи занимает некоторое время, pv
поскольку необходимо очистить кэш обратной записи, но сразу после прерывания теста производительность сервера возвращается к норме.
Интересно, что эти команды не вызывают задержек сервера:
# Reads from dm-crypt block device
pv /dev/mapper/data1 > /dev/zero
# Reads from the raw block device
pv /dev/sdc > /dev/zero
# Writes to a control disk of a different model
pv /dev/zero > /dev/sdi
# Reads from a control disk
pv /dev/sdi > /dev/zero
# Writes to a file on a dm-crypt ext4 filesystem on a solid-state drive
pv /dev/zero > /tmp/empty
# Reads from that same solid-state drive
pv /dev/sda > /dev/zero
У меня есть следующие вопросы:
- Почему непрерывные последовательные записи на этот диск данных так сильно замедляют работу сервера?
- Как избежать перегрузки других дисков при записи на определенный диск или несколько?
- Почему этот тип жесткого диска вызывает проблемы с производительностью, а другие — нет?
Мне нужно зашифровать шесть дисков одной модели ( /dev/sdc
, /dev/sdd
, /dev/sde
, /dev/sdf
, /dev/sdg
и /dev/sdh
), и в будущем на них будут выполняться последовательные рабочие нагрузки по записи, поэтому я не хочу, чтобы сервер остановился из-за этой проблемы.
Дополнительная информация
Краткие факты
Сервер: Dell PowerEdge T320
Ядро: Linux node51 4.4.0-22-generic #39-Ubuntu SMP Thu May 5 16:53:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Операционная система: Ubuntu Server 16.04 LTS Xenial Xerus 64-бит
Проблемный жесткий диск: Тошиба PH3500U-1I72
У меня есть шесть таких дисков, все из которых, как известно, исправны, и я протестировал два из них и обнаружил падение производительности ввода-вывода на уровне сервера с обоими. Они читают и пишут почти в 200MiB/s
начале.
Контрольный (без проблем) жесткий диск: Samsung SP1614C
Этот диск имеет постоянную скорость записи 50MiB/s
. Может ли быть, что проблемный диск слишком быстрый?
Контроллер диска: Dell PERC H310
К этому контроллеру подключены два твердотельных накопителя и шесть проблемных жестких дисков, все они напрямую передаются как AHCI. Управляющий диск подключен к порту SATA, встроенному в материнскую плату.
Планировщики ввода-вывода
root@node51 [/tmp]# tail -n +1 /sys/block/sd*/queue/scheduler
==> /sys/block/sda/queue/scheduler <==
noop [deadline] cfq
==> /sys/block/sdb/queue/scheduler <==
noop [deadline] cfq
==> /sys/block/sdc/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdd/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sde/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdf/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdg/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdh/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdi/queue/scheduler <==
noop [deadline] cfq
Изменение планировщика /dev/sdc
с noop
на deadline
не дает ощутимой разницы. Изменение планировщика на, cfq
похоже, несколько уменьшило задержку, но операции ввода-вывода на других дисках все еще страдали.
vm.dirty*
параметры ядра
root@node51 [~]# sysctl -a | grep 'vm.dirty'
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200
Примеры замедления, обнаруженные и зарегистрированные в журнале/var/log/syslog
Синхронизация группы транзакций ZFS:
May 11 19:28:44 node51 kernel: [ 4080.179688] INFO: task txg_sync:3179 blocked for more than 120 seconds.
May 11 19:28:44 node51 kernel: [ 4080.179905] Tainted: P O 4.4.0-22-generic #39-Ubuntu
May 11 19:28:44 node51 kernel: [ 4080.180110] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
May 11 19:28:44 node51 kernel: [ 4080.180357] txg_sync D ffff88060b68baa8 0 3179 2 0x00000000
May 11 19:28:44 node51 kernel: [ 4080.180362] ffff88060b68baa8 ffff880616a96d00 ffff8806133ea940 ffff880603dc2940
May 11 19:28:44 node51 kernel: [ 4080.180366] ffff88060b68c000 ffff880616ad6d00 7fffffffffffffff ffff88056cb8c508
May 11 19:28:44 node51 kernel: [ 4080.180368] 0000000000000001 ffff88060b68bac0 ffffffff818211f5 0000000000000000
May 11 19:28:44 node51 kernel: [ 4080.180372] Call Trace:
May 11 19:28:44 node51 kernel: [ 4080.180381] [<ffffffff818211f5>] schedule+0x35/0x80
May 11 19:28:44 node51 kernel: [ 4080.180385] [<ffffffff81824315>] schedule_timeout+0x1b5/0x270
May 11 19:28:44 node51 kernel: [ 4080.180390] [<ffffffff810abe52>] ? default_wake_function+0x12/0x20
May 11 19:28:44 node51 kernel: [ 4080.180395] [<ffffffff810c33b2>] ? __wake_up_common+0x52/0x90
May 11 19:28:44 node51 kernel: [ 4080.180398] [<ffffffff81820744>] io_schedule_timeout+0xa4/0x110
May 11 19:28:44 node51 kernel: [ 4080.180412] [<ffffffffc05afbec>] cv_wait_common+0xbc/0x140 [spl]
May 11 19:28:44 node51 kernel: [ 4080.180416] [<ffffffff810c3a70>] ? wake_atomic_t_function+0x60/0x60
May 11 19:28:44 node51 kernel: [ 4080.180423] [<ffffffffc05afcc8>] __cv_wait_io+0x18/0x20 [spl]
May 11 19:28:44 node51 kernel: [ 4080.180487] [<ffffffffc071320e>] zio_wait+0x10e/0x1f0 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180528] [<ffffffffc069ce66>] dsl_pool_sync+0x2c6/0x430 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180573] [<ffffffffc06b85b6>] spa_sync+0x366/0xb30 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180576] [<ffffffff810abe52>] ? default_wake_function+0x12/0x20
May 11 19:28:44 node51 kernel: [ 4080.180623] [<ffffffffc06c9a4a>] txg_sync_thread+0x3ba/0x630 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180669] [<ffffffffc06c9690>] ? txg_delay+0x180/0x180 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180676] [<ffffffffc05aae31>] thread_generic_wrapper+0x71/0x80 [spl]
May 11 19:28:44 node51 kernel: [ 4080.180682] [<ffffffffc05aadc0>] ? __thread_exit+0x20/0x20 [spl]
May 11 19:28:44 node51 kernel: [ 4080.180686] [<ffffffff810a0588>] kthread+0xd8/0xf0
May 11 19:28:44 node51 kernel: [ 4080.180688] [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
May 11 19:28:44 node51 kernel: [ 4080.180692] [<ffffffff8182568f>] ret_from_fork+0x3f/0x70
May 11 19:28:44 node51 kernel: [ 4080.180694] [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
Журнал ext4:
May 11 20:46:46 node51 kernel: [ 6000.186474] INFO: task jbd2/dm-2-8:1148 blocked for more than 120 seconds.
May 11 20:46:46 node51 kernel: [ 6000.193164] Tainted: P O 4.4.0-22-generic #39-Ubuntu
May 11 20:46:46 node51 kernel: [ 6000.199950] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
May 11 20:46:46 node51 kernel: [ 6000.208323] jbd2/dm-2-8 D ffff88060a6e7c98 0 1148 2 0x00000000
May 11 20:46:46 node51 kernel: [ 6000.208330] ffff88060a6e7c98 0000000000000246 ffff8806133eb700 ffff88060b561b80
May 11 20:46:46 node51 kernel: [ 6000.208333] ffff88060a6e8000 ffff88060aeb68b8 ffff88060a6e7d88 ffff88060a6e7d70
May 11 20:46:46 node51 kernel: [ 6000.208336] ffff88060b561b80 ffff88060a6e7cb0 ffffffff818211f5 ffff8805fd6af900
May 11 20:46:46 node51 kernel: [ 6000.208339] Call Trace:
May 11 20:46:46 node51 kernel: [ 6000.208355] [<ffffffff818211f5>] schedule+0x35/0x80
May 11 20:46:46 node51 kernel: [ 6000.208361] [<ffffffff812ea0e0>] jbd2_journal_commit_transaction+0x240/0x1870
May 11 20:46:46 node51 kernel: [ 6000.208365] [<ffffffff810b6be1>] ? dequeue_entity+0x431/0xa80
May 11 20:46:46 node51 kernel: [ 6000.208368] [<ffffffff810b774a>] ? dequeue_task_fair+0x51a/0x8a0
May 11 20:46:46 node51 kernel: [ 6000.208372] [<ffffffff810c3a70>] ? wake_atomic_t_function+0x60/0x60
May 11 20:46:46 node51 kernel: [ 6000.208378] [<ffffffff810ec5fe>] ? try_to_del_timer_sync+0x5e/0x90
May 11 20:46:46 node51 kernel: [ 6000.208381] [<ffffffff812ef32a>] kjournald2+0xca/0x250
May 11 20:46:46 node51 kernel: [ 6000.208384] [<ffffffff810c3a70>] ? wake_atomic_t_function+0x60/0x60
May 11 20:46:46 node51 kernel: [ 6000.208387] [<ffffffff812ef260>] ? commit_timeout+0x10/0x10
May 11 20:46:46 node51 kernel: [ 6000.208391] [<ffffffff810a0588>] kthread+0xd8/0xf0
May 11 20:46:46 node51 kernel: [ 6000.208394] [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
May 11 20:46:46 node51 kernel: [ 6000.208397] [<ffffffff8182568f>] ret_from_fork+0x3f/0x70
May 11 20:46:46 node51 kernel: [ 6000.208399] [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
May 11 20:46:46 node51 kernel: [ 6292.776357] perf interrupt took too long (2539 > 2500), lowering kernel.perf_event_max_sample_rate to 50000
решение1
Управляющий диск подключается к порту SATA, встроенному в материнскую плату.
Как уже говорилось, диски, на которых возникают проблемы с тайм-аутом очистки журнала, подключены к PERC — тому же контроллеру, к которому подключены «проблемные» диски Toshiba.
PERC 310 — это всего лишь базовая аппаратная карта raid. Ее ЦП, вероятно, легко перегружается, либо это ошибка прошивки. Прямой AHCI не очень распространенное использование.
Я бы предположил, что блокировка ввода-вывода происходит на PERC, а не на ОС.
решение2
Это очень сложная информация для осмысления.
Вы используете ZFS, поэтому вполне вероятно, что проблема связана с дисками объемом 5 ТБ в вашем пуле и, возможно, с настройками пула.
Это могут быть диски с секторами размером 4 КБ, поэтому в настройках ZFS следует предусмотреть некоторые изменения, чтобы это учесть.
Можете ли вы предоставить свои df -h
, fdisk -l
, zpool list
, zpool status -v
и zfs list
выходные данные?
решение3
Я думаю, что ваш кэш записи слишком велик по сравнению со скоростью вашего блочного устройства. Я бы предложил следующее:
vm.dirty_background_bytes = 50000000
vm.dirty_bytes = 200000000
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 20
Никогда не устанавливайте оба *_bytes
, *_ratio
потому что последний установленный параметр будет иметь преимущество. Кроме того, некоторые версии ядра Linux могут иметь ошибку, из-за которой настройка *_ratio
не работает так, как задумано. Я бы рекомендовал использовать *_bytes
каждый раз.
К сожалению, настройки кэша записи глобальны, насколько мне известно. В результате пропускная способность для ваших более быстрых устройств немного пострадает, когда вам нужно будет уменьшить размер глобального кэша записи из-за какого-то медленного устройства.