производительность epoll для меньших значений времени ожидания - PullRequest
1 голос
/ 29 ноября 2011

У меня есть однопоточный серверный процесс, который просматривает несколько (около 100) сокетов через epoll в цикле, мой вопрос в том, как определить оптимальное значение значения тайм-аута epoll_wait, так как это однопоточный процесс, все запускаетсяoff epoll_wait, если на сокетах нет активности, программа остается бездействующей, я предполагаю, что если я дам слишком маленький тайм-аут, который вызывает слишком много вызовов epoll_wait, то это не повредит, потому что, хотя мой процесс выполняет слишком много вызовов epoll_wait, он будетиначе сидеть без дела, но есть еще один момент, я запускаю много других процессов на этом (8-ядерном) блоке, что-то вроде 100 других процессов, которые являются клиентами этого процесса, мне интересно, как значение тайм-аута влияет на переключение контекста процессора, т. е. если яслишком малое время ожидания, в результате которого во многих вызовах epoll_wait мой серверный процесс будет помещаться в ожидание много раз по сравнению с тем, когда я даю большее значение времени ожидания, что приводит к меньшему количеству вызовов epoll_wait.

любые мысли / идеи.

Спасибо

1 Ответ

3 голосов
/ 29 ноября 2011

Я полагаю, что нет веских причин, чтобы заставить ваш процесс проснуться, если он не имеет ничего общего. Просто установите время ожидания, когда вам сначала понадобится , чтобы что-то сделать. Например, если у вашего сервера есть семантика отключения клиента после N секунд бездействия, установите время ожидания epoll на время после того, как первый клиент должен был быть отключен, предполагая отсутствие активности. Другими словами, установите его на:

тт {expire_time (клиент); для каждого клиента} - current_time

Или, если это отрицательно, вы можете немедленно отключить хотя бы одного клиента. В общем, это работает не только для отключения клиентов; Вы можете абстрагировать вышеизложенное в «программные таймеры» в вашем приложении.

Я не вижу упомянутого вами компромисса. Если вы используете тайм-аут, меньший, чем нужно, вы проснетесь, прежде чем у вас появится , а затем, вероятно, вернетесь ко сну, потому что вам нечего делать. Что хорошего в этом? С другой стороны, вы не должны использовать тайм-аут, превышающий то, что вам нужно - потому что это заставит вашу программу не соблюдать политику тайм-аута отключения.

Если ваша программа не ожидает какого-либо события, основанного на времени (например, отключение клиентов), просто присвойте epoll_wait () значение тайм-аута -1, заставив его ждать вечно.

ОБНОВЛЕНИЕ Если вы беспокоитесь, что этот процесс получает меньше ресурсов ЦП, когда другие процессы активны, просто присвойте ему более низкое значение nice (приоритет планировщика). С другой стороны, если вы обеспокоены тем, что ваш серверный процесс будет выгружен на диск в пользу других процессов, когда он простаивает, можно избежать его замены . (или вы можете просто уменьшить / proc / sys / vm / swappiness, влияя на все процессы)

...