[sisyphus] Re: Как ускорить работу с потоками?
Serge Pavlovsky
=?iso-8859-1?q?pal_=CE=C1_interexc=2Ecom?=
Пн Сен 13 04:19:15 MSD 2004
On Сбт, 2004-09-11 at 01:32 +0400, Денис Смирнов wrote:
> On Fri, Sep 10, 2004 at 08:21:34PM +0300, Serge Pavlovsky wrote:
> >> epoll, например :)
> >> select/poll на худой конец.
> SP> когда вы в последний раз измеряли производительность epoll/select/poll
> SP> на 100к сокетов ?
> SP> конечно, epoll быстрее, чем select, но недостаточно
>
> Я не мерял на 100k сокетов. Поделитель тестовым кодом, если вы меряли?
я пробовал реальное приложение. при сотнях штук уже кроме селекта ни на
что времени не оставалось. и зависимость таки была скорее квадратичная,
чем линейная.
> И думается мне, что на 100k сокетов будет эффективнее всего работать
> смешаная модель (epoll + нити).
спящие нити при правильном ( О(1) ) шедулере никому не мешают. а epoll -
мешает
> >> Самое разумное -- выносить в отдельные нити _обработку_, а как раз ждать и
> >> данными кидаться в небольшом количестве нитей (в несколько раз больше чем
> >> количество процессорв, для большей равномерности).
> SP> многие весьма неглупые на вид люди тоже так наивно полагают. на самом
> SP> деле это получится один в один доморощенная реализация user-level
> SP> threads - там тоже один большой select. только вот сложность получается
> SP> O(n^2) - чем больше потоков, тем чаще им надо читать * на тем больше
> SP> накладных расходов на каждый select. спрашивается, зачем делать самому
> SP> userlevel threads и зачем вообще это делать если оно очень быстро
> SP> начинает дико тормозить ?
>
> Причём тут userlevel threads? Видимо вы меня неправильно поняли. Я не
> предлагаю городить диспетчер, который бы распихивал по потокам пришедшие
> события, боже упаси. Я предлагаю гораздо более тупую (т.е. простую) и
> эффектвиную схему: в момент создания соединения сокет привязывается
> статически к одной из нитей, и обрабатывается уже только ей. Нити
> используем для более эффективного использования нескольких процессоров (да
> и одного тоже несколько нитей будут эффективнее использовать) а epoll для
> формирования очереди сообщений на обработку.
это вы меня не правильно поняли ;)
нету никакой обработки - вся работа с сокетами. прочесть - записать. все
время уходит на poll. зачем же еще тратить время на очередь сообщений ?
userlevel threads, если от них отрезать переключение контекста, как раз
представляют собой генерацию одного большого select на каждый чих вроде
read() или write(). и тормозит как раз это, а не переключение контекста.
> Ну и на 100k нитей что-то мне не верится что Linux на этом не будет
> загибаться.
ну, на нашем ядре/libc - будет. но мы ведь дождемся светлого будущего ;)
Подробная информация о списке рассылки Sisyphus