Проблема высокопроизводительного сервера C # TCP: не удалось установить соединение, поскольку целевая машина активно отказывала в этом - PullRequest
6 голосов
/ 04 июня 2011

Я разработал TCP-сервер в соответствии с вашими советами: Высокопроизводительный TCP-сервер на C #

Он основан на асинхронном шаблоне.

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

Когда я испытываю стресс на моем сервере, я могу получить «System.Net.Sockets.SocketException» Нет соединенияэто может быть сделано, потому что целевая машина активно отказывала в этом «ошибка моего сервера, поэтому мне нужно повторно подключиться к ней. Если я проверяю ее с 5000 одновременных подключений, я должен попытаться подключиться снова из-за этой проблемы 10-20% подключений, если я тестирую его с 10K одновременных соединений, это может быть 30-40%. Иногда это может быть - очень редко - больше, чем 50%. Кажется, он не может обработать соединение принимает: я устанавливаю новые соединения из моего стресс-теста кактак сильно, как может моя тестовая машина - около 120 соединений / сек.

Итак, что может вызвать такого рода исключения? Как с этим справиться? Что делать в реализации на стороне сервера, чтобы избежать этой проблемы? Как настроить TCPсоединение принимаете?

Заранее спасибо!

Ответы [ 2 ]

7 голосов
/ 04 июня 2011

Возможно, вам не хватает доступных портов время от времени.Вы можете легко просмотреть это с помощью утилиты SysInternals TcpView.

В Windows, когда вы освобождаете порт, он не сразу переходит в доступное состояние, а вместо этого находится в состоянии TIME_WAIT в течение некоторого интервала.Пока он не выйдет из этого состояния, ни одно приложение не сможет использовать этот порт.Задержка по времени, максимальное количество портов и доступные диапазоны портов отличаются от ОС, XP против Win7 против сервера Win2008.

Существуют две записи реестра, которые могут сократить этот интервал времени: HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/TCPTimedWaitDelay

и увеличьте максимальное количество портов, которые могут быть открыты приложением: HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/MaxUserPort

РЕДАКТИРОВАТЬ: MaxFreeTcbs, кажется, третий параметр, который может помочь (я не пробовалэто еще), упомянутое в этой статье TechNet , в которой содержатся дополнительные рекомендации по отслеживанию нечетных сетевых проблем.НТН.

2 голосов
/ 04 июня 2011

Вы устанавливаете соединения быстрее, чем программное обеспечение может прослушивать новые соединения, или, другими словами, вы достигаете количества соединений в секунду для этого порта. Я думаю, что вы можете удвоить количество соединений в секунду, прослушивая второй порт, на стороне клиента вы должны просто переподключиться, когда получите исключение.

Существуют также ограничения на количество подключений, см. Ответ Криса О .

...