目录
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