C # Socket Производительность чтения / записи - PullRequest
0 голосов
/ 11 июня 2018

Я разрабатываю игровой TCP-сервер и планирую выдерживать до 500 соединений.Передача данных происходит постоянно (движение персонажа, атака и т. Д.).

Я начал разработку с TCPListener , но у меня возникла проблема с производительностью.Я использовал методы await XXXSync для приема клиентов, получения данных и отправки сообщений.

Я создал программу, которая имитирует действия игроков.Это позволило создать только 30-40 соединений, и это вызвало 100% загрузки процессора.Для тестирования своего сервера я использовал две машины: одна была симулятором игроков, а другая - сервером.Эти 30-40 клиентов загружают ЦП на сервере на 10-20% и очень сильно (при 100%) при одновременном отключении всех клиентов TCP.

Я искал информацию об оптимизации TCPListener, но ничего не нашел.Я видел темы, где люди писали, что у них есть сервер с более чем 1000 подключений, и это хорошо работает.

Я думал, что причина может быть в логике моего сервера, но инструменты профилирования показали, чтоОсновная часть загрузки процессора - это получение и отправка данных (ждите client.ReadAsync / client.WriteAsync). Изображение 1 | Рисунок 2


Я начал искать возможные альтернативы и нашел SocketAsyncEventArgs .На форуме люди писали, что этот метод может увеличить производительность в 2 раза.Я нашел исходные коды некоторых серверов, написанных на C #, и взял оттуда реализацию SocketAsyncEventArgs.

Это действительно значительно увеличило производительность в 10-15 раз.Для 30 симуляций это вызывает только 0,5-2%.

Я переписал эмулятор игроков в SocketAsyncEventArgs, и это позволило мне создать 100 симуляций с 20% CPU.

После 70 игроковнагрузка на процессор на сервере выросла и составляет 7-13%.Инструменты профилирования показывают, что основное использование ЦП - это отправка сообщений.Почему-то самым продуктивным вариантом для меня был BeginWrite.Запись не подходит, потому что это блокирует поток.WriteAsync был медленнее, или я просто неправильно его использовал. Изображение 3 | Изображение 4

Не могу найти информацию об оптимизации сокетов на c #.Все везде пишут, что у них все хорошо, даже на TCPListener, что для меня просто невыносимо.

Есть ли другой способ улучшить производительность?


PS Я тестировал сервер на компьютере с i7 седьмого поколения.

...