Используйте smtplib для Python, чтобы подключиться к серверу очень медленно, за 10 секунд +, чтобы получить ответ - PullRequest
0 голосов
/ 01 мая 2019

Использование smtplib для python для очень медленного подключения к серверу, 10 секунд +, чтобы получить ответ

сервер: postfix
на стороне сервера, просто установите код не конфигурации
client: smtplib.py
на стороне клиента, используйте url или ip (эластичный ip), оба пробовали, слишком медленно

Клиент находится в облачной доступной зоне A, сервер находится в том же az, странно то, что из другого az даже мойподключение к серверу действительно быстрое

код клиента

conn = smtplib.SMTP(url, 25, timeout=60)  
conn.quit()
  1. Проверьте сеть

    ping в порядке, тест mtr в порядке

  2. Tcpdump получает пакеты

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

  3. Стой, чтобы найти функцию

21:45:34.757347 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
21:45:34.757393 fcntl(3, F_GETFL)       = 0x2 (flags O_RDWR)
21:45:34.757441 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
21:45:34.757476 connect(3, {sa_family=AF_INET, sin_port=htons(25), 
sin_addr=inet_addr(" ")}, 16) = -1 EINPROGRESS (Operation now in progress)
21:45:34.757530 poll([{fd=3, events=POLLOUT}], 1, 60000) = 1 ([{fd=3, 
revents=POLLOUT}])
21:45:34.759025 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
21:45:34.759165 poll([{fd=3, events=POLLIN}], 1, 60000) = 1 ([{fd=3, 
revents=POLLIN}])
21:45:48.775217 recvfrom(3, "220  ESMTP "..., 8192, 0, NULL, NULL) = 50

похоже на recvf от времени, но все еще не знаю, почему

Сделать cprofile для поиска функции

python -m cProfile -s кумулятивно

7522 function calls (7465 primitive calls) in 14.597 seconds

Упорядочено по: совокупному времени

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000   14.597   14.597 smtp-test.py:1(<module>)
    1    0.000    0.000   14.580   14.580 smtplib.py:240(__init__)
    1    0.000    0.000   14.579   14.579 smtplib.py:294(connect)
    2    0.000    0.000   14.579    7.290 smtplib.py:344(getreply)
    2    0.000    0.000   14.579    7.290 socket.py:411(readline)
    2   14.579    7.289   14.579    7.289 {method 'recv' of 
    '_socket.socket' objects}

снова, recv займет 14 с

Мне нужно, чтобы это время было менее 1 с, но реальный результат - более 10 с.Кто-нибудь может дать какой-нибудь совет?

...