2015-02-05 3 views
-1

У меня есть системный .socket в сочетании с @ .service. Сокет содержит «Accept = yes», чтобы принять TCP-соединение от клиента по указанному порту, после чего создается экземпляр @ .service, который выполняет мою серверную программу для обработки TCP-соединения. В настоящее время я тестирую с одним клиентом (программное обеспечение Windows), подключающимся к серверу (linux C++).Системный разъем с «Accept = true» имеет длительную задержку перед запуском службы.

Проблема заключается в том, что при первом попытке подключения к компьютеру соединение с TCP успешно завершено, но существует большая задержка (5-10 секунд), прежде чем systemd запускает связанный с ним. Любые последующие соединения сразу запустит @ .service, . Если не принят пакет TCP RST. Если принят пакет TCP RST, следующее соединение снова задерживается на 5-10 секунд до запуска @. Службы, и цикл повторяется.

Файл .socket очень прост. Для части [Socket] он действительно просто указывает порт ListenStream и Accept = true.

Любые идеи, что может вызвать эту задержку?

ответ

0

Первое, что приходит мне на ум, заключается в том, что сама система не получает достаточного количества CPU для приема соединения, но, возможно, это не так, как вы думаете, что это связано с TCP RST-пакетом.

Вы можете изменить уровень журнала для отладки на /etc/systemd/system.conf и получить дополнительную информацию о том, когда система действительно принимает соединение.

Как это работает, systemd прослушивает сокет в файле .socket и помещает epoll в дескриптор файла. Как только в соке есть активность, systemd получает уведомление в своем цикле событий. Затем он принимает соединение и запускает программу, указанную в файле .service.

+0

Изменение уровня журнала определенно помогает узнать больше информации, касающейся времени. Что странно, я изменил свой код для того, чтобы клиент потребовал «готовый» пакет tcp с сервера, прежде чем инициировать соединение SSL (в попытке учесть задержку systemd при запуске сервера), и с тех пор, как я не был способный воссоздать эту задержку. Но ваша информация помогла подтвердить, как systemd работает с сокетом и поможет мне отлаживать, если я смогу заставить это повториться, так что спасибо. – schumacher574

+0

Почему это принятый ответ? Это даже не ответ. – LtWorf