从负载监控到服务管理,一篇文章搞定系统稳定运行的核心技能
前言
昨天学习了进程管理,今天更进一步——从监控系统负载到管理系统服务,教你如何判断服务器是否健康、如何用sstemd优雅地管理各种服务。
今天的内容分两大块:
- 监控系统负载:用
stress模拟压力,用sar、iotop定位瓶颈 - Linux 服务管理:systemd 架构、systemctl 实战、手把手写一个自定义服务
学完今天的内容,你将能独立完成线上服务器的日常监控和服务运维工作。
一、系统负载深度解析
1.1 负载平均值到底是什么?
Linux 内核以活动请求数的指数移动平均值来表示系统负载。
- 活动请求数:包含运行中进程(R状态)+ 等待IO的进程(D状态)
- 指数移动平均:每5秒计算一次,得出 1/5/15 分钟三个值
- 每个 CPU 核心有独立的请求队列
💡重要:Linux 的负载平均值包含对 IO 的考量。如果负载很高但 CPU 很低,先检查磁盘和网络。
1.2 负载值怎么解读?
以4 核心 CPU为例:
| 负载值 | 每核负载 | 状态 |
|---|---|---|
| 2.92 | 0.73 | ✅ 健康(低于0.7×核心数) |
| 4.48 | 1.12 | ⚠️ 超载 |
| 5.20 | 1.30 | 🔴 严重超载 |
理想值:长期平均负载不超过CPU核心数 × 0.7
# 查看CPU核心数lscpu|grep"^CPU(s):"# 查看当前负载uptime# 13:47:10 up 5:01, 2 users, load average: 0.00, 0.01, 0.05# 1分钟 ↑ 5分钟 ↑ 15分钟 ↑二、压力测试工具 stress
stress用于模拟各种资源的高负载,是测试系统稳定性的利器。
# 安装yuminstall-ystress# 基本用法stress--cpu8--io4--vm2--vm-bytes 128M--timeout10s2.1 压测 CPU
# 让2个CPU核心满载stress-c2# top中可以看到2个stress进程各占100% CPUtop# %Cpu(s): 100.0 us, 0.0 sy, 0.0 id# PID USER %CPU COMMAND# 2596 root 100.0 stress# 2597 root 100.0 stress2.2 压测内存
# 压测前查看内存free-m# total used free# Mem: 3931 478 1500# 占用1GB内存stress-m1--vm-bytes 1G# 再次查看free-m# Mem: 3931 1403 575 ← used增加了约1G2.3 压测磁盘 IO
# 持续写入2GB数据stress-d1--hdd-bytes 2G# 用 iotop 查看实时磁盘读写yuminstall-yiotop iotop# 用 sar 查看磁盘统计yuminstall-ysysstat sar-dp1# %util 列表示磁盘繁忙程度,接近100%说明IO已满2.4 压测网络
# 下载大文件产生网络流量wgethttp://192.168.50.200/course-materials/iso/CentOS-7-x86_64-DVD-2207-02.iso# 监控网络带宽sar-nDEV1# rxkB/s = 接收速率(KB/s)# txkB/s = 发送速率(KB/s)三、监控工具总结
3.1 命令速查表
| 监控维度 | 命令 | 说明 |
|---|---|---|
| CPU/内存/进程 | top | 实时动态监控 |
| 负载平均值 | uptime | 快速查看 |
| CPU信息 | lscpu | 查看核心数 |
| 内存 | free -m | 查看内存使用 |
| 磁盘IO | iotop | 按进程查看IO |
| 磁盘统计 | sar -dp 1 | IOPS、吞吐量、利用率 |
| 网络流量 | sar -n DEV 1 | 收发速率 |
| 进程列表 | ps aux | 静态快照 |
3.2 监控最佳实践(要点)
- 核心指标:CPU使用率、内存占用、磁盘IOPS、网络带宽
- 专业工具:Prometheus+Grafana(可视化)、Zabbix(全功能)
- 告警阈值:CPU持续超80%、磁盘不足10%触发告警
- 日志监控:关注
/var/log/messages的错误信息 - 磁盘健康:用
smartctl检测S.M.A.R.T信息 - 建立基线:记录正常运行时的指标,异常时对比排查
四、Linux 服务管理(systemd)
4.1 什么是 systemd?
CentOS 7 开始使用 Systemd 作为系统和服务管理器,PID 为 1,是所有进程的“老祖宗”。
# 查看 systemd 进程ps-p1# PID TTY STAT TIME COMMAND# 1 ? Ss 0:02 /usr/lib/systemd/systemd关键概念区分:
| 概念 | 含义 | 示例 |
|---|---|---|
| 服务(Service) | 从业务角度的称呼 | Web服务、数据库服务 |
| 守护进程(Daemon) | 提供服务的后台进程 | httpd、mysqld |
| Unit | systemd 管理的系统对象 | sshd.service |
4.2 Unit 类型一览
| Unit类型 | 文件后缀 | 用途 |
|---|---|---|
| Service | .service | 系统服务(最常用) |
| Socket | .socket | 进程间通信套接字 |
| Target | .target | 运行级别(如 multi-user.target) |
| Timer | .timer | 计划任务(替代cron) |
| Mount | .mount | 文件系统挂载点 |
| Path | .path | 路径监控触发服务 |
| Slice | .slice | 资源管理 |
4.3 systemctl 命令大全
查看类命令
# 查看所有已加载的unitsystemctl list-units# 查看所有unit(包括未加载的)systemctl list-unit-files# 查看指定类型的unitsystemctl list-units-tservice# 查看所有服务(含未激活)systemctl list-units--typeservice--all# 查看失败的服务systemctl--failed--typeservice# 查看定时器(计划任务)systemctl list-units-ttimer查看单个服务
# 查看服务详细状态systemctl status sshd.service# 只看是否激活systemctl is-active sshd# 只看是否开机自启systemctl is-enabled sshdstatus 输出解读:
| 字段 | 含义 |
|---|---|
| Loaded | 配置文件是否加载成功 |
| Active | 运行状态(running/exited/waiting/inactive) |
| Enabled | 是否开机自启(enabled/disabled/static) |
| Main PID | 主进程ID |
| CGroup | 进程组信息 |
控制类命令
| 命令 | 作用 |
|---|---|
systemctl start UNIT | 启动服务 |
systemctl stop UNIT | 停止服务 |
systemctl restart UNIT | 重启服务(stop + start) |
systemctl reload UNIT | 重载配置(不重启进程) |
systemctl enable UNIT | 设置开机自启 |
systemctl disable UNIT | 取消开机自启 |
systemctl enable --now UNIT | 设置开机自启并立即启动 |
systemctl mask UNIT | 屏蔽服务(无法启动) |
systemctl unmask UNIT | 取消屏蔽 |
⚠️ reload vs restart:
# reload:只重新加载配置文件,主进程不重启(无中断)systemctl reload sshd# restart:完全重启服务(有短暂中断)systemctl restart sshd五、实战:开发一个自定义 systemd 服务
5.1 第一步:编写服务程序
创建一个每5秒写日志的脚本:
[root@centos7 ~]# vim /usr/local/bin/study#!/bin/bashwhiletruedoDATE=$(date)echo"$DATE: I'M studying [ Linux ]">>/var/log/study.logsleep5done[root@centos7 ~]# chmod +x /usr/local/bin/study5.2 第二步:创建 Unit 配置文件
[root@centos7 ~]# vim /etc/systemd/system/studyd.service[Unit] Description=study server daemon [Service] ExecStart=/usr/local/bin/study [Install] WantedBy=multi-user.target配置文件结构:
| 段 | 说明 |
|---|---|
[Unit] | 服务描述和依赖关系 |
[Service] | 启动命令、重启策略等 |
[Install] | 开机启动配置(WantedBy) |
5.3 第三步:加载并启动服务
# 1. 通知 systemd 配置文件有变化systemctl daemon-reload# 2. 设置开机自启并立即启动systemctlenablestudyd--now# 3. 查看状态systemctl status studyd# ● studyd.service - study server daemon# Loaded: loaded (/etc/systemd/system/studyd.service; enabled)# Active: active (running) since ...# Main PID: 2786 (study)# CGroup: /system.slice/studyd.service# ├─2786 /bin/bash /usr/local/bin/study# └─2788 sleep 5# 4. 验证日志tail-f/var/log/study.log# 2025年 10月 31日 星期五 16:28:29 CST: I'M studying [ Linux ]5.4 systemd 服务文件存放位置
| 路径 | 用途 | 优先级 |
|---|---|---|
/etc/systemd/system/ | 管理员自定义配置 | 🥇 最高 |
/usr/lib/systemd/system/ | 软件包默认配置 | 🥈 其次 |
💡 修改系统自带服务时,建议复制到
/etc/systemd/system/再修改,避免被软件包更新覆盖。
情景模拟,回顾上篇内容
场景1:后台进程管理
1-1 关闭SSH终端后程序停止
- 原因:前台进程收到 SIGHUP 信号被终止
- 方案:
nohup python test_stress.py &或使用screen
1-2 作业控制
python test_stress.py&# 后台运行jobs# 查看作业fg%1# 切回前台Ctrl+Z# 暂停bg%1# 恢复后台运行1-3 前后台区别
- 前台:可读键盘输入,终端断开则终止
- 后台:不可读键盘输入,尝试读取会自动暂停
- passwd放后台会暂停,因为需要交互式密码输入
1-4 kill卡死进程
kill-15PID# 优雅终止kill-9PID# 强制杀死1-5 批量清理同名进程
pkillsleep# 或kill-9$(pgrepsleep)场景2:系统监控
2-1 ps 命令
psaxf# 树形进程psaux--sort-%cpu# 按CPU排序ps-uuser1# 查看user1用户进程2-2 uptime 判断
- 负载 > CPU核心数×0.7 表示过载
2-3 top 快捷键
1:展开多核P:按CPU排序M:按内存排序k:杀死进程q:退出
2-4 用户登录查看
whoami# 当前用户who# 当前登录用户w# 更详细信息last# 历史登录记录写在最后
到今天为止,你已经掌握了 Linux 系统管理的两大核心技能:
| 技能 | 核心工具 | 应用场景 |
|---|---|---|
| 系统监控 | top、uptime、sar、iotop | 排查性能瓶颈、容量规划 |
| 服务管理 | systemctl、systemd | 服务部署、开机自启、故障恢复 |
📌核心命令速查
# 监控uptime# 负载平均值top# 动态监控(1/P/M/k/q)lscpu# CPU信息free-m# 内存iotop# 磁盘IO(按进程)sar-dp1# 磁盘统计sar-nDEV1# 网络流量# 服务管理systemctl status UNIT# 查看状态systemctl start/stop/restart/reload UNIT systemctl enable/disable UNIT systemctl mask/unmask UNIT systemctl daemon-reload# 重载配置systemctl list-units-tservicesystemctl--failed点点关注,持续更新,欢迎技术讨论。