
Я сейчас управляю компьютерным кластером для научных вычислений. Некоторые процессы в кластере требуют интенсивного использования ввода-вывода. Теперь я нахожу такой процесс:
- Его состояние быстро меняется между DOWN и RUN, а загрузка процессора быстро меняется между 1% и 100%.
- В
top
выходных данных iowait равен 0%, а idle составляет около 90%.
Я думаю, что этот процесс может иметь некоторые проблемы, но владелец процесса утверждает, что он работает нормально, поскольку он все еще записывает данные на диски.
Больше информации:
- Процесс записывает данные на удаленный диск, смонтированный в /home.
- Процесс основан на слегка измененном коде. Оригинальное программное обеспечение способно на многопоточность, но требует огромного количества памяти. Измененный код использует больше диска и меньше памяти, но тот, кто изменяет код, ничего не знает о многопоточности.
- Небольшие тесты показывают, что код может дать правильный результат.
Вопросы:
- почему процесс не использует 100% ресурсов процессора, и если это из-за ожидания io, то почему iowait равен 0%?
- Как определить, есть ли в процессе какие-либо проблемы и какого типа это проблемы?
решение1
The process is writing data to a remote disk mounted on /home
Вероятно, вот ваш ответ. Состояние процесса D
неВНИЗ, этонепрерывный сони обычно означает, что нужно завершить некоторые операции ввода-вывода. Поскольку у вас есть сетевой ресурс, в зависимости от условий он может не отображаться как ожидающий ввода-вывода для вас и может не потреблять много ресурсов ЦП, поскольку ваша система находится в состоянии ожидания.
Однако для вас и вашего приложения все будет происходить очень медленно, если сетевой ресурс работает медленно из-за способа записи данных приложением, из-за сети или из-за производительности файлового сервера.
Как узнать, является ли причиной ваше приложение или сетевой ресурс? Просто — протестируйте производительность сетевого ресурса с помощью других инструментов и других шаблонов использования. Скопируйте много данных туда и обратно из /home в какое-то другое место и обратно, запустите несколько тестов, например iozone
, протестируйте сырую производительность сети с помощью iperf
и тому подобное.
Если они дают разумные результаты, то посмотрите, что делает ваше приложение.
Однако часто причина кроется в чем-то другом; не зная ничего о вашей системе, я бы предположил, что вам нужно настроить параметры монтирования NFS. Но пока это остается лишь догадкой, поскольку я не знаю, используете ли вы NFS вообще.
решение2
Если процессор не занят, то ваш процесс, по-видимому, ждет чего-то внешнего. Я полагаю, что есть хороший шанс, что вы поймете это, посмотрев, какие системные вызовы выполняются дольше всего с помощью strace.
В таком случае попробуйте воспользоваться профайлером, чтобы выяснить, что делает код.
Использует ли ваш код mmap'd IO? Я думаю, что это может не быть сообщено как время iowait для вашего процесса, но будет отображено как системный процесс, использующий много диска, поскольку он сбрасывает страницы на диск.