Ответ
Для анализа дисковых операций приложения в Linux я использую комбинацию инструментов мониторинга и трассировки. Это критически важно для диагностики проблем с производительностью (высокий IOwait) или утечек файловых дескрипторов.
1. Трассировка системных вызовов в реальном времени
strace показывает все системные вызовы, связанные с файлами и диском.
# Отслеживать все файловые операции для запускаемой команды
strace -e trace=file,openat,read,write,close <command>
# Присоединиться к уже работающему процессу
strace -p <PID> -e trace=file
# Сохранить вывод в файл для анализа
strace -o trace.log -p <PID>
2. Мониторинг открытых файлов и дескрипторов
lsof показывает, какие именно файлы использует процесс.
# Все открытые файлы для процесса
lsof -p <PID>
# Показать только регулярные файлы и сокеты
lsof -p <PID> | grep -E "REG|unix"
# Найти процессы, держащие открытым конкретный файл
lsof /path/to/file.log
3. Мониторинг нагрузки на диск в реальном времени
# Показать процессы, активно ведущие запись/чтение (обновление каждые 2 сек)
sudo iotop -o -d 2
# Статистика по устройствам блочного уровня
sudo iostat -dx 2
4. Анализ через виртуальную файловую систему /proc
В /proc/<PID>/io содержится детальная статистика ввода-вывода для процесса (прочитано/записано байт).
cat /proc/<PID>/io
Типичный сценарий: Если приложение «подвисает», я сначала смотрю iotop, чтобы идентифицировать процесс, создающий высокую нагрузку, затем strace или lsof, чтобы понять, с какими файлами он работает.