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

标签 c++ linux sockets systemd

我有一个 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/

相关文章:

c++ - 终值公式显示了惊人数量的输出

linux - Ubuntu : upgrading software (cmake) - version disambiguation (local compile)

linux - 未调用 MCP23017 I2C 设备驱动程序探测函数

c++ - std::partition 分割对象类型的 vector 时出错

c# - 如何创建和维护代码重用库?

c++ - 字符数据类型列在整数类型下

linux - Docker init Daemon最佳实践(PID 1僵尸收割)

客户端/服务器之间的 C++/Winsock TCP 发送/接收问题

ruby-on-rails - 零停机时间的目标,如何使用套接字和 (g)unicorn : 的 Upstart

Android UDP 点对点网络通信(无服务器)