Как определить подходящий интервал проверки?

Я только начинаю работать над приложением торнадо, у которого есть некоторые проблемы с процессором. Время ЦП будет монотонно расти с течением времени, максимизируя ЦП на 100%. В настоящее время система разработана таким образом, чтобы не блокировать основной поток. Если ему нужно сделать что-то, что блокирует, а асинхронные драйверы недоступны, он создаст другой поток для выполнения операции блокировки.

Таким образом, у нас есть основной поток, почти полностью связанный с процессором, и куча других потоков, которые почти полностью связана с IO. Из того, что я прочитал, кажется, что это идеальный способ столкнуться с проблемами с GIL. Кроме того, мое профилирование показывает, что мы тратим много времени на ожидание сигналов (что я предполагаю, что делает __semwait_signal ), что согласуется с эффектами, которые GIL будет иметь в моем ограниченном понимании .

Если я использую sys.setcheckinterval , чтобы установить интервал проверки на 300, рост процессора существенно замедляется. Я пытаюсь определить, должен ли я увеличить интервал проверки, оставить его равным 300 или бояться его увеличить. В конце концов, я замечаю, что производительность процессора улучшается, но меня немного беспокоит, что это негативно скажется на быстродействии системы.

Конечно, правильный ответ, вероятно, заключается в том, что нам нужно переосмыслить нашу архитектуру, чтобы принять GIL в Счет. Но это не то, что можно сделать немедленно. Итак, как мне определить подходящий курс действий в краткосрочной перспективе?

8
задан Jason Baker 24 August 2010 в 18:10
поделиться

1 ответ

Первое, что я хотел бы проверить, это убедиться, что вы правильно закрываете потоки. Очень сложно понять, что происходит, исходя только из вашего описания, но вы используете слово «монотонно», что подразумевает, что использование ЦП привязано к времени, а не к нагрузке.

Вы вполне можете столкнуться с ограничениями потоковой передачи Python, но они должны меняться в зависимости от нагрузки (количества активных потоков), а использование ЦП (затраты на переключение контекста) должно уменьшаться по мере выхода этих потоков. Есть ли причина для того, чтобы однажды созданный поток жил вечно? Если это так, сделайте ставку на изменение архитектуры. В противном случае в краткосрочной перспективе можно было бы выяснить, почему использование ЦП привязано ко времени, а не к нагрузке. Это означает, что каждый новый поток имеет постоянную необратимую стоимость в вашей системе, то есть он никогда не завершается.

1
ответ дан 6 December 2019 в 02:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: