У меня есть системный .socket в паре с @ .service. Сокет содержит «Accept = yes» для принятия TCP-соединения от клиента через указанный порт, после чего создается экземпляр @ .service, который выполняет мою серверную программу для обработки TCP-соединения. В настоящее время я тестирую один клиент (программное обеспечение Windows), подключающийся к серверу (linux c ++).
Моя проблема заключается в том, что при первой попытке клиентского соединения TCP-соединение успешно, но с большой задержкой (5-10 секунд), прежде чем systemd запускает связанный @ .service. Любые последующие подключения запускают @ .service практически сразу, ЕСЛИ не получен пакет TCP RST. Если получен пакет TCP RST, следующее соединение снова с задержкой в 5-10 секунд перед запуском @ .service и цикл повторяется.
Мой файл .socket очень прост. Для части [Socket] он просто указывает порт ListenStream и Accept = true.
Есть идеи, что может быть причиной этой задержки?
Первое, что приходит мне в голову, это то, что самому systemd не хватает процессора, чтобы принять соединение, но, возможно, это не то, чем он является, поскольку вы думаете, что он как-то связан с пакетом TCP RST.
Вы можете изменить уровень журнала для отладки в /etc/systemd/system.conf и получить больше информации о том, когда systemd фактически принимает соединение.
Как это работает, systemd прослушивает сокет в файле .socket и помещает epoll в дескриптор файла. Как только в сокете происходит активность, systemd получает уведомление в своем цикле событий. Затем он принимает соединение и запускает программу, указанную в файле .service.