почему epoll принял новый fd и spawn new thread плохо масштабируется? - PullRequest
0 голосов
/ 26 августа 2018

Я видел много споров о том, что epoll принял новый fd и создал новый поток для чтения и записи в своем собственном потоке, не хорошо масштабируется? Но как это плохо масштабируется? Что если каждое соединение подвергается тяжелой обработке, например: -

  • делает транзакцию базы данных
  • выполняет тяжелую работу алгоритма
  • в ожидании завершения других дел.

Если моя цель определенно просто сделать что-то внутри программы (, больше не нужно перебирать другие соединения для выполнения вещи ), и не создавать новый поток для чтения / записи io. Это может зависнуть навсегда только из-за одной функции, ожидающей чего-то, верно? Если это так, как epoll масштабируется хорошо, если не появляется новая тема?

epoll_wait(...);

// available to read now
recv(....);

// From here if i don't spawn thread, the program will be hanging. What should I do?
processing algorithm work.....// At least 3 secs to do the job.


continue;

1 Ответ

0 голосов
/ 26 августа 2018

AFAIU, epoll (7) не создает новые темы самостоятельно (см. Также pthreads (7) ...).Вам нужен другой вызов (используя pthread_create (3) или базовый системный вызов clone (2) , используемый pthread_create ...) для создания потоков.

Узнайте больше о проблеме C10K (которую сегодня следует называть C100K) и некотором учебнике pthread .Но похоже, что ваша программа может потреблять много вычислительных ресурсов, а не ограничиваться вводом-выводом.Таким образом, узким местом может быть мощность компьютера (тогда вы не сможете получить масштабируемость с помощью многопоточности на одном узле компьютера; вам нужно распределенные вычисления )

Потоки - это довольно тяжелые ресурсы.Таким образом, вы хотите иметь пул потоков и иметь только несколько десятков активных (т.е. работающих) потоков.См. this .

Также помните о других системных вызовах мультиплексирования (таких как poll (2) ), о неблокирующем IO ( fcntl (2)) с O_NONBLOCK), асинхронного ввода-вывода (см. aio (7) ).

Я рекомендую использовать некоторые существующие цикл обработки событий* Основанная на библиотека (см. libev , libevent , Glib , Poco , Qt , ..или для HTTP в основном: libonion на стороне сервера, libcurl на стороне клиента).Посмотрите также на 0mq .

Понятия, связанные с обратными вызовами , продолжениями , CPS , могут быть полезны и улучшить вашимышление.

Такие языки, как Го и его горутины, могут быть полезны.

Может зависать вечно ....

Этого не должно быть, еслиВы тщательно проектируете свою программу (конечно, имея циклы событий, используя что-то вроде poll или epoll_wait - с ограниченной задержкой менее секунды и, вероятно, предпочитая неблокирующий ввод / вывод).

Возможно, тратянесколько недель, чтобы узнать больше о операционных системах концепции должны быть полезны.Также предпочтение следует отдавать пониманию большинства системных вызовов (перечисленных в syscalls (2) ) после прочтения дополнительной информации о программировании для Linux (например, старая книга ALP или что-то более новое).Возможно, вам не нужно что-то более сложное, чем epoll (потому что достаточно просто poll).

...