Ускорение поведения отправки сокетов (в Python) - PullRequest
1 голос
/ 30 июля 2011

У меня есть скрипт, который отправляет 5-10 запросов в секунду на сервер. Самое важное требование, которое у меня есть, - это ограничение количества запросов в секунду. Это всегда должна быть конкретная цифра, не больше и не меньше. Для этого я отправляю запросы через определенный промежуток времени (минус время, необходимое для отправки предыдущего запроса).

Проблема: некоторые запросы отправляются достаточно быстро, а другие занимают слишком много времени на шаге sock.sendall (). Я полагаю, что это потому, что буфер отправки заполнен, и выполнение блокируется, пока буфер не будет очищен.

Что я могу сделать, чтобы очистить буфер быстрее?

Один из вариантов, которые я попробовал, - отключить Nagle:

sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

но, похоже, это не улучшило ситуацию.

Еще одна опция, которая даже звучит слишком неправильно, чтобы попытаться сделать это, - установить буфер отправки на длину запроса перед каждым вызовом sendall ().

Что я могу сделать, чтобы получать более предсказуемые запросы в секунду?

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

ОС - это Centos.

Обновление: похоже, моя ошибка в настройке параметров сокета после подключения. Похоже, размер буфера может быть установлен только перед вызовом connect (). То же самое с TCP_NODELAY. Еще не было времени проверить, имеет ли это какое-то значение.

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

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

Это требование совершенно невыполнимо через TCP. Вам также понадобятся гарантии времени обслуживания в одноранговой сети в режиме реального времени.

0 голосов
/ 11 августа 2011

Как заставить сокет отправлять данные в свой буфер? )

Вы не можете заставить это. Период. TCP решает, когда он может отправлять данные. Теперь, обычно, когда вы вызываете write () для сокета TCP, TCP действительно отправляет сегмент, но нет никакой гарантии и никакого способа форсировать это. Есть много причин, по которым TCP не будет отправлять сегмент: закрытое окно и алгоритм Nagle - две вещи, которые сразу приходят на ум.

Прочитайте полный пост, он достаточно углублен и разъяснил некоторые вещи для меня, например, когда имеет смысл отключить алгоритм Nagle и так далее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...