Вопрос

У меня есть демон 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 ()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top