Python зависает в вызовах futex - PullRequest
2 голосов
/ 11 октября 2010

У меня запущен демон Python.Он использует от 7 до 120 потоков.Недавно самый маленький экземпляр (7 потоков) начал показывать зависания, в то время как все другие экземпляры никогда не показывали такого рода проблемы.Присоединение strace к процессу python показывает, что все потоки вызывают futex FUTEX_WAIT_PRIVATE, поэтому они, вероятно, пытаются что-то заблокировать.

Как бы вы отладили такую ​​проблему?

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

Ответы [ 2 ]

4 голосов
/ 12 октября 2010

Наблюдение было немного неверным.Одна нить не вызывала futex, а обменивалась, удерживая Джил.Поскольку рассматриваемая машина имеет низкое аппаратное обеспечение, этот обмен занял очень много времени и казался тупиковым.Основная проблема - утечка памяти.: - (

1 голос
/ 26 декабря 2010

Уважаемый Хельмут, у меня та же проблема с одним потоком, висящим на FUTEXT_WAIT_PRIVATE.

Кажется, вы решили проблему. Можете ли вы поделиться дополнительной информацией о решении?

UPD:

Наконец, была найдена причина блокировки (по крайней мере, для моего случая): это было связано с блокировкой импорта в Python.

Рассмотрим следующую ситуацию:

file1.py:

файл импорта2

file2.py:

создать тему "thread2"

запустить "thread2"

ждать, пока "thread2" не завершит какую-то функцию (скажем, go Go ())

def Go ():

import some_module

....

Здесь импорт в Go () будет зависать, так как импорт заблокирован в основном потоке (с помощью файла импорта2), который не будет выпущен, пока Go () не завершится. Пользователь увидит в зависании strace FUTEX_WAIT_PRIVATE.

Чтобы обойти это место, запустите код, выполняемый при импорте file2, в функцию Do () и запустите его после импорта file2:

файл импорта2

file2.Do ()

...