hirthwork 15.04.2012 21:23 mcabberC1E1F411

чат, покритикуй концепцию реализации сервера. существующая реализация не
нравится тем, что блокирующие recv и send происходят в worker thread'ах, что не
есть самое рациональное их использование, ибо числом worker thread'ов хочется
регулировать процессорнозатратные операции, а не ожидание input'а.
итак.

треды деляться на три типа. read thread, write thread и worker thread'ы.
read и write треды разделил в надежде, что в системе будет full duplex.
read и write треды делают select и, затем, неблокирующий recv (или send).
после accept'а, в список читаемых сокетов добавляется новый сокет (защищено
мьютексом). ну а при завершении работы воркера — удаляется.
worker thread, когда хочет что-то записать в поток пушит указатель на данные и
размер в lock free очередь и, скажем, посылает сигнал write thread'у, чтобы он
вместо ожидания пока один удалённый сокет не разгребёт буфер, взял да сверил
список готовых читать сокетов со списком сокетов в которых есть данные (что
удобно, потому что write thread единственный читатель lock free очереди на
запись для сокета).
если есть данные, которые можно неблокирующе записать, тогда write thread
делает writev.
всё. с записью данных разобрались.

с чтением вроде не намного сложнее. воркер тред может оставить заявку в lock
free очереди, на то чтобы ему дали вот столько то данных и посылает сигнал read
thread'у, чтобы перестроил список сокетов, над которыми делается select. когда
select сказал что данные есть, в буфер, который пришёл с заявкой, записываются
пришедшие данные. и сигналится евент блокирующей функции, которую дёрнет
worker, когда эти данные потребуются ему уже позарез. всё.

а теперь скажите мне, какой велосипед я переизобрёл и почему это будет работать
хуже чем recv и send в воркер тредах.

Recommended by: @magog, @gelraen
1. gelraen 16.04.2012 00:55

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

2. hirthworkgelraen /1 16.04.2012 06:11 talkonaut-iphone_5.91_67b1c873

данных дождаться нужно, да, но что мешает дожидаться, скажем, первые восемь килобайт с заголовками в то время пока запрос висит в очереди на обработку?

3. gelraenhirthwork /2 16.04.2012 06:28

Не распарсил вопрос

4. hirthworkgelraen /3 16.04.2012 08:12 mcabber2927EFCA

я имел в виду, что при таком подходе для тех запросов, которые ждут в очереди на обработку, таки можно выполнить часть полезной работы

5. gelraenhirthwork /4 16.04.2012 09:19

В большинсте случаев это будет слишком большим усложнением кода по сравнению с возможным выиграшем в производительности.

6. gelraen 16.04.2012 11:52

Это имеет смысл в железе, которое пакеты форвардит, например, там промежуточные устрйства как раз и вносят основную задержку. А для вычислений тебе все равно надо дождаться полных данных. Хотя... Если ты таки можешь по заголовку сдедать существенную часть работы, то это можеть помочь выравнять нагрузку, делая предварительную обработку заголовков пока есть свободное время. Если же по заголовку ты можешь сделать только маленькую, статистически несущественную, часть работы, то проще забить чем ебаться и отлаживать все это ради прироста производительности на 0.001% в 0.01% случаев

7. gelraengelraen /6 16.04.2012 11:53

Черт, это было в ответ на /4

Do you really want to delete ?