чат, покритикуй концепцию реализации сервера. существующая реализация не
нравится тем, что блокирующие 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 в воркер тредах.
hirthwork
15.04.2012 21:23 mcabberC1E1F411
Do you really want to delete ?
Если перевести сокеты в неблокирующий режим, то разница по производительности между твоим вариантом и однотредовым будет минимальна, поскольку чтобы обработать данные все равно надо дождаться пока их пришлют. Но для логического разделения и возможности масштабирования в будущем это полезно, да.
данных дождаться нужно, да, но что мешает дожидаться, скажем, первые восемь килобайт с заголовками в то время пока запрос висит в очереди на обработку?
Не распарсил вопрос
я имел в виду, что при таком подходе для тех запросов, которые ждут в очереди на обработку, таки можно выполнить часть полезной работы
В большинсте случаев это будет слишком большим усложнением кода по сравнению с возможным выиграшем в производительности.
Это имеет смысл в железе, которое пакеты форвардит, например, там промежуточные устрйства как раз и вносят основную задержку. А для вычислений тебе все равно надо дождаться полных данных. Хотя... Если ты таки можешь по заголовку сдедать существенную часть работы, то это можеть помочь выравнять нагрузку, делая предварительную обработку заголовков пока есть свободное время. Если же по заголовку ты можешь сделать только маленькую, статистически несущественную, часть работы, то проще забить чем ебаться и отлаживать все это ради прироста производительности на 0.001% в 0.01% случаев
Черт, это было в ответ на /4