我有一个 systemd .socket 与 @.service 配对。套接字包含“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 放在文件描述符上。一旦套接字上有事件,systemd 就会在其事件循环中收到通知。然后它接受连接并启动.service 文件中指定的程序。
关于c++ - 带有 "Accept=true"的 systemd 套接字在服务启动之前有很长的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28338730/