⇨ Расследуем фантомные чтения с диска в Linux
Я люблю такие материалы, так как обычно конспектирую, если нахожу что-то новое. Записываю себе в свою базу знаний. Частично из неё потом получаются заметки здесь.
Там расследовали чтение с помощью blktrace. Я знаю этот инструмент, но он довольно сложный с большим количеством подробностей, которые не нужны, если ты не разбираешься в нюансах работы ядра. Я воспроизвёл описанную историю. Покажу по шагам:
1️⃣ Через
iostat смотрим нагрузку на диск и убеждаемся, что кто-то его активно читает. Сейчас уже не обязательно iostat ставить, так как htop может показать то же самое. 2️⃣ Запускаем
blktrace в режиме наблюдения за операциями чтения с выводом результата в консоль:# blktrace -d /dev/sda1 -a read -o - | blkparse -i -Вывод примерно такой:
259,0 7 4618 5.943408644 425548 Q RA 536514808 + 8 [questdb-ilpwrit]В данном случае
RA 536514808 это событие чтения с диска начиная с блока 536514808.3️⃣ Смотрим, что это за блок:
# debugfs -R 'icheck 536514808 ' /dev/sda1debugfs 1.46.5 (30-Dec-2021)Block Inode number536514808 8270377То есть этот блок имеет номер айноды
8270377. 4️⃣ Смотрим, что это за файл:
debugfs -R 'ncheck 8270377' /dev/sda1Inode Pathname8270377 /home/ubuntu/.questdb/db/table_name/2022-10-04/symbol_col9.d.1092Нашли файл, который активно читает процесс questdb-ilpwrit.
Я всё это воспроизвёл у себя на тесте, записал последовательность. Вариант рабочий, но утомительный, если всё делать вручную. Может быть много временных файлов, которых уже не будет существовать, когда ты будешь искать номер айноды соответствующего блока.
Был уверен, что это можно сделать проще, так как я уже занимался подобными вопросами. Вспомнил про утилиту fatrace. Она заменяет более сложные strace или blktrace в простых случаях.
# apt install fatraceПросто запускаем её и наблюдаем
# fatraceВ соседней консоли откроем лог:
# tail -n 10 /var/log/syslogСмотрим в консоль fatrace:
bash(2143): RO /usr/bin/tailtail(2143): RO /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2tail(2143): O /etc/ld.so.cachetail(2143): RO /usr/lib/x86_64-linux-gnu/libc.so.6tail(2143): C /etc/ld.so.cachetail(2143): O /usr/lib/locale/locale-archivetail(2143): RCO /etc/locale.aliastail(2143): O /var/log/syslogtail(2143): R /var/log/syslogРезультат тот же самый, что и выше с blktrace, только намного проще. В fatrace можно сразу отфильтровать вывод по типам операций. Например, только чтение или запись:
# fatrace -f R# fatrace -f WСобираем все события в течении 30 секунд с записью в текстовый лог:
# fatrace -s -t 30 -o /tmp/fatrace.logНе хватает только наблюдения за конкретным процессом. Почему-то ключ
-p позволяет не задать конкретный пид процесса для наблюдения, а исключить из результатов операции процесса с этим pid:# fatrace -p 697Можно исключить, к примеру bash или sshd. Они обычно не нужны для расследований.
Рекомендую заметку сохранить, особенно про fatrace. Я себе отдельно записал ещё вот это:
# debugfs -R 'icheck 536514808 ' /dev/sda1# debugfs -R 'ncheck 8270377' /dev/sda1#linux #perfomance