首頁 > 軟體

最詳細的CentOS 6與7對比(二):服務管理對比

2020-06-16 16:30:00

本主題將從3個角度進行對比

  1. 常見設定(CentOS 6 vs CentOS 7)
  2. 服務管理(Sysvinit vs Upstart vs Systemd)
  3. 效能測試(cpu/mem/io/oltp)

本文為第二部分:服務管理的對比


1. sysvinit、upstart、systemd簡介

/CentOS 5CentOS 6CentOS 7備註
sysvinit ? ? ? 第一代,傳統,相容最多(/etc/init.d/、/etc/rc.X)
upstart ? ? ? 第二代,形似systemd雛形(/etc/init)
systemd ? ? ? 第三代,配合cgroup,systemd完全接管整個系統(/usr/lib/systemd)

2. sysvinit、upstart、systemd常用命令

動作sysvinitupstartsystemd
檢視 service mytest status initctl status mytest systemctl status mytest.service
啟動 service mytest start initctl start mytest systemctl start mytest.service
關閉 service mytest stop initctl stop mytest systemctl stop mytest.service
強殺進程 kill -9 PID kill -9 PID systemctl kill mytest.service --signal=9
重新啟動 service mytest restart initctl restart mytest systemctl restart mytest.service
過載 service mytest reload initctl reload mytest systemctl reload mytest.service
開機啟動 chkconfig mytest on /etc/init/mytest.conf裡設定start on runlevel [3] systemctl enable mytest.service

3. runlevel執行級別

執行級別CentOS 6CentOS 7
0 halt runlevel0.target -> poweroff.target
1 Single user mode runlevel1.target -> rescue.target
2 Multiuser, without NFS runlevel2.target -> multi-user.target
3 Full multiuser mode runlevel3.target -> multi-user.target
4 unused runlevel4.target -> multi-user.target
5 X11 runlevel5.target -> graphical.target
6 reboot runlevel6.target -> reboot.target
檢視 cat /etc/inittab systemctl get-default
開機生效 編輯/etc/inittab systemctl set-default multi-user.target
立即切換 init 5 systemctl isolate graphical.target

4. 紀錄檔查詢

CentOS 6: 手工在/var/log/messages、/var/log/dmesg、/var/log/secure中grep,麻煩且效率低

CentOS 7: 統一使用journalctl,可以使用多個因素匹配,比如時間段、服務名、紀錄檔級別等等。另外,systemd紀錄檔預設經過壓縮,是二進位制檔案,無法直接檢視

journalctl常用命令作用CentOS 6比
journalctl 所有紀錄檔,包含系統、核心等等 手動在對應紀錄檔檔案中grep
journalctl --dmesg 檢視當前開機後的核心紀錄檔 dmesg
journalctl --boot 檢視當前開機後的紀錄檔 先查當前開機啟動時間,然後cat /var/log/...
journalctl --boot=-1 檢視上一次啟動的紀錄檔 查詢上次開機到當前開機之間時間,然後cat /var/log/...
journalctl --since="2018-08-01 12:00:00" 檢視從指定時間開始到當前的紀錄檔 手動在紀錄檔裡grep
journalctl --since=yesterday --until=today 檢視昨天0-24點的紀錄檔 手動在紀錄檔裡grep
journalctl -n 20 檢視最後10行 tail -n 20
journalctl -f 實時捲動顯示最新紀錄檔 tail -f
journalctl -e 直接翻到最後 tail
journalctl -u mytest.service 檢視指定服務紀錄檔 先查詢紀錄檔儲存路徑,然後再cat檢視
journalctl -p 0 檢視指定紀錄檔級別的紀錄檔,紀錄檔級別從0到7 通過syslog將不同級別的紀錄檔放到不同檔案中
journalctl -u mytest.service -o json-pretty或-o verbose 檢視每條紀錄檔詳細資訊(包含元資訊)
journalctl --disk-usage 檢視紀錄檔所在的磁碟空間 du -shx /var/log/messages等

5. 實現守護行程

CentOS 6

  • sysvinit需要自行實現
    • nohup &
    • screen
    • supervisor
  • upstart和systemd類似,將程式執行在前台即可

CentOS 7

  • 由systemd啟動,將程式執行在前台即可

6. sysvinit、upstart、systemd例子

sysvinit

cat > /etc/init.d/mytest <<EOF
. /etc/rc.d/init.d/functions

start() { … }
stop() { … }
restart() { … }
reload() { … }
status() { … }

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
…
esac
exit $RETVAL
EOF

chmod +x /etc/init.d/mytest
service mytest start

upstart

cat > /etc/init/mytest.conf <<EOF
start on runlevel [3]
description “mytest"
exec /root/mytest.sh
EOF

initctl start mytest

systemd

cat > /usr/lib/systemd/system/mytest.service <<EOF
[Unit]
Description=mytest

[Service]
Type=simple
ExecStart=/root/mytest.sh

[Install]
WantedBy=multi-user.target
EOF

systemctl start mytest

7. PID管理

  • sysvinit: 需要生成PID檔案,用於後期關閉、重新啟動等使用
  • upstart: 無需PID檔案,upstart會記錄主進程ID,子進程ID沒有記錄
  • systemd: 無需PID檔案,所有進程ID由cgroup統一接管

8. 內建的資源限制

CentOS 6: 除了ulimit,沒有其他限制進程資源的簡便方法
CentOS 7: 除了ulimit,還支援部分cgroup限制,可對進程做記憶體限制和cpu資源限制等

[Service]
ExecStart=...
MemoryLimit=500M
CPUShares=100

另外,CentOS 7可以通過systemd-cgtop命令檢視cgroup裡的效能資料

9. 服務異常自動重新啟動

upstart

start on runlevel [3]

description "mytest"

exec /root/mytest.sh
post-stop exec sleep 5
respawn
respawn limit unlimited

systemd

[Unit]
Description=mytest

[Service]
Type=simple
ExecStart=/root/mytest.sh
Restart=always
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

上面2種方式均表示,無限次自動重新啟動,每次重新啟動前等待5秒

10. 寫紀錄檔方式

CentOS 6: 自行輸出到檔案中,或通過syslog記錄(如logger命令)

CentOS 7: 只要程式由systemd啟動,只需將輸出紀錄檔到標準輸出或標準錯誤

  • 建議centos7隻將應用程式的一些元資訊輸出到標準輸出或標準錯誤,比如啟動成功、啟動失敗等等
  • 不建議將業務紀錄檔輸出到journal。因為journal中所有紀錄檔都存在一個檔案中,會導致2個問題:
    • 如果沒有做紀錄檔持久化,則預設存在記憶體中,會導致最多一半的記憶體被佔用
    • 儲存量很大,會導致查詢其他紀錄檔很耗時
  • 解決辦法:輸出到syslog,[Service]支援StandardOutput=syslog

11. 指定每條紀錄檔級別

CentOS 6: 通過syslog將不同級別的紀錄檔輸出到不同檔案

CentOS 7: 只需在輸出的每一行開頭加<紀錄檔級別>,比如

echo '<0>hello, emerg'
echo '<1>hello, alert'
echo '<2>hello, crit'
echo '<3>hello, err'
echo '<4>hello, warning'
echo '<5>hello, notice'
echo '<6>hello, info'
echo '<7>hello, debug'

12. systemd紀錄檔永久儲存

systemd紀錄檔預設儲存在記憶體中,因此當伺服器重新啟動後,就無法通過journalctl來檢視之前的紀錄檔,解決方法:

mkdir -p /var/log/journal
systemctl restart systemd-journald

IT145.com E-mail:sddin#qq.com