Этот контент много раз обсуждался в блогах cn. За последние два дня я прочитал некоторую информацию, увидел несколько простых показателей эффективности и обсудил ее со всеми.
Сокет + потоки/пул потоков
Приблизительная производительность: менее 1500 подключений.
Реализация: принять сокет и оставить его для управления потоком. Это относительно глупо, но в то же время более эффективно. Поскольку это синхронный метод, им очень удобно управлять. Более сложная задача — передать его для управления пулу потоков. Пул потоков автоматически размещается в системе, что позволяет сэкономить время на накладные расходы. Для общих небольших проектов этого вполне достаточно и разработка проста. Но имейте в виду, что если несколько сокетов занимают потоки в пуле потоков в течение длительного времени и имеется много других соединений, легко получить сообщение о том, что у вас недостаточно потоков для использования. Ха-ха, это хорошая идея — позволить Socket выполнять меньше работы и отнимать меньше времени. Переход на более быстрый процессор — хороший способ. Кроме того, если есть более качественные сторонние компоненты пула потоков, вы также можете использовать их, например SmartThreadPool.
Розетка+Выбрать
Приблизительная производительность: производительность снижается после более чем 1500 подключений.
Реализация: Select — очень часто используемая модель. Это опрос одного или нескольких сокетов в функции блокировки и помещение сокета для обработки в список IList. Когда опрос выбора будет завершен, мы сами обработаем сокет в этом списке IList. Подробную информацию об использовании см. в MSDN. Эффективность Select нельзя назвать высокой, потому что, когда в очереди много сокетов, подлежащих обработке, обработка нескольких последних сокетов эквивалентна обходу всех предыдущих сокетов, что очень неэкономично.
Розетка+Асинхронный
Примерная производительность: около 7500 клиентских подключений.
Реализация: BeginXXXX, EndXXXX, мы все с этим знакомы. В конечном счете, асинхронный Socket по-прежнему использует технологию пула потоков, используя пул потоков для обработки асинхронного ввода-вывода. Возникает еще один вопрос: какой метод реализации используется для пула потоков .NET. Раньше я видел, как кто-то говорил, что пул потоков .NET реализуется с использованием портов завершения. Я не знаю, правильно ли это. Нет способа это подтвердить. из информации, которую я нашел (надеюсь, друг мне это подскажет). Асинхронный сокет намного сложнее, чем синхронный поток обработки программы, и управление асинхронными функциями обратного вызова не так интуитивно понятно, как синхронный метод. Но я думаю, следует отметить одну вещь: функцию обратного вызова следует использовать с осторожностью и не следует обрабатывать слишком много транзакций. Обработку переданных данных следует оставить другим потокам для обработки.
IOCP (порт завершения)
Приблизительная производительность: около 20 000–50 000 клиентских подключений
. Реализация: в .NET есть несколько псевдо-IOCP. Вы можете найти их. Я не видел примеров открытых SOCKET, реализованных с использованием этих псевдо-IOCP. 20 000–50 000 клиентских подключений, о которых я говорю, относятся к ситуации разработки на C++. В этом случае базовые технологии, которые необходимо использовать, включают пулы памяти, алгоритмы запросов и т. д.
Нет информации, позволяющей проверить максимальное количество соединений, которое может достичь псевдо-IOCP. Если кто-нибудь знает, можете обсудить это. Кроме того, многие из приведенных выше данных взяты из некоторой информации, которую я сам не пробовал, а просто выношу для обсуждения со всеми. Я думаю, что для высокопроизводительной серверной программы может потребоваться технология, которая заключается не только в том, какую модель использовать, но и во многих деталях, на которые необходимо обратить внимание, например, обработка памяти, какой алгоритм использовать и т. д. Конечно, это только с точки зрения стоимости программного обеспечения. Обязательно будут инвестиции в оборудование.