Нагрузка на диски в Linux
Я здесь пишу свой опыт, со своим видением и трактовкой. Пожалуйста, учитывайте это.
IOTOP
Посмотреть, какие процессы в настоящее время создают нагрузку на диск удобно смотреть командой iotop:
Здесь видно, что в данный момент mc что-то пишет (а в это время в другом окне я в самом деле копировал кучу файлов на usb-диск в Midnight Commander (он же mc).
Понять, что коипрует mc в данный момент можно узнать командой:
IOSTAT
Пример вывода iostat на незагруженной в данный момент старенькой системе из двух SATA HDD в soft raid 1 (зеркало) mdadm:
Команда выглядела так:
Если нужны не история, а динамика процесса, попробуйте так:
В этом выводе r/s и w/s это отправленные к устройству запросы на выполнение (IOPS, которые хотелось бы, чтобы устройство выполнило).
Для обычных SATA дисков нагрузка IOPS где-то до 100-130 вполне выполнимая. В момент проведения замеров запрошенная нагрузка была 40 IOPS, поэтому запрос практически в очереди и не стоял, его обслужили почти сразу (на «кассе» никого не было). Поэтому await практически равен svctm.
Другое дело, когда нагрузка на диск вырастает:
Заранее проверить производительность дисков можно с помощью fio. Также можно примерно оценить на одной машине производительность дисков и понимать, какой уровень «в среднем по больнице» вы можете ожидать. Это, конечно же, не правильно, но оценить все же поможет. Глубже анализировать результаты, а, главное, методики тестов мне пока трудно.
# apt-get install fio
В общем виде запуск выглядит так:
Файл your.cfg (название произвольное) может быть примерно таким (пример рабочего конфига для теста на чтение):
Буферизацию не используем (buffered=0), чтение не последовательное (rw=randread).
Я не стал ждать два дня, Ctrl+C и вот результат:
Получили 109 iops, что в принципе нормально, диск обычный, SATA.
Выявляем процессы с дисковой активностью в Linux
TL;DR: статья рассказывает об удобном, быстром и надежном способе определения Linux-программ, записывающих данные на диск, что помогает в выявлении большой или аномально частой нагрузки на дисковую подсистему, а также позволяет оценить накладные расходы файловой системы. Это особенно актуально для SSD в ПК, EMMC и Flash-памяти в одноплатных компьютерах.
В ходе написания статьи обнаружилось, что запись нескольких килобайт данных на файловую систему BTRFS приводит к записи 3 мегабайт реальных данных на диск.
Введение
После 7 месяцев использования нового SSD я решил проверить количество записанных данных, как их сообщает сам диск через SMART.
19.7 ТБ.
Всего за 7 месяцев я использовал 13% от гарантированного количества записанных данных, притом, что он настроен в соответствии с рекомендациями по выравниваю разделов и настройке ФС, swap у меня почти не используется, диски виртуальных машин размещены на HDD!
Это аномально большая цифра, такими темпами гарантийный TBW будет превышен раньше достижения 5-летнего срока гарантии диска. Да и не может мой компьютер писать по 93 гигабайта в сутки! Нужно проверить, сколько данных пишется на диск за 10 минут…
Total:
Writes Queued: 24,712, 2,237MiB
Writes Completed: 25,507, 2,237MiB
Write Merges: 58, 5,472KiB
Определение количества записанных данных на дисковое устройство
Мой SSD хранит количество записанных данных в параметре 241 Total_LBAs_Written, в логических блоках (LBA), а не в байтах. Размер логического блока в моём случае — 512 байт (его можно увидеть в выводе smartctl, в Sector Size). Чтобы получить байты, нужно умножить значение параметра на 512.
Запустите следующую команду, чтобы собрать информацию за 10 минут, где /dev/sdb — ваш диск:
btrace позволяет наглядно посмотреть реальное количество записанных данных, но понять, какие именно программы совершают запись, из её вывода сложно.
Определение программ, производящих запись на накопитель
Программа iotop покажет процессы, пишущие на диск, и размер записанных данных.
Наиболее удобный вывод обеспечивают следующие параметры:
В глаза бросается Firefox, записавший 283 мегабайта за несколько минут работы iotop.
Определение файлов, в которые производится запись
Информация о процессе, насилующим диск — хорошо, а пути, по которым производится запись — еще лучше.
Fatrace не умеет показывать количество записанных данных вследствие использования довольно простого отслеживания факта обращения к файлам через inotify.
Из вывода видно, как хабр сохраняет мою статью в local storage браузера, пока я её пишу, а также расширение Group Speed Dial, которое, как удалось обнаружить именно с помощью fatrace, читает свои данные каждые 30 секунд. Именно читает, а не записывает: CW перед файлом говорит о том, что файл открывается на чтение и запись, с одновременным созданием файла, если он отсутствует (вызывается openat с флагом O_RDWR|O_CREAT), но не говорит, что в файл действительно писалась какая-либо информация.
На всякий случай, чтобы удостовериться в этом, воспользуемся strace, с фильтром на файловые системные вызовы:
Определение накладных расходов файловой системы
Большая разница в показаниях iotop и btrace натолкнула на мысль протестировать файловую систему путем ручной записи данных в файл и отслеживания показаний btrace.
Если полностью исключить запись на диск, загрузившись в emergency-режим systemd, и записать вручную пару байт данных в существующий файл, btrace на SSD с btrfs сообщает о записи 3 мегабайт реальных данных. Свежесозданная файловая система флешке размером в 8 ГБ записывает минимум 264 КиБ при записи одного байта.
Для сравнения, запись пары байт в файл на ext4 оканчивается записью 24 килобайтов данных на диск.
В 2017 году Jayashree Mohan, Rohan Kadekodi и Vijay Chidambaram провели исследование усиления записи разных файловых систем, их результаты для btrfs и ext4 на при записи 4 КБ соотносятся с моими.
Для чего служит команда lsof
Относительно lsof справка man как раз сообщает, что lsof есть сокращение от LiSt of Open Files, и что утилита эта служит для вывода информации о том, какие файлы используются теми или иными процессами. Причем утилита эта имеется в очень многих версиях и диалектах UNIX, включая Linux версии 2.1.72 и выше, а также в HP-UX, AIX, NextStep, Apple Darwin для Power Macintosh, SCO UnixWare, Solaris, FreeBSD, NetBDS, OpenBSD и так далее.
Создателем программа lsof является Victor A. Abell, его домашняя страничка расположена по адресу http://people.freebsd.org/
Если запустить эту утилиту без параметров, выдается информация о всех работающих процессах и открытых ими файлах. Даже в моей системе с одним пользователем эта команда выдала 2344 строки текста. Попробуй проанализируй эту массу информации! Но давайте взглянем хотя бы на несколько строк ее вывода, чтобы на этом примере понять, какую же информацию она выдает.
А теперь смотрим листинг 1 (или результат работы программы на вашем экране).
Листинг 1. Вывод команды lsof.
Номер файлового дескриптора сопровождается символом, указывающим режим, в котором файл был открыт:
В последнем случае за дефисом следует еще один символ, определяющий тип блокировки (подробнее смотри man lsof ).
Вслед за типом указывается устройство, на котором расположен файл, размер файла, номер индексного дескриптора и имя файла.
Опции команды
выдаст данные о всех открытых UNIX-сокетах и всех файлах, принадлежащих процессам, запущенным пользователем “kos”.
будет выведен список файлов, принадлежащих ЛИБО пользователю “fff”, ЛИБО пользователю “ggg” И имеющих сетевые соединения ЛИБО к хосту aaa.bbb ЛИБО к хосту ccc.ddd.
Опции команды lsof можно записывать одну за другой без пробелов, предваряя это список всего одним дефисом, то есть вместо
можно указать просто
Однако при этом надо побеспокоиться о том, чтобы не было неоднозначности в интерпретации опций. Но я не буду детально рассматривать возможные причины неоднозначности, если у вас возникает желание использовать эту возможность, смотрите соответствующую man-страницу.
в выводе lsof будет присутствовать идентификатор процесса (p), имя команды (c), файловый дескриптор (f) и ися файла.
Применение команды lsof
Не имеет смысла повторять в статье описание всех опций этой команды, имеющееся на страничке man. Давайте ограничимся тем, что рассмотрим ее применение и использование наиболее употребительных опций на примерах конкретных ситуаций.
Пример 1. Кто работает с файлом или каталогом?
Начнем с решения той проблемы, которая была описана в начале статьи, и которая рассматривалась в упомянутой выше статье С.Лапшанского [2]. Итак, вы попытались размонтировать CD-ROM (захотели сменить диск). А в ответ получили сообщение “Device is busy”. Это означает, что какой-то процесс открыл файл, расположенный на этом устройстве. А чтобы узнать, какие файлы открыты в том или ином каталоге, служит опция +d команды lsof. Поэтому, чтобы узнать, кем занят диск, дайте команду следующего вида:
(у меня CD-ROM монтируется в каталог /mnt/cdrom). В ответ я получил такое сообщение:
Как видите, сразу становится ясно, что дисковод используется пользователем kos, причем, видимо, какой-то подкаталог каталога /mnt/cdrom открыт в одной из панелей файлового менеджера Mifnight Commander (mc).
Надо отметить, что при использовании опции +d dir выдается информация только о тех файлах и подкаталогах, которые содержатся в самом каталоге dir, а не в его подкаталогах. Для решения рассматриваемой проблемы этого вполне достаточно, потому что если обычно в выводе команды указан и файл данного каталога. Но, если вы все же захотите получить список всех открытых файлов во всех вложенных подкаталогах каталога dir, надо воспользоваться опцией +D. Попробуем, например, посмотреть, какие файлы открыты в каталоге /var/ и всех его подкаталогах. В работающей системе всегда найдутся открытые файлы из этого каталога, поэтому на этом примере очень наглядно демонстрируется разница между опциями +d и +D:
(Упомяну для точности, что символические ссылки игнорируются и поэтому в выводе этой команды не перечисляются.)
Пример 2. Какой процесс использует данный файл?
Приведенный пример очень похож на предыдущий, только вы получаете сведения о процессах, использующих конкретный файл.
Пример 3. Какие ресурсы использует процесс?
Вы уже видели в листинге 1, что каждый процесс открывает несколько файлов. Но когда я выполнил команду
Пример 4. С какими файлами работает пользователь?
Следующий вариант запуска той же команды:
позволяет вывести список файлов, открытых всеми процессами, запущенными пользователями, чье имя или идентификатор содержится в списке names. Отдельные элементы списка разделяются запятыми, например, ”548,root” (пробелов быть не должно).
Пример 5. Кто подключился к вашему компьютеру?
На листинге 2 показан результат выполнения этой команды на компьютере trend в моей домашней сети, состоящей всего из двух компьютеров.
Порты, которые открыты для входящих соединений, обозначены меткой LISTEN. Метка ESTABLISHED показывает, что по данному порту соединение установлено. В листинге 2 вы можете видеть пример двух SSH-сессий. Первая сессия установлена хостом old-lin.home.kos с компьютером trend.home.kos. Она обслуживается процессом с PID 2192, который был порожден основным демоном sshd, PID 727. Процесс с PID 2464, наоборот, соответствует соединению, установленному клиентской программой ssh на компьютере trend.
Вместо “protocol” в параметре может стоять либо TCP, либо UDP (либо ничего).
Чтобы сказанное стало понятнее, приведем несколько простых примеров.
В этом случае будет выдан список всех процессов, прослушивающих или установивших соединение через порт 80.
В этом примере будут перечислены все соединения, ассоциированные с почтовым протоколом SMTP.
В третьем случае будет выдан список всех входящих и исходящих соединений с хостом rus-linux.net.
Эта команда покажет, какие процессы установили UDP-соединения с хостом rus-linux.net через порт 123 (ntp).
Очевидно, что указание параметра adress полезно только в том случае, когда вы заранее знаете, что именно вам нужно искать. Вы можете таким образом проверить, например, что какой-то конкретный сервис фактически работает и какой порт он прослушивает. Вы можете увидеть, подключился ли кто-то извне к вашему компьютеру по таким протоколам как SSH, Telnet, FTP или другим возможным способом.
Пример 6. Кто открыл файлы по NFS?
Пример 7. Наблюдаем за процессом копирования
Предположим, что вы решили переместить из одного каталога в другой большое количество файлов (или большой каталог целиком). И вы хотите видеть, какой именно файл перемещается в данный момент. Тут вам и может помочь утилита lsof. Для этого достаточно дать команду примерно такого вида (в этом примере предполагается, что перемещаются куда-то файлы из каталога Photo):
При этом нужно иметь в виду, что команда lsof делает как-бы “мгновенный снимок”, отображающий только лишь состояние процессов и соответствующих файлов в момент ее выполнения. Так что для “наблюдения за процессом” надо повторять ее запуск многократно. И в таком случае может оказаться полезной опция +r, которая служит для периодического повторения запуска команды через заданный промежуток времени.
Заключение
Мы рассмотрели только малую часть возможностей этой утилиты. Более подробную информацию ищите на соответствующей man-страничке.
Как отследить, какой процесс создаёт нагрузку на диск
Мониторинг операций ввода и вывода
Чрезмерная нагрузка на диск может быть вызвана такой причиной как заражение вирусом либо неправильная настройка программ. В любом случае, необходимо начать с идентификации процесса (программы), которая больше всего делает операций чтения и записи на диск.
iotop — аналог top для отслеживания нагрузки на диск в реальном времени
Программа top позволяет увидеть, какие процессы потребляют больше всего процессорного времени и оперативной памяти, но ничего не говорит об использовании процессами диска, об операциях чтения и записи на диск.
Программа iotop показывает скорость чтения и записи на диск, также процент использования файла подкачки каждым процессом.
Для установки iotop в Debian, Linux Mint, Kali Linux, Ubuntu и их производные выполните команду:
Для установки iotop в Arch Linux, BlackArch, Manjaro и их производные выполните команду:
Программа требует повышенных привилегий для запуска:

В выводе программы присутствуют следующие столбцы:
С помощью курсорных клавиш вправо (→) и влево (←) вы можете переключаться между столбцами, одновременно выбирая, по какому из них будет выполнятся сортировка.

С помощью кнопок «Home» и «End» вы можете переключаться между крайними столбцами.
Нажатие любой клавиши обновит окно.
Для выхода нажмите «q».
Нажав клавишу «o» вы переключитесь на показ только активных процессов, то есть только процессов, которые записывают и считывают данные с постоянного хранилища. Такой же результат вы можете получить запустив программу с опцией -o:
Повторное нажатие клавиши «o» вернёт показ всех процессов.
По умолчанию используется сортировка по убыванию, с помощью кнопки «r» вы можете переключаться между сортировкой по убыванию и по возрастанию.
Кнопка «p» переключает между показами процессов и потоков.
По умолчанию показываются скорости чтения и записи, с помощью кнопки «a» вы можете переключиться на показ общего количества записанных и прочитанных данных.
У iotop имеется несколько опций, которые позволяют управлять поведением программы, например следующая команда будет работать в пакетном режиме (-b), показывая общее количество записанных и прочитанных данных (-a) только для активных процессов (-o), к выводимым данным будет добавляться метка времени (-t), из всех процессов будет отфильтрована только информация о systemd-journald (grep ‘systemd-journald’):

pidstat — вывод статистики для задач Linux
Пакет sysstat содержит сразу две утилиты с помощью которых можно собрать статистику использования диска процессами:
Для установки pidstat в Debian, Linux Mint, Kali Linux, Ubuntu и их производные выполните команду:
Для установки pidstat в Arch Linux, BlackArch, Manjaro и их производные выполните команду:
Следующая команда будет выводить накопленную статистику за каждые 20 секунд, будут показаны только активные процессы (сделавшие операции чтения и записи на диск за указанный интервал), также будет показана полная команда, запустившая процесс. Для более полной статистики запустите программу с повышенными привилегиями:

Каждая строка будет иметь следующие столбцы:
iostat — статистика использования устройств и разделов дисков
Утилита iostat также включена в пакет sysstat. Как можно догадаться из названия программы, она создаёт отчёты по статистике ввода/вывода для устройств и разделов. Её особенностью является то, что она показывает обобщённую статистику для всей системы, а также для отдельных носителей, не разбивая её на процессы. Программа iostat может пригодиться когда необходимо ответить на вопрос: «какой из постоянных носителей подвергается наибольшей нагрузке?».
Запуск программы без опций
выведет два блока информации:

Раздел со статистикой использований устройств содержит следующие разделы:
Отчёт выводит для всей системы с момента её загрузки.
Поскольку по умолчанию данные выводятся в килобайтах, а современные объёмы информации, записываемой на диск, обычно кратны гигабайтом, что цифры трудны для восприятия. Для вывода чисел в удобных для восприятия единицах используйте опцию -h:

Для вывода максимальной полной информации, укажите опцию -x:
Если вам нужна информация только об устройствах, то используйте опцию -d:
Вы можете запустить команду указав время интервала (в секундах) и счётчик (количество отчётов) — в этом случае программа будет выводить информацию через заданный интервал:
Первый отчёт будет содержать информацию с момента загрузки системы, а последующие отчёты будут содержать информацию за период, прошедший с предыдущего отчёта.
Для поиска проблем, вы можете использовать следующую команду, которая непрерывно будет выводить информацию:
С помощью iostat вы можете следить за скоростью чтения и записи на всё устройство, а также выявлять отброшенные блоки.
Выявляем процессы с дисковой активностью в Linux
TL;DR: статья рассказывает об удобном, быстром и надежном способе определения Linux-программ, записывающих данные на диск, что помогает в выявлении большой или аномально частой нагрузки на дисковую подсистему, а также позволяет оценить накладные расходы файловой системы. Это особенно актуально для SSD в ПК, EMMC и Flash-памяти в одноплатных компьютерах.
В ходе написания статьи обнаружилось, что запись нескольких килобайт данных на файловую систему BTRFS приводит к записи 3 мегабайт реальных данных на диск.
Введение
После 7 месяцев использования нового SSD я решил проверить количество записанных данных, как их сообщает сам диск через SMART.
19.7 ТБ.
Всего за 7 месяцев я использовал 13% от гарантированного количества записанных данных, притом, что он настроен в соответствии с рекомендациями по выравниваю разделов и настройке ФС, swap у меня почти не используется, диски виртуальных машин размещены на HDD!
Это аномально большая цифра, такими темпами гарантийный TBW будет превышен раньше достижения 5-летнего срока гарантии диска. Да и не может мой компьютер писать по 93 гигабайта в сутки! Нужно проверить, сколько данных пишется на диск за 10 минут…
Total:
Writes Queued: 24,712, 2,237MiB
Writes Completed: 25,507, 2,237MiB
Write Merges: 58, 5,472KiB
Определение количества записанных данных на дисковое устройство
Мой SSD хранит количество записанных данных в параметре 241 Total_LBAs_Written, в логических блоках (LBA), а не в байтах. Размер логического блока в моём случае — 512 байт (его можно увидеть в выводе smartctl, в Sector Size). Чтобы получить байты, нужно умножить значение параметра на 512.
Запустите следующую команду, чтобы собрать информацию за 10 минут, где /dev/sdb — ваш диск:
btrace позволяет наглядно посмотреть реальное количество записанных данных, но понять, какие именно программы совершают запись, из её вывода сложно.
Определение программ, производящих запись на накопитель
Программа iotop покажет процессы, пишущие на диск, и размер записанных данных.
Наиболее удобный вывод обеспечивают следующие параметры:
В глаза бросается Firefox, записавший 283 мегабайта за несколько минут работы iotop.
Определение файлов, в которые производится запись
Информация о процессе, насилующим диск — хорошо, а пути, по которым производится запись — еще лучше.
Fatrace не умеет показывать количество записанных данных вследствие использования довольно простого отслеживания факта обращения к файлам через inotify.
Из вывода видно, как хабр сохраняет мою статью в local storage браузера, пока я её пишу, а также расширение Group Speed Dial, которое, как удалось обнаружить именно с помощью fatrace, читает свои данные каждые 30 секунд. Именно читает, а не записывает: CW перед файлом говорит о том, что файл открывается на чтение и запись, с одновременным созданием файла, если он отсутствует (вызывается openat с флагом O_RDWR|O_CREAT), но не говорит, что в файл действительно писалась какая-либо информация.
На всякий случай, чтобы удостовериться в этом, воспользуемся strace, с фильтром на файловые системные вызовы:
Определение накладных расходов файловой системы
Большая разница в показаниях iotop и btrace натолкнула на мысль протестировать файловую систему путем ручной записи данных в файл и отслеживания показаний btrace.
Если полностью исключить запись на диск, загрузившись в emergency-режим systemd, и записать вручную пару байт данных в существующий файл, btrace на SSD с btrfs сообщает о записи 3 мегабайт реальных данных. Свежесозданная файловая система флешке размером в 8 ГБ записывает минимум 264 КиБ при записи одного байта.
Для сравнения, запись пары байт в файл на ext4 оканчивается записью 24 килобайтов данных на диск.
В 2017 году Jayashree Mohan, Rohan Kadekodi и Vijay Chidambaram провели исследование усиления записи разных файловых систем, их результаты для btrfs и ext4 при записи 4 КБ соотносятся с моими.

