В чем может быть проблема связанная с сервером Linux?

Тестирую http-сервер написанный с помощью функций из заголовочных файлов sys/socket, sys/epoll и сопутствующих им. В общем, конструкция оформлена так, слушающий сокет: s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP), добавляется в набор epoll c маской EPOLLIN|EPOLLET. Когда epoll_wait возвращает событие на этом сокете, происходит вызов accept() возвращается дескриптор соединения, далее этот дескриптор также добавляется в набор epoll c маской EPOLLIN|EPOLLOUT|EPOLLET (сокеты неблокируемые). Далее ожидается возврат epoll_wait, с событиями, если even[i].data.fd равен слушающему сокету то (accept())регистрируем новый дескриптор соединения, если even[i].data.fd равен созданным дескрипторам соединений смотрим чему равно even[i].events если 1-чтение,4-запись,5-чтение/запись, если значение больше 5-(неполадка)закрываем соединение удаляем из набора epoll. Чтение и запись работают так: событие 1:внутренний переключатель(ВП) установлен на чтение(0), пока не получит все данные ВП=1, естественно прекращаем чтение при возврате -1(errno не проверяется), событие 4:если ВП==1 пишем пока все не отправим, после этого ВП=0, событие 5: ВП==0, читаем и пишем. (все операции чтения и записи прекращаются с возвратом -1, ВП переключается только после получения/отправки всех данных). Короче говоря все вроде отлажено. При запуске сервера, 40-400 запросов (в несколько tcp-соединениях)обрабатываются и отсылаються как надо, далее, замечаю что не все запросы отправленные http-клиентом получает сервер, и соответственно клиент не получает ответ, такое продолжается в 20-30 запросах, потом сервер "тухнет" и уже после каждого tcp-соединения, прочитает- немного запишет и следующее событие уже равно >5, соответственно соединение закрывается не пропустив ни единого ответа(как бы закрытие инициируется клиентом). В чем проблема? Уже длительное время не могу найти решение, изучал исходники nginx и заметил много setsockopt`ов (38шт.) и на слущающий сокет и на дескрипторах соединений, но что то думается что проблема может быть не в этом, уж как то подозрительно непостоянство обработанных запросов, иногда может и 300-400 обработать а иногда и с 40 с натягом справляется. Сталкивались с чем то подобным, что могло пойти не так? Не хочеться думать, но может проблема в ядре? LINUX у меня 4.9.0-8-686-pae. Дайте пищу для размышления!
  • Вопрос задан
  • 159 просмотров
Решения вопроса 1
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Уважаемый, Ваш вопрос нечитаем от слова совсем. Разбейте на абзацы, куски кода оформите тегами - может быть тогда кто-то и задумается. Поток сознания никто преодолевать не будет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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