представление epoll - PullRequest
       7

представление epoll

9 голосов
/ 18 января 2010

Может кто-нибудь помочь мне ответить на вопросы о epoll_wait.

  1. Является ли излишним использование множества потоков, вызывающих epoll_wait, на одном и том же fds, установленном для обслуживания примерно при 100К активных сокетов? или достаточно просто создать 1 поток для выполнения epoll_wait?

  2. Сколько потоков выйдет из epoll_wait, когда, например, только один сокет готов для чтения данных? я имею в виду, может ли быть ситуация, когда из epoll_wait будут просыпаться 2 или более потоков, но в результирующих событиях будут одинаковые fds?

  3. Каков наилучший способ организации потоков на сервере, который работает со многими активными клиентами (например, 50K +). На мой взгляд, лучший способ: 1 поток ввода-вывода , который выполняет операции epoll_wait и ввода-вывода. + Множество потоков обработки данных , которые будут обрабатывать данные, полученные из рабочего потока ввода-вывода (может занять много времени, например, из любой игровой логики), и создавать новые данные для рабочего потока ввода-вывода для отправки клиенту , Прав ли я в этом подходе или кто-нибудь может помочь мне найти лучший способ организовать это?

Заранее спасибо, Валентин

Ответы [ 3 ]

9 голосов
/ 18 января 2010
  1. При использовании epoll вы хотите рассчитать общее количество потоков в соответствии с количеством физических ядер ЦП (или единиц диспетчеризации гиперпотока), которые вы хотите использовать для обработки. Использование только одного потока для работы означает, что одновременно будет активным не более одного ядра.

  2. Зависит от режима дескриптора файла epoll. События могут быть «инициированными фронтом», что означает, что они происходят только один раз, или «инициированными по уровню», что означает, что любой вызывающий объект получает событие, если в буфере есть место.

  3. Недостаточно информации, чтобы сказать. Я бы предложил вообще не иметь потоков специального назначения, для простоты, и просто обрабатывать «команду» каждого события в потоке, в котором оно получено. Но, очевидно, это зависит от характера вашей заявки.

4 голосов
/ 18 января 2010

Я рекомендую вам это чтение с 2006 года: http://www.kegel.com/c10k.html

0 голосов
/ 21 июня 2017

На самом деле это неправильный вариант использования epoll.

Вы не должны полностью разделять epoll fd между потоками. В противном случае у вас есть возможность, что один поток прочитает часть входящих данных на одном и том же диске, а другой поток - на том же самом, без какого-либо способа узнать, какая часть данных была перед другой.

Просто вызовите epoll_create в каждом потоке, который вызывает epoll_wait. В противном случае ввод / вывод нарушен.

...