Стресс-тестирование показало:
Моя конфигурация журналов отправляла важные сообщения SMTPHandler и отлаживала сообщения в локальный файл журнала.
Для тестирования я создал умеренно большое количество потоков (например, 50), которые ожидали триггера, а затем одновременно пытались записать критическое сообщение или сообщение отладки, в зависимости от теста.
Тест № 1: Все потоки отправляют критические сообщения: выяснилось, что на отправку первого критического сообщения ушло около 0,9 секунды. Второе критическое сообщение заняло около 1,9 секунды. Третий еще дольше, быстро складывается. Похоже, что сообщения, отправляемые на электронную почту, блокируют ожидание завершения отправки.
Тест № 2: Все потоки отправляют сообщения отладки: они запускаются довольно быстро, от сотен до тысяч микросекунд.
Тест № 3: смесь обоих. Из результатов стало ясно, что отладочные сообщения также блокировались в ожидании отправки сообщений с критическими сообщениями.
Так, не то, чтобы 2 минуты означали тайм-аут. Именно эти две минуты представляли большое количество заблокированных потоков, ожидающих в очереди.
Почему столько критических сообщений отправлялось одновременно? Это ирония. Внутри метода, который включал сетевой вызов, был вызов logging.debug (). У меня был какой-то код, отслеживающий скорость метода (чтобы увидеть, не слишком ли длинный сетевой вызов). Если это так, он (конечно) зарегистрировал критическую ошибку, которая отправила электронное письмо. Затем следующий поток заблокировался при вызове logging.debug (), что означает, что он пропустил крайний срок, вызвав еще одно электронное письмо и запустив другой поток для медленной работы.
2-минутная задержка в одном потоке не была сетевым таймаутом. Это был один поток, ожидающий другого потока, который был заблокирован на 1 минуту 57 - потому что он ожидал другого потока, заблокированного на 1 минуту 55 и т. Д. И т. Д. И т. Д.
Это не очень красивое поведение от SMTPHandler.