-1

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

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

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

任何想法可能导致这种延迟?

4

1 回答 1

0

我首先想到的是 systemd 本身没有获得足够的 CPU 来接受连接,但可能不是这样,因为您认为它与 TCP RST 数据包有关。

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

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

于 2015-02-06T11:57:56.933 回答