Я использую веб-сервер (Ubuntu 11.04), который демонстрирует неожиданно высокий трафик записи. Когда сервер вообще не должен писать, объем трафика записи сопоставим с трафиком чтения.
Обеспокоенный ненужной операцией записи, я попытался проанализировать, что происходит в системе. Я могу исключить тяжелые проблемы с журналированием apache или временем доступа (используя noatime конфигурация монтирования).
Чтобы отследить проблему, я хотел посмотреть, какие файлы были записаны. Поэтому я включил вход в систему ввода-вывода через block_dump (полезная запись в блоге по этой теме: sprocket.io). Каждая активность файловой системы будет регистрироваться в системном журнале. Вот краткая выдержка из моей системы:
21 августа 18:22:55 xxxxx ядро: [3984721.590864] apache2 (2761): ЧИТАТЬ блок 1098502400 на md2 (8 секторов)
21 августа 18:22:55 xxxxx ядро: [3984721.594005] kjournald (316): ЗАПИСАТЬ блок 2224394648 на md2 (8 секторов)
21 августа 18:22:55 xxxxx ядро: [3984721.594029] md2_raid1 (260): ЗАПИСАТЬ блок 2925532672 на sdb3 (8 секторов)
21 августа 18:22:55 xxxxx ядро: [3984721.594044] md2_raid1 (260): ЗАПИСАТЬ блок 2925532672 на sda3 (8 секторов)
21 августа 18:22:55 xxxxx ядро: [3984721.644244] apache2 (2761): ЧИТАТЬ блок 2242118744 на md2 (8 секторов)
Хорошо, теперь я знаю, какие блоки были написаны. Но есть ли способ на самом деле идентифицировать имена файлов, которые были написаны на основе этих идентификаторов блоков?
Спасибо за вашу помощь!
Кстати: я использую Software Raid, это может быть частью проблемы.
Предполагая, что ext2 / ext3 / ext4, начните с
[406420.877412] vi(12496): READ block 4522288 on dm-1 (8 sectors)
Определите размер блока файловой системы:
# /sbin/dumpe2fs /dev/dm-1 | grep 'Block size'
dumpe2fs 1.42.3 (14-May-2012)
Block size: 4096
Предполагая, что у вас есть диск с 512-байтовыми секторами, разделите блок на 4096/512, то есть на 8, чтобы получить 565286.
В debugfs
используйте комбинацию icheck
и ncheck
:
debugfs: icheck 565286
Block Inode number
565286 142506
debugfs: ncheck 142506
Inode Pathname
142506 /etc/security/time.conf
Изменить: сделайте это на устройствах md *, а не на устройствах sd *. Ввод-вывод устройства SD * является результатом программного рейда.
Файловая система находится на более высоком уровне абстракции, чем блочные устройства и программные RAID. При этом программный RAID не является частью проблемы с вероятностью 99,9%, это всего лишь блочное устройство. Итак, вы должны использовать другой набор инструментов для анализа вашей активности ввода-вывода. Я бы рекомендовал начать с iotop
чтобы сначала определить ведущего писателя среди запущенных процессов. Тогда вы сможете использовать lsof
и strace
чтобы определить, какие файлы записываются.
В Linux есть система ядра, называемая inotify для просмотра любых изменений в файле. В пользовательском пространстве можно использовать инструменты inotify (apt-get install inotify-tools
) для просмотра каталога. Однако на каждый файл должны быть помещены отдельные часы. Вы можете рекурсивно применить их к каталогу (даже корню), но чем меньше вы смотрите, тем меньше накладных расходов.
Другие варианты сужения:
atop
что позволит вам увидеть, какие процессы выполняют записиauditctl
который имеет очень загадочный синтаксис, но позволяет помещать часы в любой системный вызов