Почему происходит крах сервера на Linux?

Здравствуйте. Я уже не знаю что делать, стоять на голове или поверить в магию? Тестирую сервер написанный на сокетах беркли + событийный epoll(edge-triggered), сокеты не блокируемые, запросы обрабатываются в одном потоке, ядро системы linux-4.9.0-8-686-pae. Пока боролся с проблемой, весь код раздел, остался "скелет", так что запутаться сложно, хотя и изначально все было отточено, но блин..., хреновое лезвие получилось). В общем запускаю сервер, на этом же компе запускаю клиента(клиент создает несколько tcp-соединений через них и задает запросы, получает ответы), делаю порядка 100-200 запросов и ответов. С начала все ок(10-20 запросов без глюков), но с каждым новым запросом клиент начинает подвисать (как будто не достаточно данных пришло). Последние запросы вообще начинаются установкой tcp-соединения и сбросом со стороны сервера так как номер события epoll говорит что надо разъединяться и это в лучшем случае, в худшем, сервер пишет, пишет, пишет, а потом падает на функции write() при том что количество записанных байт перед падением всегда равно 21888 (на ответах разной длины)? Проверил все библиотечные функции на ошибки все работает правильно, смотрел errno после крашного write(), все по нулям. Что за фиговина)? Дайте хоть какую то пищу для размышления, а то прямо не знаю что думать.
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 3
firedragon
@firedragon
Senior .NET developer
Используйте знаки пунктуации, разметку.
Возможно стоит обратить внимание на параграфы.

Абзацы важны при оформлении части мысли.

Так же некоторые люди добавляют логи.

Но не всегда.

Всегда ваш инженер по удаленным пыткам пользователей которые ничего не сделали, оно само так
Ответ написан
CityCat4
@CityCat4
Кошки не похожи на людей, кошки - это кошки!
Дайте хоть какую то пищу для размышления, а то прямо не знаю что думать.

Происходит переполнение чего-то. Возможно, новые соединения не успевают устанавливаться или старые закрываются недостаточно быстро. Возможно переполняются некие ядерные буфера. Но на факт, что это переполнение чего-то указывает характер ошибки - сначала быстро, потом медленнее и медленнее и потом бэмц.
Ответ написан
@vanyamba-electronics
Сталкивался с подобным в Windows NT. Если память мне не изменяет, то чтобы всё работало, сервер при ответе должен порождать новый процесс, который и будет отвечать клиенту.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы