LINUX.ORG.RU

Что лучше: 1 poll для всех дескрипторов, или несколько poll'ов в разных потоках


0

0

В общем если подробнее, имеется большая программа, которая соединяется со множеством клиентов по сети, через именованные каналы, и проч. В общем около 50 открытых дескрипторов одновременно есть всегда. Программа работает с ними асинхронно, имеет кучу потоков, и сейчас нужно ее оптимизировать. Какая реализация будет эффективнее с точки зрения работы вызова poll: 1 вызов poll, который прерывается при необходимости добавить новый дескриптор в массив pollfd, или несколько вызовов poll в разных потоках?


Если в нескольких потоках, то придётся прерывать все poll'ы, чтобы добавить новый дескриптор. Делить дескрипторы на несколько кучек опасно: нагрузка может получиться сильно неравномерной. Можно юзать epoll в нескольких потоках. ЕМНИП, изменение состояния epoll'а в одном потоке не требует перезапуска epoll_wait в других. Если не хочется вылезать за рамки стандартных средств, то можно сделать один поток, крутящийся в poll() и раскидывающий евенты по другим потокам.

const86 ★★★★★
()

epoll юзать не надо, пока не упретесь в производительность poll (упрощенно говоря, когда дескрипторов не станет хотя бы пара тысяч). Так же и разбивать единый poll на несколько не надо, пока в него всё не упрется - лучше сделать единый event loop, и из него раздавать работу другим нитям.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> epoll юзать не надо, пока не упретесь в производительность poll (упрощенно говоря, когда дескрипторов не станет хотя бы пара тысяч).

Почему не надо и что изменится если их будет больше пары тысяч? :). И почему бы не заюзать кроссплатфоренную либу типа libev которая сама разберётся какой бэкенд лучше подходит?

PS где-то читал что не все платформы могут в poll засунуть больше тыщи дескрипторов. может, путаю...

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> И почему бы не заюзать кроссплатфоренную либу типа libev которая сама разберётся какой бэкенд лучше подходит?

Правильная мысль. А libev умеет в нескольких потоках сразу?

const86 ★★★★★
()
Ответ на: комментарий от true_admin

>> epoll юзать не надо, пока не упретесь в производительность poll (упрощенно говоря, когда дескрипторов не станет хотя бы пара тысяч).

> Почему не надо

По бритве Оккама.

> и что изменится если их будет больше пары тысяч? :)

Пара тысяч - это для примера. Изменится то, что для реально большого (не 50) числа дескрипторов epoll эффективнее, чем poll.

> И почему бы не заюзать кроссплатфоренную либу типа libev которая сама разберётся какой бэкенд лучше подходит?

Из-за уродства libev и снова по бритве Оккама - интересует ли топикстартера кроссплатформенность вообще?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Из-за уродства libev

что там не так? не путаешь с libevent?

> и снова по бритве Оккама - интересует ли топикстартера кроссплатформенность вообще?

когда заинтересует будет уже поздно.

true_admin ★★★★★
()
Ответ на: комментарий от tailgunner

> лучше сделать единый event loop, и из него раздавать работу другим нитям.

+1

CL-USER
()
Ответ на: комментарий от const86

Так сейчас и реализовано А еще 2 вопроса по поводу особенностей poll: как лучше прервать ожидание poll? Сейчас в списоке дескрипторов храниться pipe, когда нужно удалить или добавить новый, в него пишется байт, и poll останавливается. Как вЫ перезапускаете poll? и еще такой вопрос, правильно ли выключать дескриптор, просто обнулив его pollfd.events? В линуксе похоже работает, а вдругих юниксах?

sotlef
() автор топика
Ответ на: комментарий от sotlef

> А еще 2 вопроса по поводу особенностей poll: как лучше прервать ожидание poll? Сейчас в списоке дескрипторов храниться pipe, когда нужно удалить или добавить новый, в него пишется байт, и poll останавливается.

Можно так, а можно pthread_kill().

> правильно ли выключать дескриптор, просто обнулив его pollfd.events? В линуксе похоже работает, а вдругих юниксах?

Перечитал ман. Не увидел, чтобы про это было явно сказано. Зато сказано, что если задать отрицательный .fd, то будет игнорироваться. Почему бы не перестраивать список для poll'а каждый раз заново?

const86 ★★★★★
()
Ответ на: комментарий от const86

перестраивать список както дороговато... сейчас когда я удаляю дескриптор, просто заменяю его pollfd pollfd крайнего элемента массива и уменьшаю размер массива на 1ку. Хотя сейчас нужно подумать над переделкой: что если несколько дескрипторов особенно активно обмениваются данными, то их нужно вынести в начало списка, чтобы быстрее их обработать.

sotlef
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.