단위당 SystemD LogRateLimitIntervalSec이 작동하지 않습니까?

단위당 SystemD LogRateLimitIntervalSec이 작동하지 않습니까?

SystemD 저널은 전역 구성 옵션 RateLimitIntervalSec에 따라 기록된 메시지를 제한합니다 . 특정 단위/서비스 사용 및 지시문 RateLimitBurst에 따라 해당 값을 변경할 가능성이 있습니다 . 불행히도 이러한 서비스별 옵션을 작동시킬 수 없습니다. 내가 뭘 잘못하고 있는지 찾거나 systemd에 문제가 있는지 확인하는 데 도움이 되길 바랍니다.LogRateLimitIntervalSecLogRateLimitBurst

내 환경:

# uname -srvmpio
Linux 4.18.0-193.14.2.el8_2.x86_64 #1 SMP Sun Jul 26 03:54:29 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/centos-release
CentOS Linux release 8.2.2004 (Core)

# systemctl --version
systemd 239
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy

# rsyslogd -v
rsyslogd  8.1911.0-3.el8 (aka 2019.11)

전역 저널 제한이 다음에서 기본값으로 남아 있는지 확인하십시오 /etc/systemd/journald.conf.

[Journal]
#RateLimitIntervalSec=30s
#RateLimitBurst=10000

변경이 필요한 경우 다시 시작하세요.

systemctl restart systemd-journald

테스트 스크립트를 준비합니다 /root/test.sh.

#!/bin/bash
for i in {1..1000000}
do
   echo "Hello world $i"
done

테스트 서비스 유닛 준비 /root/test.service:

[Unit]
Description=Test limit service

[Service]
Type=simple
WorkingDirectory=/root
ExecStart=/root/test.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=test
LogRateLimitIntervalSec=0
LogRateLimitBurst=0

[Install]
WantedBy=multi-user.target

다음을 변경하여 rsyslog 속도 제한이 꺼져 있는지 확인하십시오 /etc/rsyslog.conf.

module(load="imjournal"
       StateFile="imjournal.state"
       Ratelimit.Interval="0")

다음을 생성하여 테스트 서비스 로그 파일 위치를 구성합니다 /etc/rsyslog.d/test.conf.

if ($programname == 'test') then {
    action(
        type="omfile"
        File="/root/test.log"
    )
    stop
}

rsyslog를 다시 시작하십시오.

systemctl restart rsyslog

테스트 서비스를 설치합니다.

# systemctl enable /root/test.service

테스트 서비스 속도 제한 설정을 확인합니다( LogRateLimitIntervalSec내부적으로 저장됨 LogRateLimitIntervalUSec).

# systemctl show --property LogRateLimitIntervalUSec test.service --no-pager
LogRateLimitIntervalUSec=0

# systemctl show --property LogRateLimitBurst test.service --no-pager
LogRateLimitBurst=0

서비스를 시작합니다:

systemctl start test.service

내 결과:

  • /root/test.log는 다음에서 중지됩니다.Hello world 12500
  • journalctl -u test.service --no-pager에 정차하다Hello world 12500
  • /var/log/messages 보고서(때때로 이 메시지가 기록되지 않음)
systemd-journald[304398]: Suppressed 982500 messages from test.service

또한 전역 저널 설정을 다음으로 변경하고 systemd-journald를 다시 시작하는 것도 확인했습니다.

[Journal]
RateLimitIntervalSec=0
RateLimitBurst=0

예상대로 속도 제한이 발생하지 않습니다.

나는이 시점에서 단서가 없습니다. 시스템 소스 코드를 분석하려고 시도했지만 내 머리 위에 있습니다. 누구든지 적어도 내 단계를 다시 만들고 systemd Github 문제 추적기에 이를 보고하는 데 도움이 될 결과를 보고할 수 있다면 말이죠.

감사해요.

답변1

섹션 RateLimitIntervalSec=, RateLimitBurst=은 다음과 같이 man journald.conf말합니다.

모든 종류의 속도 제한을 끄려면 두 값 중 하나를 0으로 설정하세요.

LogRateLimitIntervalSec=, LogRateLimitBurst=그러나 의 섹션 에서는 이를 찾을 수 없습니다 man systemd.exec. 이를 사용 test.service하여 이를 다른 것으로 설정하면 0예상대로 작동하는지 쉽게 확인할 수 있습니다.

관련 정보