Высокое ожидание ввода-вывода в Linux является распространенной проблемой производительности Linux. Сегодня мы рассмотрим, что означает io wait и что способствует возникновению этой проблемы.
Что такое ожидание ввода-вывода в Linux (IO wait)?
Столбец iowait в верхнем выводе команды показывает процент времени, в течение которого процессор ожидал завершения ввода-вывода. Это указывает на то, что система ожидает дискового или сетевого ввода-вывода. Ожидание ввода-вывода связано с ресурсом процессора на сервере.
Определите, является ли проблема ввода-вывода причиной медленной работы системы
Убедиться, что система работает медленно из-за ввода-вывода, можно с помощью нескольких команд, но самой простой является команда Linux top. Ознакомьтесь с этой статьей, чтобы понять, что такое CPU Usage us sy wa hi в Linux Top.
1 | top |
1 2 3 4 5 6 | top – 15:19:26 up 6:10, 4 users, load average: 0.00, 0.01, 0.05 Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 96.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 999936 total, 121588 free, 328672 used, 549676 buff/cache KiB Swap: 2097148 total, 2095792 free, 1356 used. 450460 avail Mem |
Из строки CPU мы можем увидеть процент процессора, потраченного на ожидание ввода/вывода; чем выше число, тем больше ресурсов процессора ожидают разрешения ввода/вывода.
wa - iowait
Количество времени, в течение которого процессор ожидает завершения ввода/вывода.
Определите, на какой диск идет запись
Команда top выше объясняет ожидание ввода-вывода в целом, но не указывает, какой диск затронут, и чтобы узнать, какой диск вызывает проблему, мы используем другую команду Iostat. Ознакомьтесь с этой статьей по устранению проблем с дисками в Linux для получения дополнительной информации.
1 | iostat -x 2 5 |
1 2 3 4 5 6 7 | avg-cpu: %user %nice %system %iowait %steal %idle 0.34 0.00 0.31 0.01 0.00 99.33 Устройство: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.05 100.16 400.17 3900.00 341000.38 84.60 0.00 2.17 0.87 11.14 0.65 111.41 scd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.64 0.64 0.00 0.64 0.00 0.64 0.00 дм-0 0.00 0.00 1.10 0.20 37.85 17.21 84.71 0.00 2.43 0.90 10.88 0.66 0.09 дм-1 0,00 0,00 0,01 0,02 0,07 0,08 9,70 0,00 1,42 0,27 2,05 0,09 0,00 |
В приведенном выше примере Iostat будет обновляться каждые 2 секунды, печатая 5 раз информацию, а опция X - распечатывать расширенную информацию.
Первый отчет Iostat печатает статистику после последней загрузки системы, что означает, что в большинстве случаев первую напечатанную информацию следует игнорировать, а остальные отчеты основываются на времени предыдущего интервала.
Например, эта команда будет напечатана 5 раз, второй отчет - это статистика из первого отчета, третий основан на втором, и так далее. В приведенном выше примере %utilized для sda составляет 111,41%, что является хорошим признаком того, что процесс записывается на диск sda.
В дополнение к %utilized мы можем получить от iostat более богатые ресурсы, такие как запросы на чтение/запись в миллисекунду (rrqm/s & wrqm/s), чтение и запись в секунду (r/s & w/s), и, конечно, многое другое. В приведенном выше примере наш проект, похоже, читает и записывает очень много информации. Это очень полезно для нас, чтобы найти соответствующий процесс.
Найдите процессы, которые вызывают высокое ожидание ввода-вывода
Самый простой способ найти виновника - [использовать Linux Iotop для проверки использования дискового ввода-вывода на процесс], посмотрев на статистику iotop, мы можем легко определить sshd как виновника.
Хотя Iotop является очень мощным инструментом и прост в использовании, он не установлен по умолчанию на всех операционных системах Linux.
1 | iotop |
1 2 3 4 | Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1028 be/4 root 200.00 B/s 300.00 B/s 0.00 % 0.00 % sshd |
Найдите, какой файл вызвал iowait
Команда lsof может показать все файлы, которые открывает процесс, или все процессы, которые открывают файл. Из этого списка мы можем узнать, какие именно файлы записываются, в зависимости от размера файла и конкретных данных файла ввода-вывода in/proc
Мы можем использовать метод-p для уменьшения вывода, PID - это конкретный процесс
1 | lsof -p 1028 |
1 2 3 4 5 6 7 8 9 10 | COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1028 root cwd DIR 253,0 233 64 / sshd 1028 root rtd DIR 253,0 233 64 / sshd 1028 root txt REG 253,0 819640 2393730 /usr/sbin/sshd sshd 1028 root mem REG 253,0 61752 180464 /usr/lib64/libnss_files-2.17.so sshd 1028 root mem REG 253,0 43928 180476 /usr/lib64/librt-2.17.so sshd 1028 root mem REG 253,0 15688 269136 /usr/lib64/libkeyutils.so.1.5 sshd 1028 root mem REG 253,0 62744 482870 /usr/lib64/libkrb5support.so.0.1 sshd 1028 root mem REG 253,0 11384 180425 /usr/lib64/libfreebl3.so sshd 1028 root mem REG 253,0 143352 180472 /usr/lib64/libpthread-2.17.so |
Чтобы дополнительно убедиться, что эти файлы читаются и записываются часто, мы можем просмотреть их с помощью следующей команды.
1 | df /tmp |
1 2 | File system 1K-block used available used% mount point / dev / mapper / cl-root 17811456 3981928 13829528 23% / |
Из результатов вышеприведенной команды мы можем определить, что /tmp является корнем логического диска нашей среды.
Есть два основных шага для устранения проблемы IOwait.
- выяснить, почему процесс использует эти ресурсы ввода-вывода, попытаться снизить нагрузку на ввод-вывод с уровня приложения
- увеличить производительность диска или хранилища с инфрауровня.