Во время нагрузочного тестирования ветки Python 3 нашего приложения я заметил следующие записи в журнале, указывающие, что достигнута максимальная глубина рекурсии, что привело к перезапуску интерпретатора. Это приводит к значительному снижению производительности и отбрасыванию запросов.
WARNING [reader.views] Initializing library objects.
INFO [multiserver] Initializing ServerCoordinator with subscriptions: ['msync']
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
--- Logging error ---
Error: maximum recursion depth exceeded
При рассмотрении проблемы я заметил этот другой вопрос SO , который, как мне кажется, описывает нашу ситуацию (у нас нет проблема с нашим Python 2 кодом), и этот вопрос привел к ЭТОМУ отчету об ошибках и ЭТОМУ патчу .
Моя непосредственная цель - убедиться, что Информация об ошибках и трассировке стека регистрируется правильно, поэтому мы можем отследить эту проблему. Согласно источнику Python 3, после Logging Error
должно быть намного больше информации, но эта информация полностью опущена. Я проследил основной код Python, ответственный за эти журналы, до этой handleError
функции , где мы можем увидеть вышеупомянутый патч. Мне кажется, что внешний блок try генерирует исключение, которое впоследствии проглатывается.
Что я пробовал до сих пор:
Убедитесь, что для raiseExceptions
установлено значение True
. Без изменений.
Я использовал find_recursionlimit.py
script в репо Python 3, чтобы найти реальный предел глубины рекурсии нашей системы, и изменил его по умолчанию от 1000
до 11800
. Без изменений.
Ограничена сложность настроек LOGGING, удаления пользовательских обработчиков и фильтров. Без изменений.
Что я рассматриваю или активно работаю над:
- Исправление функции
handleError
для поднять исключения во внешнем блоке try - Оборачивая пакет
logging
, чтобы попытаться произвести то же самое изменение
Дополнительная информация
- Django 1.11
- Python 3.7
- Конфигурация регистрации LINK