SystemD на единицу LogRateLimitIntervalSec не работает?

SystemD на единицу LogRateLimitIntervalSec не работает?

SystemD journal ограничивает регистрируемые сообщения в соответствии с RateLimitIntervalSecглобальными 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, но это выше моих сил. Если бы кто-нибудь хотя бы повторил мои шаги и сообщил о результатах, это было бы полезно для сообщения об этом в системном трекере проблем Github.

Спасибо.

решение1

RateLimitIntervalSec=, RateLimitBurst=В разделе говорится man journald.conf:

Чтобы отключить любое ограничение скорости, установите любое значение на 0.

Однако вы не найдете этого в LogRateLimitIntervalSec=, LogRateLimitBurst=разделе в man systemd.exec. С помощью вашего test.serviceвы можете легко убедиться, что установка этого значения в какое-либо иное значение 0работает так, как ожидалось.

Связанный контент