
Я использую веб-сервер (Ubuntu 11.04), который демонстрирует неожиданно высокий трафик записи. Когда сервер вообще не должен писать, объем трафика записи сопоставим с трафиком чтения.
Обеспокоенный ненужной операцией записи, я попытался проанализировать, что не так в системе. Я могу исключить проблемы с тяжелым ведением журнала Apache или временем доступа (используянет времениконфигурация монтирования).
Чтобы отследить проблему, я хотел посмотреть, какие файлы были записаны. Поэтому я включил IO loggin через block_dump (полезная запись в блоге на эту тему:sprocket.io). Каждая активность файловой системы будет регистрироваться в syslog. Вот краткий отрывок из моей системы:
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 секторов)
Хорошо, теперь я знаю, какие блоки были записаны. Но есть ли способ фактически идентифицировать имена файлов, которые были записаны, на основе этих идентификаторов блоков?
Спасибо за вашу помощь!
Кстати: я использую программный Raid, возможно, проблема в этом.
решение1
Предположим, что 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* является результатом программного рейда.
решение2
Файловая система находится на более высоком уровне абстракции, чем блочные устройства и программные RAID. При этом программный RAID не является частью проблемы с вероятностью 99,9%, это просто блочное устройство. Поэтому вам следует использовать другой набор инструментов для анализа активности ввода-вывода. Я бы рекомендовал начать с iotop
определения самого активного писателя среди запущенных процессов. Затем вы сможете использовать lsof
и strace
определить, в какие файлы записывается информация.
решение3
Linux имеет систему ядра, которая называетсяinotifyдля просмотра любых изменений в файле. В пользовательском пространстве можно использоватьinotify-инструменты( apt-get install inotify-tools
) для наблюдения за каталогом. Однако для каждого файла необходимо установить индивидуальный контроль. Вы можете рекурсивно применить их к каталогу (даже к корневому), но чем меньше вы наблюдаете, тем меньше накладных расходов.
Другие варианты сужения круга поиска включают:
atop
что позволит вам увидеть, какие процессы выполняют записьauditctl
который имеет очень запутанный синтаксис, но позволяет устанавливать наблюдение за любым системным вызовом