centos7 systemctl status servicename執行慢的問題

一,這個問題和systemd-journald有關,故咱們先簡單瞭解下:
html

    過去只有 rsyslogd 的年代中,因爲 rsyslogd 必需要開機完成而且執行了 rsyslogd 這個 daemon 以後,登陸文件纔會開始記錄。因此,核心還得要本身產生一個 klogd 的服務, 才能將系統在開機過程、啓動服務的過程當中的信息記錄下來,而後等 rsyslogd 啓動後才傳送給它來處理。linux

    如今有了 systemd 以後,systemd 使用systemd-journald統一管理全部 Unit 的啓動日誌。因爲systemd是kernel喚醒的,而後又是第一個執行的軟件,它能夠主動調用 systemd-journald 來協助記載登陸信息。所以在開機過程當中的全部信息,包括啓動服務與服務若啓動失敗的狀況等等,均可以直接被記錄到 systemd-journald 裏頭去!nginx

    不過 systemd-journald 因爲是使用於內存的登陸文件記錄方式,所以從新開機事後,開機前的登陸文件信息固然就不會被記載了。 爲此,咱們仍是建議啓動 rsyslogd 來協助分類記錄!也就是說, systemd-journald 用來管理與查詢此次開機後的登陸信息,而 rsyslogd 能夠用來記錄之前及如今的因此數據到磁盤文件中,方便將來進行查詢!web


二,問題場景:vim

一臺centos7系統有load高的報警,故登陸上去查看,發現系統很卡,系統磁盤io吃的比較多。以後,發現不少systemctl status的進程,而且這種進程佔用系統io不少。  centos


問題分析定位:koa

1,centos7的bugide

2,systemctl的問題  post


三,解決過程:centos7

1,centos7已經用了很長時間,目前處於穩定,而且翻看centos7的bug list未發現有相似異常。故排除了系統bug。

2,開始查找systemctl的問題,果不其然發現是systemd-journald的問題。

1)strace命令查看問題,發現是讀取systemd-journald日誌比較慢

# strace -s 1024 systemctl status nginx


2)查看status輸出:

# systemctl status nginx

● nginx.service - nginx - high performance web server

   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)

   Active: active (running) since 一 2018-01-08 18:25:37 CST; 2h 20min ago

     Docs: http://nginx.org/en/docs/

 Main PID: 22403 (nginx)

   CGroup: /system.slice/nginx.service

           ├─22403 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

           ├─22404 nginx: worker process

           ├─22405 nginx: worker process

           ├─22408 nginx: worker process


1月 08 18:25:37 test systemd[1]: Starting nginx - high performance web server...

1月 08 18:25:37 test nginx[22398]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

1月 08 18:25:37 test nginx[22398]: nginx: configuration file /etc/nginx/nginx.conf test is successful

1月 08 18:25:37 test systemd[1]: Started nginx - high performance web server.


能夠看到systemctl有的輸出有nginx啓動時候相關的信息。而這些輸出是從systemd-journald中讀取的。


3)systemd-journald的日誌默認是存儲在/run/log/journal目錄,發現這個目錄已經有4G了。查看網上相關資料,發現也有其它人碰見過相似的問題。能夠經過修改systemd-journald的配置來解決問題:

# vim /etc/systemd/journald.conf

SystemMaxUse=100M

RuntimeMaxUse=100M

###

SystemMaxUse= 與 RuntimeMaxUse= 限制所有日誌文件加在一塊兒最多能夠佔用多少空間。而SystemMaxUse= 與 RuntimeMaxUse= 的默認值是10%空間與4G空間二者中的較小者,故把這兩個配置調小了。


重啓systemd-journald:

# systemctl restart systemd-journald


4)操做完成以後發現系統load慢慢降了下來,systemctl status命令也變快了。


四,結論:

1,經過限制systemd-journald日誌的大小來解決這個問題。反作用是保存的日誌變少,可是可接受,目前沒有發現有異常。


五,參考:

http://shouce.jb51.net/vbird-linux-basic-4/160.html

http://www.jinbuguo.com/systemd/journald.conf.html

http://www.codekoala.com/posts/systemctl-status-foo-was-too-slow/

相關文章
相關標籤/搜索