Аномальная активность jbd2 при исчерпании места на разделе с ext4?

Друзья, добрый день.

Суть проблемы:
При работе на RHEL 6 процесса генерирующего множество небольших записей в текстовые файлы (лог файлы) на разделе заканчивается место. В этот момент на машине выстреливают иопсы на диск, на котором закончилось место, в iotop в топе процесс jbd2.

Описание проблемы:

На множестве виртуальных машин (VMWare ESXi) работает apache-tomcat используемый для разработки. В какой-то момент разработчики включают debug-логи на этом апаче для поиска своих багов и, либо с грустью и безысходностью, либо на радостях от найденной причны бага они такой сервер оставляют жить своей жизнью.

В какой-то момент на разделе виртуальной машины отформатированном ext4 заканчивается место (забивается текстовыми логами apache). Всё бы хорошо, но в этот самый момент счётчик Write Rate (KBps) на виртуальном диске машины выстреливает в полку (~20 MBps, при нормальной работе ~640 KBps). В гостевой ОС iotop в топе показывает процесс jbd2 и значением счётчика IO - 100%.

Вопрос:

Я хочу понять механизм такого повдения. Что происходит с журналом в таком сценариии - почему на диск, на котором место закнчилось, нагрузка не снижается, а увеличивается в десятки раз ?

Гостевая ОС RHEL 6.x (3 <= x <=6)
  • Вопрос задан
  • 1324 просмотра
Пригласить эксперта
Ответы на вопрос 2
igortiunov
@igortiunov Автор вопроса
В процессе изучения документации выяснилось, что при достижении состояния ENOSPC(No space left on device) драйвер файловой системы ext4 изменяет своё поведение следующим образом:
1. Отключает отложенное выделение блоков (www.pointsoftware.ch/en/4-ext4-vs-ext3-filesystem-...
Это скорее всего является причиной возрастания активности на запись (в текущщем паттерне работы - множество мелких записей)
2. Форсирует коммит журнала в файловую систему с надеждой, что какие-то блоки освободятся.
Это скорее всего является причиной активности jbd2 в iotop.
Ответ написан
Комментировать
@mirspo
Петля (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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы