Kinesis エージェントのインストールと起動 ( 続き )

Posted on 2019-12-22 in zakki

前エントリで kinesis-agent をインストールしログストリーミングを設定しましたが、数日後にactive (exited)となっていたので修正したメモ。

active (exited)となってしまっていた

$ sudo service aws-kinesis-agent status
● aws-kinesis-agent.service - LSB: Daemon for Amazon Kinesis Agent.
   Loaded: loaded (/etc/init.d/aws-kinesis-agent; bad; vendor preset: enabled)
   Active: active (exited) since Sun 2019-12-15 13:32:52 UTC; 4 days ago
     Docs: man:systemd-sysv-generator(8)
  Process: 19424 ExecStop=/etc/init.d/aws-kinesis-agent stop (code=exited, status=0/SUCCESS)
  Process: 19442 ExecStart=/etc/init.d/aws-kinesis-agent start (code=exited, status=0/SUCCESS)
    Tasks: 0
   Memory: 0B
      CPU: 0

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

agent によってストリーミングされるときに排出されるログの aws-kinesis-agent.log も停止していた。

journald ログ

調べてみると、journald のログとディスクスペースの関連らしいことが分かった。

$ dmesg | grep journal
[    4.865832] systemd-journald[419]: Received request to flush runtime journal from PID 1
[11772237.143871] [  419]     0   419     9265     1196      21       4        0             0 systemd-journal
[12013425.078331] [  419]     0   419     9265     1196      21       4        0             0 systemd-journal
[12049434.596580] systemd-journald[419]: Received SIGTERM from PID 1 (systemd).
[12049539.272374] systemd-journald[31574]: Received SIGTERM from PID 1 (systemd).
[12049894.773647] systemd-journald[31602]: Received SIGTERM from PID 1 (systemd).
$ sudo systemctl status systemd-journald
( 略 )
Dec 20 13:01:01 ip-172-26-6-127 systemd-journald[31574]: Runtime journal (/run/log/journal/) is 4.8M, max 4.8M, 0B free.

対処

以下の方針とした。

  • ログのディレクトリを/var/log/journalとする。
  • ログのサイズを指定する。

ログの排出先ディレクトリを変更するには直接/var/log/journalのディレクトリを作成すればよいらしい。

$ sudo mkdir /var/log/journal
$ sudo systemctl restart systemd-journald
$ sudo systemctl status systemd-journald
● systemd-journald.service - Journal Service
   Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled)
   Active: active (running) since Fri 2019-12-20 13:02:46 UTC; 4s ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 31602 (systemd-journal)
   Status: "Processing requests..."
    Tasks: 1
   Memory: 11.2M
      CPU: 116ms
   CGroup: /system.slice/systemd-journald.service
           └─31602 /lib/systemd/systemd-journald

Dec 20 13:02:46 ip-172-26-6-127 systemd-journald[31602]: System journal (/var/log/journal/) is 8.0M, max 1.9G, 1.9G free.
Dec 20 13:02:46 ip-172-26-6-127 systemd-journald[31602]: Runtime journal (/run/log/journal/) is 4.8M, max 4.8M, 0B free.
Dec 20 13:02:46 ip-172-26-6-127 systemd-journald[31602]: Time spent on flushing to /var is 109.556ms for 5707 entries.
Dec 20 13:02:46 ip-172-26-6-127 systemd-journald[31602]: Journal started
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

ん。少し思っていたかたちと違う。排出先は/var/log/journalだけとしたい。

そのときは/etc/systemd/journald.confで設定値を編集するとのこと。

  • /etc/systemd/journald.conf

Storage行のコメントアウトを削除して値をpersistentに設定する。

[Journal]
Storage=persistent
#Compress=yes
#Seal=yes
#SplitMode=uid

また、ログサイズを設定 ( 正確にはディスクに書き込まれるサイズを設定 ) するのはSystemMaxUseとのこと。SystemMaxUse256Mにする。

[Journal]
( 略 )
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
SystemMaxUse=256M

確認

$ sudo systemctl restart systemd-journald
$ sudo systemctl status systemd-journald
● systemd-journald.service - Journal Service
   Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled)
   Active: active (running) since Fri 2019-12-20 13:38:54 UTC; 1s ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 32080 (systemd-journal)
   Status: "Processing requests..."
    Tasks: 1
   Memory: 308.0K
      CPU: 4ms
   CGroup: /system.slice/systemd-journald.service
           └─32080 /lib/systemd/systemd-journald

Dec 20 13:38:54 ip-172-26-6-127 systemd-journald[32080]: System journal (/var/log/journal/) is 16.0M, max 256.0M, 239.9M free.
Dec 20 13:38:54 ip-172-26-6-127 systemd-journald[32080]: Journal started

ジャーナルログディレクトリが System journal のみになった。また、ディスクサイズを最大で256Mとできた。

この状態で kinesis-agent をスタートさせる。問題なく動作しているようだ。

$ sudo systemctl restart aws-kinesis-agent
$ sudo systemctl status aws-kinesis-agent
● aws-kinesis-agent.service - LSB: Daemon for Amazon Kinesis Agent.
   Loaded: loaded (/etc/init.d/aws-kinesis-agent; bad; vendor preset: enabled)
   Active: active (running) since Fri 2019-12-20 13:10:23 UTC; 12s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 31729 ExecStop=/etc/init.d/aws-kinesis-agent stop (code=exited, status=0/SUCCESS)
  Process: 31740 ExecStart=/etc/init.d/aws-kinesis-agent start (code=exited, status=0/SUCCESS)
    Tasks: 15
   Memory: 84.5M
      CPU: 1.448s
   CGroup: /system.slice/aws-kinesis-agent.service
           └─31753 /usr/bin/java -server -Xms32m -Xmx512m -XX:OnOutOfMemoryError="/bin/kill -9 %p" -cp /usr/share/aws-kinesis-agent/lib:/usr/share/aws-kinesis
Dec 20 13:50:23 ip-172-26-6-127 systemd[1]: Stopped LSB: Daemon for Amazon Kinesis Agent..
Dec 20 13:50:23 ip-172-26-6-127 systemd[1]: Starting LSB: Daemon for Amazon Kinesis Agent....
Dec 20 13:50:23 ip-172-26-6-127 aws-kinesis-agent[31740]:  * Starting aws-kinesis-agent
Dec 20 13:50:23 ip-172-26-6-127 aws-kinesis-agent[31740]:    ...done.
Dec 20 13:50:23 ip-172-26-6-127 systemd[1]: Started LSB: Daemon for Amazon Kinesis Agent..

対処後

上記の設定で現在も動作しているが、疑問点が少し。

  • ログローテートは?

journald.confの設定が無い場合、以下の条件のどちらかを満たすまでログが溜まり続けるらしい。参考

  • ジャーナルのサイズがファイルシステムの容量の 10% もしくは 4GB の小さいほうに到達する。
  • ファイルシステムの空き容量が 15% もしくは 4GB の小さいほうに到達する。

/run/log/journalでもこの条件は有効だと思っているので、ログが容量の 10% となったらログローテートしそうなものだが …。Freeの項目が 0 となっていたので、ログローテートに必要な処理がディスク容量不足で出来なかったのかな、と思っているけど本当のところはどうなんだろ。

AWS Kinesis Firehose