Поймали очень неприятный баг, приводящий к рассыпанию mdadm массива. Проблема проявилась сразу на двух серверах два раза подряд.
Проблемная конфигурация:
- аппаратный сервер Dell PowerEdge R640 в NVMe конфигурации
- ОС Ubuntu Server 18.04.4 LTS, ядро 4.15.0-101
- 4 диска NVMe в программном RAID10, через mdadm
- mdadm 4.1~rc1-3~ubuntu18.04.4
Раз в неделю с воскресенья на понедельник в 00:00 запускается таймер fstrim.timer, который активирует службу fstrim.service, которая выполняет fstrim на всех смонтированных файловых системах на устройствах, поддерживающих операцию discard. По сути это запуск команды TRIM, которая сообщает контроллеру SSD дисков, какие блоки в файловой системе свободны.
Так вот, если NVMe диски собраны в программный массив с помощью mdadm, то просто так запускать TRIM на таких дисках нельзя, однако, операционная система совместно с mdadm умеет выполнять TRIM для таких массивов. Фигово умеет.
В общем, после команды fstrim для RAID10 массива из NVMe дисков массив рассыпается. Или при попытке накатить XFS. Или при попытке удалить LVM. Или...
В логах это выглядит так:
Feb 26 00:00:01 cassandra02 systemd[1]: Starting Discard unused blocks...
Feb 26 00:00:31 cassandra02 kernel: [568172.639465] nvme nvme3: I/O 744 QID 40 timeout, aborting
Feb 26 00:00:31 cassandra02 kernel: [568172.639472] nvme nvme3: I/O 745 QID 40 timeout, aborting
Feb 26 00:00:31 cassandra02 kernel: [568172.639475] nvme nvme3: I/O 746 QID 40 timeout, aborting
Feb 26 00:00:31 cassandra02 kernel: [568172.639476] nvme nvme3: I/O 747 QID 40 timeout, aborting
Feb 26 00:00:31 cassandra02 kernel: [568172.639664] nvme nvme2: I/O 159 QID 40 timeout, aborting
Feb 26 00:00:31 cassandra02 kernel: [568172.639669] nvme nvme2: I/O 160 QID 40 timeout, aborting
Feb 26 00:00:31 cassandra02 kernel: [568172.639676] nvme nvme2: I/O 161 QID 40 timeout, aborting
Feb 26 00:00:31 cassandra02 kernel: [568172.639678] nvme nvme2: I/O 162 QID 40 timeout, aborting
Из массива вылетает один или два диска, массив или деградирует или ещё какое-то время работает только на чтение, если вылетел только один диск. После перезагрузки массив восстанавливается, синхронизируется, но файловая система может быть повреждена, могут быть потери в данных.
При этом замечено:
- RAID1 массив не рассыпается, отрабатывает нормально.
- RAID10 массив на сервере HPE Proliant DL360 Gen10 с ядром 4.15.0-175 не падает (пока)
Явно проблема не аппаратная. Вероятно, лечится обновлением ядра. Я попытался найти такую же проблему в Интернете, но нашёл только похожие.
https://www.spinics.net/lists/kernel/msg3765302.html
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1907262
https://bugzilla.kernel.org/show_bug.cgi?id=202665
Как временное решение: остановка таймера:
systemctl stop fstrim.timer
systemctl disable fstrim.timer
Дополнение
systemctl cat fstrim.timer
# /lib/systemd/system/fstrim.timer [Unit] Description=Discard unused blocks once a week Documentation=man:fstrim ConditionVirtualization=!container [Timer] OnCalendar=weekly AccuracySec=1h Persistent=true [Install] WantedBy=timers.target
systemctl cat fstrim.service
# /lib/systemd/system/fstrim.service [Unit] Description=Discard unused blocks ConditionVirtualization=!container [Service] Type=oneshot ExecStart=/sbin/fstrim -av
Очистка на выбранном разделе:
fstrim -v /mnt/disk
Очистка всех смонтированных разделов:
fstrim -av
Дополнение 2
Обновил ядро на 4.15.0-213-generic, вроде перестало крашиться.
apt update
apt upgrade