Аномальная активность jbd2 при исчерпании места на разделе с ext4?
Друзья, добрый день.
Суть проблемы:
При работе на RHEL 6 процесса генерирующего множество небольших записей в текстовые файлы (лог файлы) на разделе заканчивается место. В этот момент на машине выстреливают иопсы на диск, на котором закончилось место, в iotop в топе процесс jbd2.
Описание проблемы:
На множестве виртуальных машин (VMWare ESXi) работает apache-tomcat используемый для разработки. В какой-то момент разработчики включают debug-логи на этом апаче для поиска своих багов и, либо с грустью и безысходностью, либо на радостях от найденной причны бага они такой сервер оставляют жить своей жизнью.
В какой-то момент на разделе виртуальной машины отформатированном ext4 заканчивается место (забивается текстовыми логами apache). Всё бы хорошо, но в этот самый момент счётчик Write Rate (KBps) на виртуальном диске машины выстреливает в полку (~20 MBps, при нормальной работе ~640 KBps). В гостевой ОС iotop в топе показывает процесс jbd2 и значением счётчика IO - 100%.
Вопрос:
Я хочу понять механизм такого повдения. Что происходит с журналом в таком сценариии - почему на диск, на котором место закнчилось, нагрузка не снижается, а увеличивается в десятки раз ?
В процессе изучения документации выяснилось, что при достижении состояния ENOSPC(No space left on device) драйвер файловой системы ext4 изменяет своё поведение следующим образом:
1. Отключает отложенное выделение блоков (www.pointsoftware.ch/en/4-ext4-vs-ext3-filesystem-...
Это скорее всего является причиной возрастания активности на запись (в текущщем паттерне работы - множество мелких записей)
2. Форсирует коммит журнала в файловую систему с надеждой, что какие-то блоки освободятся.
Это скорее всего является причиной активности jbd2 в iotop.
Петля (dieadlock) скорее всего: критичный процесс, который нельзя остановить, пытается сохраниться, но места нет и входит в цикл - возможно еще чего порождает, например flush. Надо в коде ext4 ковыряться для точного ответа. Можно попытаться найти виновника
mount -t debugfs none /sys/kernel/debug
echo 1 >/sys/kernel/debug/tracing/events/ext4/ext4_journal_start/enable
echo 1 >/sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
cat /sys/kernel/debug/tracing/trace_pipe