使用 systemd 套接字激活高并发时的高 cpu 和负载

使用 systemd 套接字激活高并发时的高 cpu 和负载

随着 rhel9 删除了 xinetd,我们开始转向 systemd 套接字激活以实现短期服务。但是在高并发的情况下(其实并没有那么高,最多只有50左右),主机负载和cpu使用率变高,负载3,cpu占用95%左右。似乎对于每个套接字激活的服务,systemd 都会为其创建一个 cgroup,并在进程结束时删除它,导致它消耗大量 cpu。有什么方法可以覆盖这种行为?为其创建切片没有帮助。使用xinetd就没有这个问题。

答案1

systemd 为其创建一个 cgroup,并在进程结束时将其删除,导致其消耗大量 cpu。有什么方法可以覆盖这种行为吗?

不; systemd 服务跟踪基本上是基于 cgroup 的。

如果无法构建自己的 xinetd 包,我建议移植该服务以继承倾听套接字而不是每个客户端套接字,并拥有自己的accept()循环(可能为每个客户端分叉以最小化所需的更改量)。 (x)inetd 也支持此模式作为“等待”模式;在 systemd 中,它被称为“Accept=no”(使用非实例化的 .service 单元)。

(类似的东西while (fd = accept()) { if (!fork()) handle_client(fd) }就足够了。)

相关内容