最新消息:

解决rsyslogd资源占用率高问题

journal admin 12404浏览 0评论

問題:

解決rsyslogd資源佔用率高問題

openshift集羣安裝在 esxi 的虛擬機上. 各個節點出現問題, 集羣響應很慢.

kswapd0
rsyslogd

先上總結:

system-journal 服務監聽 /dev/log socket獲取日誌, 保存在內存中, 並間歇性的寫入 /var/log/journal 目錄中.

rsyslog 服務啟動後監聽 /run/systemd/journal/syslog socket獲取 syslog 類型日誌, 並寫入 /var/log/messages 文檔中. 獲取日誌時需要記錄日誌條目的 position 到 /var/lib/rsyslog/imjournal.state 文檔中.

可能是虛擬機系統安裝問題, 導致沒有創建 /var/lib/rsyslog . rsyslog 將異常日誌寫入 /dev/log socket中.

這樣就導致了死循環, rsyslog 因為要打開 /var/log/messages 並寫入日誌, 消耗cpu, 內存還有磁盤I/O.

診斷步驟:

rsyslog

重啟 rsyslog 服務

重啟之後內存得到釋放, 但是rsyslogd進程cpu跑到90%多, 且內存在持續升高.

檢查服務狀態發現進程一直在報錯:

fopen() failed: 'Permission denied', path: '/imjournal.state.tmp'
 [try http://www.rsyslog.com/e/2013 ]
fopen() failed: 'Permission denied', path: '/imjournal.state.tmp'
 [try http://www.rsyslog.com/e/2013 ]
...

檢查 /etc/rsyslog.conf 中的 WorkDirectory 行是沒有被註釋的. 檢查默認工作目錄 /var/lib/rsyslog , 發現目錄不存在.

因此創建 /var/lib/rsyslog 目錄, 並賦予 600 權限.

再次重啟 rsyslog 服務, 觀察一段時間沒有錯誤拋出, /var/lib/rsyslog 目錄下創建了 imjournal.state 文檔. 檢查文檔, 內容不斷被刷新. 但是佔用內存還在升高, /var/log/messages 文檔中還有錯誤信息寫入. 但是錯誤日誌的時間是比較早的.

再次檢查 /etc/rsyslog.conf 配置, 有一行配置:

# Include all config files in /etc/rsyslog.d/ $IncludeConfig /etc/rsyslog.d/*.conf

目錄中有文檔 /etc/rsyslog.d/listen.conf , 內容為 $SystemLogSocketName /run/systemd/journal/syslog .

分析:

  • /run 是linux內存中的數據
  • journal 相關服務: systemd-journald.service .

systemd-journald.service

systemd-journald 是用來協助 rsyslog 記錄系統啟動服務和服務啟動失敗的情況等等. systemd-journald 使用內存保存記錄, 系統重啟記錄會丟失. 所有還要用 rsyslog 來記錄分類信息, 如上面 /etc/rsyslog.d/listen.conf 中的 syslog 分類.

~ systemctl list-sockets

LISTEN                          UNIT                         ACTIVATES
....
/dev/log                        systemd-journald.socket      systemd-journald.service
/run/systemd/journal/socket     systemd-journald.socket      systemd-journald.service
/run/systemd/journal/stdout     systemd-journald.socket      systemd-journald.service
....

查看journal的配置 /etc/systemd/jounal.conf , 最終還是會持久化到硬盤上的 /var/log/journal 目錄中. 每個文檔的大小是 10M , 最多使用 8G 的空間, 同步間隔 1s .

[Journal]
 Storage=persistent
 Compress=True
#Seal=yes
#SplitMode=uid
 SyncIntervalSec=1s
 RateLimitInterval=1s
 RateLimitBurst=10000
 SystemMaxUse=8G
 SystemMaxFileSize=10M
#RuntimeKeepFree=
#RuntimeMaxFileSize=
 MaxRetentionSec=1month
 ForwardToSyslog=False
#ForwardToKMsg=no
#ForwardToConsole=no
 ForwardToWall=False
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

檢查 /var/log/journal 目錄, 發現裏面文檔很多, 每個大小為 10m . 清空該目錄並重啟 rsyslog , 觀察一段時間後一切正常.

參考:

https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/160.html

转载请注明:爱开源 » 解决rsyslogd资源占用率高问题

您必须 登录 才能发表评论!