Недавно при выполнении задач Python на нашей платформе управления и контроля эксплуатации и технического обслуживания возникло явление зависания. Я подошел к машине, чтобы проверить процесс через PS, и обнаружил, что процесс Python, запущенный в 01:07 утра, по-прежнему не подавал признаков завершения более чем через 10 часов. При нормальных обстоятельствах такие задачи не заняли бы более 10 секунд. Это серьезно превзошло ожидания.
К счастью, зависший процесс все еще существует. У нас есть собственный сайт, где мы можем дополнительно проанализировать этот процесс и определить, что происходит внутри задачи Python в данный момент.
Сначала найдите соответствующий pid с помощью ps -ef и получите соответствующий pid процесса Python: 4991.
Вы можете видеть, что процесс в это время получает данные. Recvfrom(5, получить данные с ФД 5
Итак, давайте подробнее разберемся, что же это за FD 5.
Посмотрев на список fd, открытый pid 4991, вы увидите, что fd 5 — это сокет, соответствующий индексному дескриптору 4201961360.
Вы можете видеть, что этот сокет представляет собой соединение, установленное с помощью xx.xx.xx.92:80, то есть локальный процесс Python ожидает получения данных от xx.xx.xx.92:80.
На данный момент мы, вероятно, знаем причину, по которой процесс зависает, но нам нужно дополнительно найти конкретный метод получения данных, соответствующий задаче Python, чтобы оптимизировать код?
Выполнение: py-spy Record -p 4991 -o my.svg
Через некоторое время используйте Control+C, чтобы завершить его, чтобы в текущем каталоге был создан файл my.svg. Скопируйте файл локально и откройте его в браузере, и вы увидите текущий стек вызовов процесса Python.
Изучив стек вызовов, мы обнаружили, что проблемный код задачи находится в методе _get() (с использованием сетевого запроса, инициированного пакетом запросов), поэтому этот метод можно дополнительно оптимизировать.