Производительность epoll для меньших значений времени ожидания

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

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

Спасибо

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам