У меня есть ситуация, когда у меня есть процесс, скажем, script.pl (здесь он есть), который, кажется, задерживается в выводе на ps auxw | grep script.pl , иногда, когда нагрузка велика , она задерживается на несколько минут. Этот сценарий вызывается 5-10 раз в секунду другим процессом (этот процесс выполняет неблокирующий вызов сценария, например: System(/some/path/script.pl &)).

Сначала я волновался, что этот сценарий по какой-то причине не может быть завершен своевременно и, таким образом, замедляет другие вещи. Однако все, что делает скрипт - это записывает сообщение в другой ящик через сокет TCP.

И вот тут все становится странным. 1) Я могу проверить, завершается ли эта операция с сокетом (единственное, что делает скрипт), просматривая журналы в другом окне - он получает сообщение немедленно и вовремя. 2) Несмотря на то, что я вижу много экземпляров (казалось бы завершенных) экземпляров script.pl в выводе ps , я не вижу соответствующих записей, если я делаю что-то вроде top -n 1 | grep script.pl - это указывает на то, что script.pl не использует никаких ресурсов; на самом деле в этом выводе нет ни одного экземпляра script.pl .

Итак, наконец, есть ли известные проблемы с ps или интерпретатором Perl, которые могут привести к зависанию завершенных скриптов Perl в выводе ps , но не в выводе top ?

Спасибо!

РЕДАКТИРОВАТЬ: я изменил вызов верхней команды на: top -n 1 -u script_pl_user | grep script.pl . Теперь процесс проявляется одинаково в обоих местах. Тем не менее, top показано, что загрузка ЦП составляет 0,0%, а использование памяти отсутствует или очень или очень очень мало. Почему скрипт script.pl задерживается, хотя его операции проверены на завершение?

1 ответ1

1

Это связано с механикой ps и top.

Top просто агрегирует использование по PID, а системный вызов в Perl по существу использует встроенный в ОС fork(), который создает дочерний процесс. Дочерние процессы имеют тот же PID, что и родительский. ps перечисляет все запущенные процессы. Например, обратите внимание, что то же самое относится и к Apache. Если вы зайдете в Top и найдете Apache, вы увидите только одну запись, но если вы сделаете ps aux и найдете там Apache, есть несколько записей с одинаковым PID.

Действительно, top предназначен для определения общего использования ресурсов программой, поэтому вы не хотите видеть сумму, которую использует каждый дочерний элемент, а ps - детально, чтобы узнать, какие программы запущены, поэтому вы хотите увидеть все ребенок обрабатывает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .