I>А там можно выделить максимальное число потоков на обслуживание тасков? Если да — то тот жы поставщик-потребитель, только в профиль. Если нет — на нагрузках ТС(тысячи подключенных клиентов, которых надо оповестить сотни раз в секунду) оно все равно умрет. Может чуть медленее.
Советую сделать эксперимент а не теоретизировать.
И почитать про work stealing у тасков.
И почитать про IO Completion Port.
Последовательный вызов тысяч клиентов да ещё и в торговой системе это звучит даже не смешно а страшно.
Вместо тасков можно попробовать асинхронный вызов, используя асинхронный IO.
Результат вызова всё равно придёт через IO Completion Port но смысл в том что во время вызова не будет задействован поток.
Tom>>А причём тут трафик вообще? Я про последовательный/паралельный вызов колбэков... I>А ет следующий вопрос, который задаст ТС
Я не умею читать мысли на расстоянии.
Здравствуйте, alex_2371430, Вы писали:
_>Нет,после вызова GetConsumingEnumerable коллекция не лочится.Одновременно несколько потоков пихают в нее данные,и несколько обрабатывают.
Ога, почитал доку — так и есть. _>Я не думаю что проблема в коде,скорее дело в конфигурации или каких-то хитростях WCF.При локальном подключении (сервер и клиент запущен на одной машине) скорость возрастает в 2-3 раза.
Разница есть. В чем — хз, скорей всего оптимизация на уровне драйверов сетевухи — емнип loopback. _>Предметную область ты понял правильно,нужно отдавать маркетдату клиентам, цель — хотя-бы 3-4к апдейтов на всех пользователей.
"На всех" — это на скольких? От этого много зависит. Даже если удасться написать "идеальный" сервис, то все упрется в пропускную способность канала провайдера. Поэтому определись, сколько одновременных коннекшнов надо держать и действительно нужно ли им получать по 4 тыщи пакетов инфы в секунду. Ну и оптимизируй размер пакета.
Вот тебе инфа для размышления.
Допустим у тебя подключено всего ничего 100 клиентов и ты на них гониш по 4000 пакетов инфы в секунду, размером по 100 байт каждый(что сущие копейки, один хеш пароля будет весить раз в 5 больше), то тебе надо иметь на сервере канал шириной 100*4000*100 = 40Мбайт/сек = 320Мбит/сек. Запас для надежности хотя бы раза в 3 накинь...
Думай. Большы сказать не могу.
Здравствуйте, Tom, Вы писали:
Tom>И почитать про IO Completion Port.
Я в курсе. Это противоречит использованию очереди для асинхронной отправки пакета/ожидания ответа?
I>>А ет следующий вопрос, который задаст ТС Tom>Я не умею читать мысли на расстоянии.
А я умею
Tom>>И почитать про IO Completion Port. I>Я в курсе. Это противоречит использованию очереди для асинхронной отправки пакета/ожидания ответа?
Это противоречит заявлениям что оно убьёт производительность.
Тем более есть огромные сомнения что твоя очередь будет более эффективной чем та что реализована внутри IO Completion Port.
Здравствуйте, Tom, Вы писали:
Tom>>>И почитать про IO Completion Port. I>>Я в курсе. Это противоречит использованию очереди для асинхронной отправки пакета/ожидания ответа? Tom>Это противоречит заявлениям что оно убьёт производительность. Tom>Тем более есть огромные сомнения что твоя очередь будет более эффективной чем та что реализована внутри IO Completion Port.
Я заявлял что использование IO Completion Port убьет производительность? Я высказывался что возможно использование тасков может это сделать.
В любом случае я советовал ТСу заюзать готовую библиотеку, а не заниматься велосипедостроением.
I>Я заявлял что использование IO Completion Port убьет производительность? Я высказывался что возможно использование тасков может это сделать.
Дефолтный шедулер т асков выполняет их в пуле потоков который по сути является обьектом IO Completion Port.
I>В любом случае я советовал ТСу заюзать готовую библиотеку, а не заниматься велосипедостроением.
Главное что бы это НЕ была библиотека сокетов...
Здравствуйте, Tom, Вы писали: I>>В любом случае я советовал ТСу заюзать готовую библиотеку, а не заниматься велосипедостроением. Tom>Главное что бы это НЕ была библиотека сокетов...
На это я тоже указал ТСу, он как раз хотел заюзать "родные" сокеты.
Здравствуйте, itslave, Вы писали:
I>Здравствуйте, Tom, Вы писали: I>>>В любом случае я советовал ТСу заюзать готовую библиотеку, а не заниматься велосипедостроением. Tom>>Главное что бы это НЕ была библиотека сокетов... I>На это я тоже указал ТСу, он как раз хотел заюзать "родные" сокеты.
Возможно я не правильно понял,но ты советовал взять готовую надстройку над сокетами с готовым функционалом:
I>Тем что прийдется очень многие веще реализовывать вручную. Ту же очередь поставщик-потребитель, поддержку безопасного соединения, хождение через прокси сервера, I>обработку ошибок, передачу креденшналов, обработку обрывов соединений и многое другое. Другими словами вы построите кучу велосипедов с квадратными колесами, I>убьете дофига сил и времени, чтобы сделать колеса восьмиугольными и будете жутко гордиться своими достижениями.
А Tom вообще советует отказаться от сокетных библиотек
_>А Tom вообще советует отказаться от сокетных библиотек
Не, надстройки, если они человеческие конечно можно использовать.
Но напрямую работать с сокетами лучше не стоит.
Иначе придётся заботиться о многих вещах самому.
Писать свой протокол, заботиться об определении того что клиент/сервер "умер", т.е. о пересоздании соединения и в целом о reliability, заботиться о протоколе, очень часто при этом приходится делать протокол с подтверждениями, а это влечёт за собой создание state machine.
vf>С этим понятно, здесь никаких препятствий нет. А какое отношение ThreadPool к IOCP имеет?
Самое непосредственное.
На Windows пока ещё не придумали как эффективно реализовывать Thread Pool без IOCP.
В .NET пуле их правда 2 используется, для IO и Worker потоков.
Здравствуйте, Tom, Вы писали:
vf>>С этим понятно, здесь никаких препятствий нет. А какое отношение ThreadPool к IOCP имеет? Tom>Самое непосредственное.
Пруф дайте, пожалуйста.
Tom>На Windows пока ещё не придумали как эффективно реализовывать Thread Pool без IOCP. Tom>В .NET пуле их правда 2 используется, для IO и Worker потоков.
Каким образом работает ThreadPool в связке с IOCP для Worker потоков, как вы себе это представляете?
vf>Каким образом работает ThreadPool в связке с IOCP для Worker потоков, как вы себе это представляете?
У IOCP есть 5 внутренних очередей. Все перечислять не надо?
Одна из этих очередей — очередь завершённых операций воода вывода.
Если в этой очереди есть пакет — IOCP будит один из потоков и отдаёт ему на обслуживание этот пакет (поток ожидает получения при помощи вызова GetQueuedCompletionStatus).
В эту очередь так же можно записать пакет руками, вызвав функцию PostQueuedCompletionStatus.
Таким образом если мы хотим организовать обработку каких то заданий асинхронно ThreadPool-ом построенным на основе IOCP то мы просто можем вызывать PostQueuedCompletionStatus. PostQueuedCompletionStatus так же используется для того что бы завершить поток ожидающий пакета из IOCP.
Обычно у каждого процесса есть дефолтный Thread Pool, он нужен например для того что бы обрабатывать входящие RPC вызовы, либо срабатывания таймера.
В 2008-ой появилось новое API для работы с ThreadPool-ом (CreateThreadpool и иже с ним... ).
Это обёртка над IOCP, разница с чистым IOCP заключается в том что в случае IOCP потоками управляешь ты сам, т.е. сам решаешь когда и сколько их создать и когда разрушать. В случае ThreadPool API это решает за тебя OS
I>Любая сетевая библиотека по сути есть "надстройка над сокетами"
HTTP стек не является. По крайней мере серверная сторона.
Он перенесён на уровень драйвера.
Это дало например возможность реализовать в IIS-е Application Pool-ы и в целом шарить один и тот же порт с различными приложениями.
Здравствуйте, Tom, Вы писали:
_>>А Tom вообще советует отказаться от сокетных библиотек Tom>Не, надстройки, если они человеческие конечно можно использовать. Tom>Но напрямую работать с сокетами лучше не стоит. Tom>Иначе придётся заботиться о многих вещах самому. Tom>Писать свой протокол, заботиться об определении того что клиент/сервер "умер", т.е. о пересоздании соединения и в целом о reliability, заботиться о протоколе, очень часто при этом приходится делать протокол с подтверждениями, а это влечёт за собой создание state machine.
Приведи,пожалуйста, пример "человеческих" библиотек?