Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Реально ли написать мощный сервер на .NET? Добавлено: 16.11.11 10:06  

Автор вопроса:  AgentFire | ICQ: 192496851 

Ответить

  Ответы Всего ответов: 28  

Номер ответа: 16
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #16 Добавлено: 22.11.11 10:05
Зачем тебе еще варианты если уже озвучен самый оптимальный?

Они есть, но никто в своем уме не станет на них писать сервер под такую нагрузку.

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

1) Она будет занимать относительно короткие промежутки времени (например, на получение сообщения потратилось 100мс, а на парсинг потратится 2 мс)
2) Сделать асинхронной ее в принципе невозможно (асинхронность работает только тогда когда речь идет об операциях ввода-вывода)
3) Сделать асинхронной ее возможно, но настолько сложно, что об этом можно забыть (например, работа с СУБД - хотя это и операция ввода-вывода, и ADO .NET имеет на низком уровне функции асихнронного выполнения, почти все системы Data Mapping, в т.ч. LinQ 2 SQL и Entity Framework, не поддерживают эту опцию).

Ответить

Номер ответа: 17
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #17 Добавлено: 22.11.11 10:27
Не лучше ли будет использовать дальшейшую обработку сообщения все-таки не в одном потоке, а в стольких, сколько ядер в системе?

Ответить

Номер ответа: 18
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #18 Добавлено: 22.11.11 10:48
AgentFire пишет:
Не лучше ли будет использовать дальшейшую обработку сообщения все-таки не в одном потоке, а в стольких, сколько ядер в системе?

При условии, что твоя "обработка" хорошо паралелится, в чем я лично сомневаюсь.. Далеко не все задачи имеет смысл паралелить, поскольку потери ресурсов на переключения контекста потоков будут значительно выше потерь при обработке задачи в одном потоке.

Ответить

Номер ответа: 19
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #19 Добавлено: 22.11.11 10:53
Кроме того получать данные ты будешь ассинхронно (читать в ,отдельном, уже созданном системой потоке) поэтому не имеет смысла порождать еще один поток для обработки полученного сообщения

Ответить

Номер ответа: 20
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #20 Добавлено: 22.11.11 11:28
Я нигде не писал что все делать нужно в одном потоке. Кол-во потоков нужно подбирать в зависимости от того что делается. В определенных случаях есть смысл делать кол-во рабочих потоков больше чем кол-во ядер

Ответить

Номер ответа: 21
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #21 Добавлено: 22.11.11 11:30
EROS пишет:
При условии, что твоя "обработка" хорошо паралелится, в чем я лично сомневаюсь.. Далеко не все задачи имеет смысл паралелить, поскольку потери ресурсов на переключения контекста потоков будут значительно выше потерь при обработке задачи в одном потоке.

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

Ответить

Номер ответа: 22
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #22 Добавлено: 22.11.11 11:36
EROS пишет:
Далеко не все задачи имеет смысл паралелить, поскольку потери ресурсов на переключения контекста потоков будут значительно выше потерь при обработке задачи в одном потоке.

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

Ответить

Номер ответа: 23
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #23 Добавлено: 22.11.11 12:34
Я имею ввиду следующую картину:

Есть Сетевой модуль, который благополучно принимает сообщения и ставит их в очередь Обработчика на обработку. Этот модуль умеет только принимать сообщения (допустим, в JSON), парсить их, ставить в эту очередь в виде экзепляра класса сообщения и, помимо приёма, он имеет свою собственную очередь таких же сообщений на отправку.

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

Как вам?

Ответить

Номер ответа: 24
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #24 Добавлено: 22.11.11 13:12
json неэфективен, поскольку парсинг будет сложным, плюс передается много "мусора" (сравнимо с XML).
Парсинг сообщения должен выполняться после постановки сообщения в очередь для обработки

По поводу кол-ва потоков сказано было достаточно, их может быть от 1 до N, где N больше кол-ва ядер. Зависит от того, куда уйдет нагрузка при обработке сообщения, и насколько хорошо параллелится собственно процес обработки одного сообщения.

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

Сделать мало потоков - могут быть простои, сделать много - будет борьба за CPU и переключения контекстов. Впрочем второе не так плохо.
Нужно будет имитировать нагрузку, сходную с реальной и подбирать параметры.

Ответить

Номер ответа: 25
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #25 Добавлено: 22.11.11 15:00
Забукмаркал, спасибо.

Ответить

Номер ответа: 26
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #26
Добавлено: 22.11.11 22:01
Не пойму, в плане чего JSON сложнее и мусорнее XML? Сама разметка ведь наоборот легче

Ответить

Номер ответа: 27
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #27
Добавлено: 22.11.11 22:18
Артем же сказал, что мусора "сравнимо с XML". Думаю, что так и есть. С бинарными форматами трудно сравнивать.

С бинарными легко если простая структура пакета. Если что-то сложная - довольно геморно писать построители/парсеры.

В телекомах используют интеерсную вещь, называется ASN.1. Я так понял, что там как-то формально описывается структура данных, а потом можно автоматом сгенерить для этого формата парсер. Должно быть удобно. Сам не пользовал :)

Ответить

Номер ответа: 28
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #28 Добавлено: 13.04.12 14:37
Ну, я думаю, сгенерить его не так уж и сложно. Если можно перебрать все даненые структуры по порядку.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам