"Accept=true" 的 systemd 套接字在服务启动之前有很长的延迟

systemd socket with "Accept=true" has long delay before service is launched

我有一个与@.service 配对的systemd .socket。套接字包含 "Accept=yes" 以便通过指定端口接受来自客户端的 TCP 连接,之后创建一个 @.service 实例,该实例执行我的服务器程序来处理 TCP 连接。目前,我正在测试一个客户端(Windows 软件)连接到服务器(linux c++)。

我的问题是,对于第一次客户端连接尝试,TCP 连接成功但在 systemd 启动关联的@.service 之前有很长的延迟(5-10 秒)。任何后续连接都将几乎立即启动 @.service,除非收到 TCP RST 数据包。如果收到 TCP RST 数据包,下一个连接将在 @.service 启动之前再次延迟 5-10 秒,然后循环重复。

我的.socket 文件非常简单。对于 [Socket] 部分,它实际上只是指定了一个 ListenStream 端口和 Accept=true.

任何可能导致此延迟的想法?

我首先想到的是 systemd 本身没有获得足够的 CPU 来接受连接,但也许事实并非如此,因为您认为它与 TCP RST 有关包。

您可以在 /etc/systemd/system.conf 上将日志级别更改为调试,并获得有关 systemd 何时实际接受连接的更多信息。

它的工作方式是,systemd 监听 .socket 文件上的套接字,并在文件描述符上放置一个 epoll。一旦套接字上出现 activity,systemd 就会在其事件循环中收到通知。然后它接受连接并启动 .service 文件中指定的程序。