Windows 2003 ошибка сокета сервера 10055 - PullRequest
1 голос
/ 16 июня 2011

Я запустил очень большое приложение на сервере Windows 2003. Он создает почти 900 потоков и один поток, который работает на сокете. Это приложение на C ++, которое я скомпилировал в среде Visual Studio.

После почти 17-20 часов тестирования я получаю сообщение об ошибке 10055 при отправке данных. Помимо этой ошибки, мое приложение отлично работает без каких-либо ошибок или проблем. Это четырехъядерная система с 4 ГБ ОЗУ, и это приложение занимает около 30-40% ЦП (на всех 4 ЦП) во всех своих работах.

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

Ответы [ 3 ]

1 голос
/ 16 июня 2011

Я думаю, что невозможно сказать mo чем:

Ошибка 10055 означает, что в Windows закончились буферы сокетов TCP / IP, потому что слишком много соединений открыто одновременно.

http://kbase.pscs.co.uk/index.php?article=93

https://wiki.pscs.co.uk/how_to:10055

0 голосов
/ 18 июня 2011
 It creates almost 900 threads

Это частично ваша проблема. Каждый поток, скорее всего, использует 1 МБ стека по умолчанию. Вы начинаете приближаться к ГБ потока потока. Шансы на нехватку памяти высоки. Весь смысл использования IOCP заключается в том, что вам не нужно создавать «поток на соединение». Вы можете просто создать несколько потоков (от 1x до 4x числа процессоров), чтобы прослушивать обработчик порта завершения и каждый поток обслуживать свой запрос для максимизации масштабируемости.

Я вспоминаю, как читал статью, связанную с переполнением стека, в которой буферы, которые вы публикуете для ожидающих операций IOCP, настроены таким образом, что операционная система НЕ позволит памяти поменяться с физической памяти на диск. И тогда вы можете исчерпать системные ресурсы, когда количество подключений станет большим.

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

0 голосов
/ 16 июня 2011

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

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

Возможно, у @Len Holgate есть кое-что, что он может добавить сюда, он мой "goto guy" для проблем с сокетами Windows.

...