rhel9에서 xinetd를 제거하면서 단기 서비스를 위해 systemd 소켓 활성화로 전환했습니다. 그러나 동시성이 높은 경우(실제로는 그렇게 높지 않고 최대 50개 정도) 호스트 로드와 CPU 사용량이 높아지며 로드 3에서는 CPU 사용량이 약 95%입니다. 소켓에 의해 활성화된 모든 서비스에 대해 systemd는 이에 대한 cgroup을 생성하고 프로세스가 끝나면 삭제하여 많은 CPU를 소비하게 되는 것 같습니다. 이 동작을 무시할 수 있는 방법이 있나요? 슬라이스를 만드는 것은 도움이 되지 않습니다. xinetd를 사용하면 이 문제가 발생하지 않습니다.
답변1
systemd는 이에 대한 cgroup을 생성하고 프로세스가 끝나면 삭제하므로 많은 CPU를 소비하게 됩니다. 이 동작을 무시할 수 있는 방법이 있나요?
아니요. 시스템 서비스 추적은 기본적으로 cgroup 기반입니다.
자신만의 xinetd 패키지를 구축하는 것이 불가능하다면 서비스를 상속하도록 포팅하는 것이 좋습니다.듣다각 클라이언트 소켓 대신 소켓을 사용하고 자체 accept() 루프를 갖습니다(필요한 변경 양을 최소화하기 위해 각 클라이언트에 대해 분기될 수도 있음). (x)inetd는 또한 이 모드를 "대기" 모드로 지원합니다. systemd에서는 이를 "Accept=no"라고 합니다(인스턴스화되지 않은 .service 단위 사용).
(비슷한 것만으로도 while (fd = accept()) { if (!fork()) handle_client(fd) }
충분합니다.)