SystemD ユニットごとの LogRateLimitIntervalSec が機能しないのですか?

SystemD ユニットごとの LogRateLimitIntervalSec が機能しないのですか?

RateLimitIntervalSecSystemD ジャーナルは、およびRateLimitBurstグローバル構成オプションに従ってログに記録されるメッセージを制限します。LogRateLimitIntervalSecおよびLogRateLimitBurstディレクティブを使用して、特定のユニット/サービスごとにこれらの値を変更することができます。残念ながら、これらのサービスごとのオプションを機能させることはできません。私が間違っている点を見つけるのを手伝っていただくか、systemd に問題があることを確認していただければ幸いです。

私の環境:

# 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)

グローバル journald 制限がデフォルトのままになっていることを確認します/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

また、グローバル journald 設定を次のように変更し (systemd-journald を再起動) すると、次のようになることも確認しました。

[Journal]
RateLimitIntervalSec=0
RateLimitBurst=0

予想どおり、レート制限は発生しません。

現時点では、私には何もわかりません。systemd のソース コードを分析しようとしましたが、私には理解できません。誰かが少なくとも私の手順を再現して結果を報告してくれると、systemd Github の問題追跡ツールでこれを報告するのに役立ちます。

ありがとう。

答え1

RateLimitIntervalSec=, RateLimitBurst=のセクションには次のようにman journald.conf書かれています:

あらゆる種類のレート制限をオフにするには、いずれかの値を 0 に設定します。

LogRateLimitIntervalSec=, LogRateLimitBurst=ただし、の セクションではこれを見つけることができませんman systemd.exec。 を使用するとtest.service、これを 以外の値に設定すると0期待どおりに動作することを簡単に確認できます。

関連情報