Python зависает при вызовах futex
-
29-09-2019 - |
Вопрос
У меня есть демон Python, запущенный в производство.В нем используется от 7 до 120 потоков.Недавно самый маленький экземпляр (7 потоков) начал показывать зависания, в то время как все остальные экземпляры никогда не показывали такого рода проблем.Присоединение strace к процессу python показывает, что все потоки вызывают futex FUTEX_WAIT_PRIVATE , поэтому они, вероятно, пытаются что-то заблокировать.
Как бы вы отладили такую проблему?
Обратите внимание, что это производственная система, работающая с флэш-памятью, поэтому запись на диск также ограничена.
Решение
Это наблюдение было немного неверным.Один поток не вызывал futex, а вместо этого менял местами, удерживая gil.Поскольку у рассматриваемой машины низкое аппаратное обеспечение, эта замена заняла очень много времени и, казалось, привела к тупику.Основная проблема заключается в утечке памяти.:-(
Другие советы
Дорогой Хельмут, у меня такая же проблема с одним потоком, зависшим на FUTEXT_WAIT_PRIVATE.
Похоже, вы решили эту проблему.Можете ли вы поделиться дополнительной информацией об этом решении?
UPD:
Причина блокировки наконец была найдена (по крайней мере, в моем случае).:это произошло из-за блокировки импорта в Python.
Рассмотрим следующую ситуацию:
file1.py:
импорт файла2
file2.py:
создать поток "thread2"
запустите "thread2"
подождите, пока "thread2" завершит работу с какой-либо функцией (скажем, go Go())
def Go():
импортируйте some_module
....
Здесь импорт в Go() зависнет, поскольку импорт заблокирован в основном потоке (с помощью import file2), который не будет выпущен до завершения Go().Пользователь увидит в strace зависание на FUTEX_WAIT_PRIVATE.
Чтобы обойти это, разместите код, выполняемый во время импорта file2 в функцию Do(), и запустите его после импорта file2:
импорт файла2
file2.Do ()