問題:
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资源占用率高问题