目錄
Linux系統負載監控
系統負載介紹
查看系統負載
負載解讀
top 命令
Linux服務管理
systemd 介紹
系統啟動管理進程
基本概念
systemd 架構
unit 類型
查看 unit 列表信息
查看單個 unit 信息
控制系統服務
systemctl 命令
unit 配置文件
例:開發一個 demisse 服務
Linux系統負載監控
系統負載介紹
系統負載平均值:Linux內核以活動請求數的指數移動平均值來表示。
-
活動請求數不僅包含運行中進程,還包含等待IO的進程,對應于R和D。等待IO包括處于睡眠等待預期磁盤和網絡響應的任務。
-
指數移動平均值是一個數學公式,可以平滑趨勢數據的高值和低值,更加準確地表示一段時間內系統負載,并確定系統負載是隨著時間增加還是減少。
-
根據所有CPU活動請求數,每5秒計算一次Load Average。通過匯總這些值,可以得到最近1分鐘,5分鐘和15分鐘內的指數移動平均值。
-
一些UNIX系統僅考慮CPU使用率或運行隊列長度。Linux中負載平均值中還包含了對IO的考量,遇到負載平均值很高但CPU活動很低時,檢查磁盤和網絡活動。
-
Linux將各個物理CPU核心和微處理器超線程計為獨立執行單元。每個獨立的執行單元擁有獨立的請求隊列。
查看系統負載
# 查看CPU
[demisse@rocky8 ~]$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2 # cpu數量為2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
socket: 2
NUMA 節點: 1
廠商 ID: GenuineIntel
CPU 系列: 6
型號: 94
型號名稱: Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz
步進: 3
CPU MHz: 2304.001
BogoMIPS: 4608.00
......# 查看負載
[demisse@rocky8 ~]$ uptime13:47:10 up 5:01, 2 users, load average: 0.00, 0.01, 0.05# 給系統加負載
[demisse@rocky8 ~]$ md5sum /dev/zero &
[1] 4912
[demisse@rocky8 ~]$ md5sum /dev/zero &
[2] 4913# 等30秒左右
[demisse@rocky8 ~]$ uptime13:48:57 up 5:03, 2 users, load average: 1.02, 0.28, 0.13
負載解讀
示例:4核心的CPU
-
負載為: 2.92 4.48 5.20
-
每個cpu負載為:0.73(2.92/4) 1.12(4.48/4) 1.30(5.20/4)
比較理想的值為 75% 左右。
top 命令
作用:動態查看進程信息,包括不同狀態任務數量,CPU消耗和內存消耗。
cpu列解讀:
-
us,用戶進程消耗CPU的時間
-
sy,系統進程消耗CPU的時間
-
wa,CPU用于等待IO進程的時間
top命令快捷鍵
常用的命令:數字1,P,M,k,q,h。
Linux服務管理
systemd 介紹
系統啟動管理進程
-
CentOS 5 使用 Sys init 引導系統啟動,啟動速度最慢,采用串行方式啟動,無論進程相互之間有無依賴關系。
-
CentOS 6 使用 Upstart init 引導系統啟動,啟動速度快一點,有依賴的進程之間依次啟動而其他與之沒有依賴關系的則并行同步啟動。
-
CentOS 7 使用 Systemd 引導系統啟動,速度最快,所有進程無論有無依賴關系則都是并行啟動(很多時候進程沒有真正啟動而是只有一個信號或者說是標記而已,在真正利用的時候才會真正啟動)。Systemd為了解決上文的問題而誕生。它的目標是,為系統的啟動和管理提供一套完整的解決方案。
基本概念
服務:從業務角度來稱呼,例如 web 服務,數據庫服務。
守護進程(daemon):web 服務器對外提供 web 服務,由 web 相關的進程提供支持。
例如:
# 安裝軟件包
[root@rocky8 ~]# yum install -y httpd# 修改配置
[root@rocky8 ~]# vim /etc/httpd/conf/httpd.conf
# 取消 ServerName 注釋
ServerName rocky8.demisse.cloud:80# 啟動服務
[root@rocky8 ~]# systemctl start httpd# 查看進程
[root@rocky8 ~]# ps axf|tail
......
87094 ? Ss 0:00 /usr/sbin/httpd -DFOREGROUND
87096 ? S 0:00 \_ /usr/sbin/httpd -DFOREGROUND
87097 ? Sl 0:00 \_ /usr/sbin/httpd -DFOREGROUND
87098 ? Sl 0:00 \_ /usr/sbin/httpd -DFOREGROUND
87099 ? Sl 0:00 \_ /usr/sbin/httpd -DFOREGROUND
httpd 服務對應的守護進程是87094、87096…
systemd 架構
unit 類型
systemctl 命令用于管理不同類型的系統對象,這些對象稱之為 units。
-
Service unit:用于定義系統服務,文件擴展名為.service,例如httpd.service
-
Socket unit:用于標識進程間通信用的 socket文件,文件擴展名為.socket
-
Target unit:用于模擬實現“運行級別”,文件擴展名為.target
-
Timer unit:用于管理計劃任務,文件擴展名為.timer
-
Device unit:用于定義內核識別的設備,文件擴展名為.device
-
Mount unit:用于定義文件系統掛載點,文件擴展名為.mount
-
Snapshot unit:管理系統快照,文件擴展名為.snapshot
-
Swap unit:用于標識swap設備,文件擴展名為.swap
-
Automount unit:文件系統的自動掛載點,文件擴展名為.automount
-
Path unit:用于根據文件系統上特定對象的變化來啟動其他服務,文件擴展名為.path
-
Slice unit:用于資源管理,文件擴展名為.slice
查看 unit 列表信息
# 列出狀態為loaded units
[root@workstation ~]# systemctl list-units
systemctl list-units命令輸出說明:
-
UNIT:服務單元名稱。
-
LOAD:systemd是否正確解析了單元的配置并將該單元加載到內存中。
-
ACTIVE:單元的高級別激活狀態。此信息表明單元是否已成功啟動。
-
SUB:單元的低級別激活狀態。此信息指示有關該單元的更多詳細信息。信息視單元類型、 狀態以及單元的執行方式而異。
-
DESCRIPTION:單元的簡短描述。
# -t選項查看特定類型unit 清單
[demisse@rocky8 ~]$ systemctl list-units -t timer
UNIT LOAD ACTIVE SUB DESCRIPTION
systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directories
unbound-anchor.timer loaded active waiting daily update of the root trust anchor for DNSSECLOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.2 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.# 列出類型為service,狀態為active和inactive unit
[root@rocky8 ~]# systemctl list-units --type service --all# 列出所有unit,包括未loaded的unit
[root@rocky8 ~]# systemctl list-unit-files# 查看失敗的服務
[root@rocky8 ~]# systemctl --failed --type service
查看單個 unit 信息
[demisse@rocky8 ~]$ systemctl status sshd.service
● sshd.service - OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)Active: active (running) since 三 2022-11-09 08:45:45 CST; 5h 50min agoDocs: man:sshd(8)man:sshd_config(5)Main PID: 1167 (sshd)Tasks: 1CGroup: /system.slice/sshd.service└─1167 /usr/sbin/sshd -D
控制系統服務
systemctl 命令
# 停止服務
[root@rocky8 ~]# systemctl stop sshd.service
# 客戶端連接測試 # 啟動服務
[root@rocky8 ~]# systemctl start sshd.service
# 客戶端連接測試 # 重啟服務,相當于stop再start
[root@rocky8 ~]# systemctl restart sshd.service
# 重新加載服務,服務對應的主進程不會重啟,只會重新加載一次配置文件。# 一般用于配置文件變動后,重新加載
[root@rocky8 ~]# systemctl reload sshd.service# 禁止服務開機自啟
[root@rocky8 ~]# systemctl disable sshd.service
[root@rocky8 ~]# systemctl is-enabled sshd
disabled# 設置服務開機自啟
[root@rocky8 ~]# systemctl enable sshd.service
[root@rocky8 ~]# systemctl is-enabled sshd
enabled# 禁用服務,服務被禁用后,將無法start,因為服務的配置文件指向/dev/null
[root@rocky8 ~]# systemctl mask sshd.service
# 取消禁用
[root@rocky8 ~]# systemctl unmask sshd.service# 查看依賴關系,sshd服務要啟動,被依賴的單元必須先啟動完成。
[root@rocky8 ~]# systemctl list-dependencies sshd
sshd.service
● ├─sshd-keygen.service
● ├─system.slice
● └─basic.target
● ├─microcode.service
● ├─rhel-dmesg.service
● ├─selinux-policy-migrate-local-changes@targeted.service
● ├─paths.target
● ├─slices.target
● │ ├─-.slice
● │ └─system.slice
● ├─sockets.target
● │ ├─avahi-daemon.socket
......# 查看反向依賴關系,sshd服務啟動后才能啟動后續單元。
[root@rocky8 ~]# systemctl list-dependencies sshd --reverse
sshd.service
● └─multi-user.target
● └─graphical.target
unit 配置文件
-
/etc/systemd/system/ sshd.service,優先生效。一般是管理員自定義的配置。
-
/usr/lib/systemd/system/ sshd.service,其次生效。軟件包自帶的默認配置。
例:開發一個 demisse 服務
[root@rocky8 ~]# cp /bin/md5sum /bin/demisse
[root@rocky8 ~]# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/demisse.service
[root@rocky8 ~]# vim /etc/systemd/system/demisse.service
[Unit]
Description=demisse server daemon[Service]
Type=fork
ExecStart=/usr/bin/demisse /dev/zero[Install]
WantedBy=multi-user.target[root@rocky8 ~]# systemctl daemon-reload
[root@rocky8 ~]# systemctl enable demisse --now
[root@rocky8 ~]# systemctl status demisse