journald->rsyslogでログの取りこぼしが見つかる
ログの解析していると、なんか、journald->rsyslogで拾っているログが全部取れていない風。
サイズ的にも一割以下しか拾っていない感じ。
これはマズい。
状態がわからん。
ログには、抑制するって書いてあるけど、単純に捨ててるのね。
Sep 3 23:53:33 nandakana01 journal: Suppressed 25654 messages from /system.slice/kandakana.service
デフォルトでは、10秒間で200以上のメッセージ出力が発生すると制限がかるそうな。
1分で3万アクセスがあるので、ログはその5倍程度発生するかな。
ピーク考えると、10倍以上のマージンはほしいところ。
$ sudo vi /etc/systemd/journald.conf RateLimitInterval=10s RateLimitBurst=50000
こんなもんでいいかな。
保管容量が劇的に増えるだろうから、容量も対処する。
journaldのログは、デフォルトではtmpfsに保存されて、再起動で消える。
/var/run/log/journalの容量に応じてログの保存容量も調整される。
永続化には、/var/log/journalを作っておくと、そこに保管されるそうだ。
(journald.confのStorageの内部デフォルトがautoだから?)
現在のシステムではどこにあるのか?
$ ls -l /var/ | grep "run " lrwxrwxrwx. 1 root root 6 Feb 5 2016 run -> ../run $ df -h /run Filesystem Size Used Avail Use% Mounted on tmpfs 921M 89M 832M 10% /run $ ls -l /var/log/journal ls: cannot access /var/log/journal: No such file or directory
なんか、専用のtmpfs切られている。
さて、現状の89Mでどの期間保存できているか。
このシステムでは、一日は無理だということはわかっている。
journalctlで先頭のタイムスタンプを見ると、2時間半分しか保存できていない...
取りこぼししてて、保存時間も短いとは...
tmpfsだと、今のサイズをパンパンに使っても、一日がやっとな感じ。
ファイルに落とすとIO負荷が心配になるので、ここはこのままでサイズだけ増やしておく。
デフォルトでは、保存用ディレクトリーの全容量に対して10%以上になるか、該当ディレクトリーのファイルシステムの空き容量が15%以下になると、古いエントリーから順に削除される仕様なのだそう。
保管容量の変更は、/etc/systemd/journald.confの
SystemMaxUse (/var/log/journal)と
RuntimeMaxUse (/var/run/log/journal)に指定する。
デフォルトでは、設定ファイルには他の設定を含めて何も有効な指定はない。
$ cat /etc/systemd/journald.conf | grep RuntimeMaxUse #RuntimeMaxUse= $ cat /etc/systemd/journald.conf | grep SystemMaxUse #SystemMaxUse=
容量の指定はバイト?
詳細はmanせよと設定ファイルに書かれている。
しかし、表記方法はとくに書かれていない...
RuntimeMaxUse=500Mという風に書くのが普通のようだ。
現在のサイズの確認と変更。RAM少ないのでつらい。
$ journalctl --disk-usage Archived and active journals take up 88.5M on disk. $ sudo vi /etc/systemd/journald.conf RuntimeMaxUse=800M $ sudo systemctl restart systemd-journald
んでもって、まだどこかで落としている。
Sep 5 17:30:26 nandakana01 rsyslogd-2177: imjournal: 244351 messages lost due to rate-limiting Sep 5 17:31:11 nandakana01 rsyslogd-2177: imjournal: begin to drop messages due to rate-limiting
jounaldからrsyslogに中継している、imjournalに制限があるようだ。
デフォルト設定は、600 秒あたり 20,000 メッセージ。
さっきは10secで5万メッセージだったので、それ以上にしておかないと。
秒5kということは、600秒だと300万...
他のログもあるけど、とりあえずこれで。
/etc/rsyslog.d/にはlisten.confしかないので、明示で上限は設定されていないみたい。
$ sudo vi /etc/rsyslog.conf $imjournalRatelimitInterval 600 $imjournalRatelimitBurst 3000000 $ sudo systemctl restart rsyslog
なんか消えないっす。
エラー出ているな。
Sep 5 17:41:23 nandakana01 rsyslogd-3003: invalid or yet-unknown config file command 'imjournalRatelimitInterval' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ] Sep 5 17:41:23 nandakana01 rsyslogd-3003: invalid or yet-unknown config file command 'imjournalRatelimitBurst' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
モジュール指定がないって?
$ModLoad imjournalの後に書かないとダメかな?
どうも、そうらしい。
まだエラー出る。
なに?
imjournalRatelimitBurstは、65535が最大値だと...
http://qiita.com/kitaji0306/items/ff2a9f53f1b1a63dc4f0
とすると、インターバルタイマを短くするしか。
負荷になるかな?
$ sudo vi /etc/rsyslog.conf $imjournalRatelimitInterval 20 $imjournalRatelimitBurst 100000
とりあえず出なくなった。
さーて、ログ爆発はどーなるかな... コワ...