监控系统负载与 Linux 服务管理 一、监控系统负载 1. 系统负载概念 概念 说明 Load Average Linux 内核以活动请求数 的指数移动平均值 表示系统负载 活动请求数 包含 R(运行中)和 D(等待 I/O)状态的进程 计算周期 每 5 秒计算一次,汇总为 1、5、15 分钟平均值 Linux 特点 负载包含 CPU + I/O,负载高但 CPU 低时需检查磁盘/网络 CPU 核心计算 每个物理核心和超线程均计为独立执行单元
# ============== 查看 CPU 信息 ============== [ xuhaoyu@centos7 ~] $ 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( s) :2 # 输出解析:系统有 2 个 CPU 核心 # ============== 查看系统负载 ============== [ xuhaoyu@centos7 ~] $uptime 13 :47:10 up5 :01,2 users, load average:0.00 ,0.01 ,0.05 # 输出解析: # 13:47:10:当前时间 # up 5:01:系统已运行 5 小时 1 分钟 # 2 users:当前登录用户数 # load average: 0.00, 0.01, 0.05:1、5、15 分钟平均负载 # ============== 给系统添加负载 ============== [ xuhaoyu@centos7 ~] $ md5sum /dev/zero& [ 1 ] 4912 # md5sum /dev/zero 持续计算哈希,消耗 CPU [ xuhaoyu@centos7 ~] $ md5sum /dev/zero& [ 2 ] 4913 # 等待 30 秒后再次查看 [ xuhaoyu@centos7 ~] $uptime 13 :48:57 up5 :03,2 users, load average:1.02 ,0.28 ,0.13 # 负载上升至 1.02 # ============== 负载解读 ============== # 示例:4 核心 CPU # 负载值:2.92(1分钟),4.48(5分钟),5.20(15分钟) # 每个 CPU 核心负载:2.92/4=0.73,4.48/4=1.12,5.20/4=1.30 # 理想值为每个核心负载不超过 0.75(75%) 2.top命令 – 动态进程监控 快捷键 功能 1显示每个 CPU 核心的使用率 P按 CPU 使用率排序(大写) M按内存使用率排序 k终止进程(输入 PID 和信号) q退出 top h显示帮助
# ============== top 动态监控 ============== [ xuhaoyu@centos7 ~] $top # 输出动态刷新界面 top -14 :18:22 up47 min,2 users, load average:1.37 ,0.50 ,0.47 # 第一行:当前时间、运行时间、用户数、1/5/15分钟负载 Tasks:187 total,4 running,183 sleeping,0 stopped,0 zombie# 第二行:总进程数、运行中、睡眠中、停止、僵尸 %Cpu( s) :100.0 us,0.0 sy,0.0 ni,0.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st# 第三行:us=用户空间,sy=内核空间,id=空闲,wa=等待I/O KiB Mem: 4026124 total,1535676 free,490668 used,1999780 buff/cache KiB Swap:4063228 total,4063228 free,0 used.3277584 avail Mem# 第四、五行:内存和 Swap 使用 PIDUSER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND2596 root20 0 7312 100 0 R100.0 0.0 1 :01.42 stress2597 root20 0 7312 100 0 R100.0 0.0 1 :01.25 stress# 进程列表:PID、用户、优先级、虚拟/物理内存、状态、CPU%、MEM%、时间、命令 3.stress工具 – 压力测试 常用选项 选项 说明 -c N产生 N 个 CPU 压力进程(sqrt() 计算) -i N产生 N 个 I/O 压力进程(sync() 调用) -m N产生 N 个内存压力进程(malloc()/free()) --vm-bytes B每个内存进程分配 B 字节(默认 256MB) -d N产生 N 个磁盘 I/O 压力进程(write()/unlink()) --hdd-bytes B每个磁盘进程写入 B 字节 -t 时间指定运行时长(如10s、1m)
# ============== 安装 stress ============== [ root@centos7 ~] # yum install -y stress # 安装压力测试工具 # ============== stress 帮助信息 ============== [ root@centos7 ~] # stress --help `stress' imposes certain types of compute stress on your system Usage: stress [OPTION [ARG]] ... -?, --help show this help statement -v, --verbose be verbose -q, --quiet be quiet -t, --timeout N timeout after N seconds -c, --cpu N spawn N workers spinning on sqrt() -i, --io N spawn N workers spinning on sync() -m, --vm N spawn N workers spinning on malloc()/free() --vm-bytes B malloc B bytes per vm worker (default is 256MB) -d, --hdd N spawn N workers spinning on write()/unlink() --hdd-bytes B write B bytes per hdd worker (default is 1GB) Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s # 示例:8个CPU压力、4个I/O压力、2个内存压力各分配128MB,运行10秒 # ============== CPU 压力测试 ============== [root@centos7 ~]# stress -c 2 stress: info: [2595] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd # 命令解析:-c 2 消耗 2 个 CPU 核心 # 输出:启动 2 个 CPU 工作进程 # top 监控显示两个 stress 进程各占 100% CPU [xuhaoyu@centos7 ]$ top top - 14:18:22 up 47 min, 2 users, load average: 1.37, 0.50, 0.47 Tasks: 187 total, 4 running, 183 sleeping, 0 stopped, 0 zombie %Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2596 root 20 0 7312 100 0 R 100.0 0.0 1:01.42 stress 2597 root 20 0 7312 100 0 R 100.0 0.0 1:01.25 stress # 两个 stress 进程各占 100% CPU # ============== 内存压力测试 ============== # 消耗前查看内存 [root@centos7 ~]# free -m total used free shared buff/cache available Mem: 3931 478 1500 14 1952 3201 Swap: 3967 0 3967 # 当前空闲内存 1500MB # 消耗 1G 内存 [root@centos7 ~]# stress -m 1 --vm-bytes 1G stress: info: [2623] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd # 命令解析:-m 1 启动 1 个内存工作进程,--vm-bytes 1G 分配 1GB 内存 # 消耗后查看内存 [root@centos7 ~]# free -m total used free shared buff/cache available Mem: 3931 1403 575 14 1952 2274 Swap: 3967 0 3967 # 内存使用从 478MB 增至 1403MB,空闲从 1500MB 降至 575MB # ============== 磁盘 I/O 压力测试 ============== [root@centos7 ~]# stress -d 1 --hdd-bytes 2G # 命令解析:-d 1 启动 1 个磁盘 I/O 工作进程,写入 2GB 数据 # 安装监控工具 [root@centos7 ~]# yum install -y sysstat iotop # sysstat:提供 sar 命令 # iotop:实时监控磁盘读写进程 # sar 监控磁盘读写(单位:512字节/秒) [root@centos7 ~]# sar -dp 1 14时23分29秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14时23分30秒 sda 2699.00 0.00 2762752.00 1023.62 6.11 2.26 0.29 79.50 14时23分30秒 centos-root 2698.00 0.00 2761728.00 1023.62 6.11 2.26 0.29 79.50 # 输出解析: # tps:每秒传输次数 # rd_sec/s:每秒读取扇区数(每个扇区 512 字节) # wr_sec/s:每秒写入扇区数 # %util:磁盘利用率(79.50%) # iotop 实时监控进程读写 [root@centos7 ~]# iotop Total DISK READ : 0.00 B/s | Total DISK WRITE : 51.90 M/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 62.16 M/s TID PRIO USER DISK READ DISK WRITE> SWAPIN IO COMMAND 4573 be/4 xuhaoyu 0.00 B/s 51.90 M/s 0.00 % 96.45 % # 输出解析:左右方向键调整排序列,' > ' 表示当前排序列# 显示每个进程的磁盘读写速度 # ============== 网络流量测试 ============== # 下载大文件产生网络流量 [ root@centos7 ~] # wget http://192.168.50.200/course-materials/iso/CentOS-7-x86_64-DVD-2207-02.iso # 下载 ISO 镜像文件 # sar 监控网络带宽 [ root@centos7 ~] # sar -n DEV 1 # 命令解析:-n DEV 监控网络设备,1 每秒刷新一次 14 时29分07秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s14 时29分08秒 ens3269961.00 5404.00 96338.71 513.95 0.00 0.00 0.00 14 时29分08秒 lo0.00 0.00 0.00 0.00 0.00 0.00 0.00 # 输出解析: # IFACE:网络接口名 # rxpck/s:每秒接收包数 # txpck/s:每秒发送包数 # rxkB/s:每秒接收数据量(KB) # txkB/s:每秒发送数据量(KB) 二、Linux 服务管理 1. systemd 基本概念 CentOS 7 使用 Systemd 引导系统启动,所有进程并行启动 ,启动速度最快。
概念 说明 示例 服务(Service) 从业务角度称呼 Web 服务、数据库服务 守护进程(Daemon) 提供服务支持的后台进程 httpd、sshd、mysqld systemd PID 为 1,用户空间第一个进程 管理系统和服务的初始化 kthreadd PID 为 2,内核空间线程管理 内核线程的父进程
# ============== 服务与守护进程的关系(以 httpd 为例) ============== [ root@centos7 ~] # yum install -y httpd # 安装 Apache Web 服务 [ root@centos7 ~] # systemctl start httpd # 启动 httpd 服务 [ root@centos7 ~] # ps -C httpd f PID TTY STAT TIME COMMAND5271 ? Ss0 :00 /usr/sbin/httpd-DFOREGROUND 5288 ? S0 :00\ _ /usr/sbin/httpd-DFOREGROUND 5289 ? S0 :00\ _ /usr/sbin/httpd-DFOREGROUND 5290 ? S0 :00\ _ /usr/sbin/httpd-DFOREGROUND 5291 ? S0 :00\ _ /usr/sbin/httpd-DFOREGROUND 5292 ? S0 :00\ _ /usr/sbin/httpd-DFOREGROUND # 命令解析:ps -C httpd f 查看 httpd 进程树 # 输出解析:5271 是主进程(守护进程),5288-5292 是子进程 # 服务 = web 服务,守护进程 = httpd 2. systemd 架构 组件 说明 systemd 守护进程(PID=1),实际执行管理工作 systemctl 用户交互工具,发送命令给 systemd Unit 文件 定义服务、socket、timer 等配置的文件
3. Unit 类型 Unit 类型 文件扩展名 说明 Service .service定义系统服务(如 httpd.service) Socket .socket标识进程间通信的 socket 文件 Target .target模拟实现"运行级别" Timer .timer管理计划任务 Device .device定义内核识别的设备 Mount .mount定义文件系统挂载点 Snapshot .snapshot管理系统快照 Swap .swap标识 swap 设备 Automount .automount文件系统的自动挂载点 Path .path根据文件系统变化触发其他服务 Slice .slice用于资源管理
4. 查看 Unit 列表 # ============== systemctl list-units:列出已加载的 units ============== [ root@centos7 ~] # systemctl list-units # 命令解析:列出当前已加载到内存中的 units # 输出格式:UNIT | LOAD | ACTIVE | SUB | DESCRIPTION UNIT LOAD ACTIVE SUB DESCRIPTION sshd.service loaded active running OpenSSH server daemon httpd.service loaded active running The Apache HTTP Server# 输出解析: # UNIT:服务单元名称 # LOAD:是否正确解析并加载到内存 # ACTIVE:高级别激活状态(是否成功启动) # SUB:低级别激活状态(详细信息) # DESCRIPTION:简短描述 # ============== -t 选项:按类型过滤 ============== [ xuhaoyu@centos7 ~] $ systemctl list-units-t timer# 命令解析:-t timer 只显示 timer 类型的 units 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 anchorfor DNSSEC LOAD= 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 loadedunits listed. Pass--all to see loaded but inactive units, too. To show all installed unit files use'systemctl list-unit-files' . # ============== 查看所有服务(含未激活) ============== [ root@centos7 ~] # systemctl list-units --type service --all # 命令解析:--type service 只显示 service 类型,--all 显示所有(含未加载) # ============== 列出所有 unit 文件(含未加载) ============== [ root@centos7 ~] # systemctl list-unit-files # 命令解析:列出系统中所有已安装的 unit 文件 # 输出:UNIT FILE | STATE(enabled/disabled/static/masked) # ============== 查看失败的服务 ============== [ root@centos7 ~] # systemctl --failed --type service # 命令解析:--failed 只显示启动失败的服务 5. 查看单个 Unit 信息 # ============== systemctl status:查看服务详细信息 ============== [ xuhaoyu@centos7 ~] $ systemctl status sshd.service ● sshd.service - OpenSSH server daemon Loaded: loaded( /usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active( running) since 三2022 -11-09 08:45:45 CST; 5h 50min ago Docs: man:sshd( 8 ) man:sshd_config( 5 ) Main PID:1167 ( sshd) Tasks:1 CGroup: /system.slice/sshd.service └─1167 /usr/sbin/sshd-D # 输出解析: # Loaded:单元配置文件已处理,路径、是否开机自启 # Active:当前状态(active=运行中,inactive=已停止,failed=失败) # Main PID:主进程 ID # Tasks:任务数 # CGroup:控制组路径 状态说明
关键字 概述 loaded 单元配置文件已处理 active(running) 正在运行 active(exited) 已成功完成一次性配置 active(waiting) 运行中,正在等待事件 inactive 不再运行 enabled 系统引导时启动 disabled 系统引导时不启动 static 无法启动,依赖其他单元启动
6. 控制系统服务 命令 任务 systemctl status UNIT查看单元状态的详细信息 systemctl stop UNIT停止一项服务 systemctl start UNIT启动一项服务 systemctl restart UNIT重启一项服务(stop + start) systemctl reload UNIT重新加载配置文件(主进程不重启) systemctl enable UNIT设置开机自启(--now同时启动) systemctl disable UNIT禁止开机自启(--now同时停止) systemctl is-enabled UNIT查看是否已设置开机自启 systemctl mask UNIT屏蔽服务(无法启动) systemctl unmask UNIT取消屏蔽
# ============== 启动与停止服务 ============== [ root@centos7 ~] # systemctl stop sshd.service # 停止 SSH 服务 [ root@centos7 ~] # ssh xuhaoyu@centos7 hostname ssh: connect tohost centos7 port22 : Connection refused# 连接被拒绝 [ root@centos7 ~] # systemctl start sshd.service # 启动 SSH 服务 [ root@centos7 ~] # ssh xuhaoyu@centos7 hostname centos7# 连接成功 # ============== 重启与重载服务 ============== [ root@centos7 ~] # systemctl restart sshd.service # restart = stop + start,主进程 PID 会改变 [ root@centos7 ~] # systemctl reload sshd.service # 主进程不重启,仅重新加载配置文件 # 适用于修改端口、超时等无需完全重启的场景 # ============== 设置开机自启 ============== [ root@centos7 ~] # systemctl enable sshd.service Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to /usr/lib/systemd/system/sshd.service.# 创建符号链接到 multi-user.target.wants/ 目录 [ root@centos7 ~] # systemctl is-enabled sshd enabled# 查看是否已启用开机自启 # 使用 --now 选项同时执行 [ root@centos7 ~] # systemctl enable --now sshd.service # enable + start,立即启动并设置开机自启 [ root@centos7 ~] # systemctl disable --now sshd.service # disable + stop,立即停止并禁止开机自启 # ============== 屏蔽与取消屏蔽服务 ============== [ root@centos7 ~] # systemctl mask sshd.service Created symlink from /etc/systemd/system/sshd.service to /dev/null.# 将服务链接到 /dev/null,任何启动尝试都会失败 [ root@centos7 ~] # systemctl start sshd.service Failed to start sshd.service: Unit sshd.service is masked.# 无法启动,提示已被屏蔽 [ root@centos7 ~] # systemctl unmask sshd.service Removed symlink /etc/systemd/system/sshd.service.# 恢复服务可用性 [ root@centos7 ~] # systemctl start sshd.service # 可以正常启动 7. Unit 配置文件 配置文件位置(优先级从高到低) :
路径 说明 /etc/systemd/system/管理员自定义配置,优先生效 /usr/lib/systemd/system/软件包默认配置,其次生效
# ============== sshd.service 配置文件详解 ============== [ root@centos7 ~] cat /usr/lib/systemd/system/sshd.service# 查看 sshd 服务单元文件 # [Unit] 部分:描述服务基本信息与依赖关系 [ Unit] Description = OpenSSH server daemon# 服务的描述信息 Documentation = man:sshd( 8 ) man:sshd_config( 5 ) # 指定帮助文档路径 After = network.target sshd-keygen.service# 定义启动顺序:在网络和密钥生成服务之后启动 Wants = sshd-keygen.service# "希望" sshd-keygen.service 运行,但不是强制依赖 # [Service] 部分:定义服务的启动方式、执行命令、重启策略 [ Service] Type = notify# 服务类型:notify 表示启动后主动通知 systemd 已就绪 EnvironmentFile = /etc/sysconfig/sshd# 指定环境变量文件路径 ExecStart = /usr/sbin/sshd-D $OPTIONS # 启动命令:-D 前台运行,$OPTIONS 引用环境变量 ExecReload = /bin/kill-HUP $MAINPID # 重载命令:发送 SIGHUP 信号重新加载配置 KillMode = process# 杀死模式:只杀主进程,保留子进程(已有连接) Restart = on-failure# 重启策略:非正常退出时自动重启 RestartSec = 42s# 重启前等待 42 秒 # [Install] 部分:定义如何被启用(开机自启) [ Install] WantedBy = multi-user.target# 系统启动到 multi-user.target 时自动启动该服务 8. 开发自定义服务(studyd) # ============== 步骤 1:开发服务主程序 ============== [ root@centos7 ~] # vim /usr/local/bin/study # 创建服务脚本 # ============== 脚本内容 ============== #!/bin/bash # 指定解释器 while true # 无限循环 do # 获取当前时间并记录到日志 DATE = $( date ) echo "$DATE : I'M studying [ Linux ]" >> /var/log/study.log# 追加写入日志文件 sleep 5 # 每 5 秒执行一次 done # ============== 添加执行权限 ============== [ root@centos7 ~] # chmod +x /usr/local/bin/study # 添加可执行权限 # ============== 步骤 2:创建服务单元文件 ============== [ root@centos7 ~] # cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/studyd.service # 复制 sshd.service 作为模板 [ root@centos7 ~] # vim /etc/systemd/system/studyd.service # 编辑服务单元文件 # ============== studyd.service 内容 ============== [ Unit] Description = study server daemon# 服务描述 [ Service] ExecStart = /usr/local/bin/study# 启动命令 [ Install] WantedBy = multi-user.target# 开机自启目标 # ============== 步骤 3:加载并启动服务 ============== [ root@centos7 ~] # systemctl daemon-reload # 通知 systemd 读取 unit 变化 [ root@centos7 ~] # systemctl enable studyd --now # 启用并立即启动服务 [ root@centos7 ~] # systemctl status studyd ● studyd.service - study server daemon Loaded: loaded( /etc/systemd/system/studyd.service; enabled; vendor preset: disabled) Active: active( running) since 五2025 -10-3116 :28:34 CST; 1s ago Main PID:2786 ( study) Tasks:2 CGroup: /system.slice/studyd.service ├─2786 /bin/bash /usr/local/bin/study └─2788sleep 5 # 服务正常运行 # ============== 步骤 4:验证日志 ============== [ root@centos7 ~] # tail -f /var/log/study.log 2025 年10 月31 日 星期五16 :28:29 CST: I'M studying [ Linux ] 2025年 10月 31日 星期五 16:28:34 CST: I' M studying[ Linux] 2025 年10 月31 日 星期五16 :28:39 CST: I'M studying[ Linux] # 每 5 秒输出一条日志 三、速查表 监控命令速查 功能 命令 查看系统负载 uptime查看 CPU 信息 lscpu动态监控进程 topCPU 压力测试 stress -c 进程名内存压力测试 stress -m 进程名 --vm-bytes 大小磁盘 I/O 压力测试 stress -d 进程名 --hdd-bytes 大小监控磁盘 I/O sar -dp 1监控磁盘读写进程 iotop监控网络流量 sar -n DEV 1查看内存使用 free -m
systemctl 命令速查 操作 命令 查看服务状态 systemctl status UNIT启动服务 systemctl start UNIT停止服务 systemctl stop UNIT重启服务 systemctl restart UNIT重载配置 systemctl reload UNIT设置开机自启 systemctl enable UNIT禁止开机自启 systemctl disable UNIT设置开机自启并立即启动 systemctl enable --now UNIT禁止开机自启并立即停止 systemctl disable --now UNIT查看是否开机自启 systemctl is-enabled UNIT屏蔽服务 systemctl mask UNIT取消屏蔽 systemctl unmask UNIT查看所有已加载 unit systemctl list-units查看所有 unit 文件 systemctl list-unit-files查看指定类型 unit systemctl list-units -t 类型查看失败的服务 systemctl --failed --type service重新加载 unit 配置 systemctl daemon-reload