Linux 系统监控与 systemd 服务管理 —— 实操教程
2026/7/23 5:20:48 网站建设 项目流程

1.监控系统负载

系统负载介绍

系统负载介绍

一、定义

系统负载(Load Average)指单位时间内,CPU 等待队列中就绪 / 运行进程的平均数量,反映 CPU 繁忙程度,分 1 分钟、5 分钟、15 分钟三个均值。

二、查看命令

  1. uptime:最简查看负载
  2. top:实时负载 + 进程资源
  3. htop:可视化负载监控
  4. cat /proc/loadavg:读取原始负载数据

三、负载判断标准(多核 CPU)

假设 CPU 核心数为 N

  1. load < N:CPU 空闲,资源充足
  2. load = N:CPU 满载,无剩余算力
  3. load > N:CPU 过载,进程排队等待,响应变慢

示例:4 核 CPU,负载 4 为满负荷,负载 6 代表大量进程阻塞。

四、负载高常见原因

  1. CPU 密集程序:编译、视频转码、数据计算
  2. IO 阻塞:磁盘读写慢,进程等待磁盘,拉高负载但 CPU 使用率低
  3. 大量线程 / 进程并发,资源争抢
  4. 内存不足触发 swap 交换,磁盘 IO 飙升

五、负载与 CPU 使用率区别

  • CPU 使用率:当前 CPU 正在运算的比例
  • 系统负载:包含运行 + 等待 CPU/IO 的全部进程,IO 阻塞时负载高、CPU 占用低是典型现象

六、优化排查思路

  1. top按 P 排序,查找高 CPU 进程
  2. iostat查看磁盘 IO,判断 IO 瓶颈
  3. free -h检查内存与 Swap 占用
  4. 限制并发进程、优化磁盘、扩容 CPU / 内存

stress 工具

Linux 中的stress工具用于对系统进行压力测试,可模拟 CPU、内存、I/O 和磁盘等资源的高负载状态。通过指定参数(如-c压 CPU、-m压内存)可创建负载,帮助发现系统在压力下的稳定性问题,常用于性能调优或硬件验证。

# 安装[root@centos7 ~10:08:19]# yum install -y stress# 帮助信息[root@centos7 ~10:31:33]# stress --help`stress' imposes certain types of compute stress on your system Usage: stress[OPTION[ARG]]... -?,--helpshow thishelpstatement--versionshow version statement -v,--verbosebe verbose -q,--quietbe quiet -n, --dry-run show what would have beendone-t,--timeoutNtimeoutafter N seconds--backoffNwaitfactor of N microseconds before work starts -c,--cpuN spawn N workers spinning on sqrt()-i,--ioN spawn N workers spinning on sync()-m,--vmN spawn N workers spinning on malloc()/free()--vm-bytes B malloc B bytes per vm worker(default is 256MB)--vm-stride Btoucha byte every B bytes(default is4096)--vm-hang NsleepN secs beforefree(default none,0is inf)--vm-keep redirty memory instead of freeing and reallocating -d,--hddN spawn N workers spinning on write()/unlink()--hdd-bytes BwriteB bytes per hdd worker(default is 1GB)Example: stress--cpu8--io4--vm2--vm-bytes 128M--timeout10s Note: Numbers may be suffixed with s,m,h,d,y(time)or B,K,M,G(size).

压力测试-CPU

# 消耗2个CPU[root@centos7 ~10:31:52]# stress -c 2stress: info:[3202]dispatching hogs:2cpu,0io,0vm,0hdd# top 监控[xzh@centos7 ~10:32:02]$toptop-10:32:44 up1:42,2users, load average:1.07,0.29,0.14Tasks:195total,4running,191sleeping,0stopped,0zombie %Cpu(s):99.4us,0.3sy,0.0ni,0.0id,0.0wa,0.0hi,0.3si,0.0st KiB Mem:4026116total,2940324free,514972used,570820buff/cache KiB Swap:4063228total,4063228free,0used.3266204avail Mem PIDUSERPR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND3204root2007312960R100.00.00:37.43 stress3203root2007312960R99.30.00:37.24 stress745root20029556452924040S0.30.10:11.95 vmtoolsd3205xzh20016210823561588R0.30.10:00.11top......

压力测试-内存

# 消耗前内存[root@centos7 ~10:33:11]# free -mtotal usedfreeshared buff/cache available Mem:39315022871185573189Swap:396703967# 消耗 1G 内存[root@centos7 ~10:33:19]# stress -m 1 --vm-bytes 1Gstress: info:[3225]dispatching hogs:0cpu,0io,1vm,0hdd# 消耗后内存[xzh@centos7 ~10:32:49]$free-mtotal usedfreeshared buff/cache available Mem:393111662207185572526Swap:396703967

压力测试-磁盘

# 消耗磁盘IO[root@centos7 ~]# stress -d 1 --hdd-bytes 2G# 监视活动状态百分比,%util[root@centos7 ~10:35:31]# yum install -y sysstat iotop#[root@centos7 ~10:35:40]# sar -dp 1Linux3.10.0-1160.71.1.el7.x86_64(centos7.xzh.cloud)2026年07月22日 _x86_64_(2CPU)10时35分53秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util10时35分54秒 sda367.330.00376142.571024.000.421.160.9936.3410时35分54秒 sr00.000.000.000.000.000.000.000.0010时35分54秒 centos-root366.340.00375128.711024.000.431.160.9936.3410时35分54秒 centos-swap0.000.000.000.000.000.000.000.0010时35分54秒 centos-home0.000.000.000.000.000.000.000.00......

网络测试

# 传送一个大size的文件[root@centos7 ~10:41:59]# wget http://192.168.50.200/course-materials/iso/CentOS-7-x86_64-DVD-2207-02.iso# 监控带宽[root@centos7 ~10:40:45]# sar -n DEV 1......10时43分18秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s10时43分19秒 lo0.000.000.000.000.000.000.0010时43分19秒 virbr0-nic0.000.000.000.000.000.000.0010时43分19秒 virbr00.000.000.000.000.000.000.0010时43分19秒 ens3328807.001710.0042095.60101.280.000.000.00......

监控总结

以下是针对 Linux 系统监控的几条实用建议,涵盖关键监控维度和最佳实践:

  1. 核心指标实时监控重点跟踪 CPU 使用率(用户态 / 系统态占比)、内存占用(含缓存 /swap 使用率)、磁盘 I/O(读写吞吐量、IOPS)和网络流量(带宽利用率、连接数)。可通过top/htop(实时)、vmstat/iostat(系统级)等工具快速查看。
  2. 部署专业监控工具对于服务器集群或长期监控需求,建议使用 Prometheus + Grafana(可视化强)、Zabbix(全功能监控)或 Nagios(轻量告警)等工具,实现指标集中收集、趋势分析和历史数据查询。
  3. 设置关键阈值告警针对核心指标配置告警阈值(如 CPU 持续 5 分钟超 80%、磁盘空间不足 10%),通过邮件、短信或即时通讯工具推送告警,避免故障扩大。注意避免告警风暴(可设置告警合并或延迟)。
  4. 监控进程与服务状态定期检查关键服务(如 Nginx、MySQL)的运行状态、进程数及资源消耗,可通过systemctl status或自定义脚本实现。对异常退出的进程,结合日志排查崩溃原因。
  5. 日志集中管理与分析将系统日志(/var/log/messages)、应用日志集中存储(如使用 ELK 栈),关注错误信息(ERROR级别)、登录异常(/var/log/auth.log)和磁盘错误(dmesg | grep error),必要时配置日志告警规则。
  6. 磁盘健康监控除空间使用率外,需关注磁盘坏块(smartctl工具检测 S.M.A.R.T 信息)和文件系统完整性(定期运行fsck,非挂载状态下),避免硬件故障导致数据丢失。
  7. 网络与安全监控监控端口开放状态(netstat/ss)、异常连接(尤其是外部 IP 的高频访问)和防火墙规则生效情况。可结合tcpdump抓包分析可疑流量。
  8. 定期性能基线分析记录系统正常运行时的指标基线(如平均负载、内存使用峰值),当指标偏离基线时及时排查,避免微小异常累积成故障。
  9. 自动化监控脚本对个性化需求(如特定目录文件数、应用响应时间),编写 Shell 或 Python 脚本定期执行检查,输出结果至监控系统或直接触发告警。
  10. 监控权限与安全限制监控工具的权限(如仅授予读取日志和指标的权限),加密传输监控数据,防止监控系统本身成为安全薄弱点。

通过分层监控(基础指标→服务状态→业务性能)和主动预警,可显著提升系统稳定性和故障响应效率。

监控维度核心指标常用排查命令告警阈值参考核心作用
CPU 监控平均负载、us/sy/id/wa 使用率、上下文切换uptime、top、mpstat、pidstat负载≥CPU 核心数;CPU 持续 5min>80%判断计算资源瓶颈,区分 CPU 密集 / IO 阻塞高负载
内存监控可用内存、缓存、Swap 使用率free -h、vmstat、smem可用内存 <20%;Swap>20%预防内存耗尽、频繁交换引发系统卡顿
磁盘 IO 监控IOPS、读写吞吐、% util、iowaitiostat -x、iotop、smartctl磁盘 util 持续 100%;磁盘剩余 < 10%定位磁盘读写瓶颈、检测硬盘硬件故障
网络监控带宽占用、TCP 连接、丢包延迟ss、iftop、mtr、tcpdump带宽 > 80%;大量异常外部连接排查带宽打满、网络攻击、链路丢包问题
服务进程监控进程 CPU / 内存占用、服务运行状态systemctl、ps、pstree核心服务离线;单进程占用 90% CPU保障业务服务持续稳定运行
日志监控系统报错、登录异常、应用 ERRORcat、grep、ELK 日志栈持续出现 ERROR、陌生 IP 登录提前发现入侵、程序崩溃、系统报错
综合监控平台全量指标、历史曲线、告警Prometheus+Grafana、Zabbix、Nagios自定义多指标阈值集群统一监控、长期性能趋势分析
自定义巡检业务指标、目录文件、接口耗时Shell/Python 脚本业务响应超时、目录文件暴涨适配个性化业务监控需求

2.Linux 服务管理

systemd 介绍

基本概念

CentOS 7 使用 Systemd 引导系统启动,速度最快,所有进程无论有无依赖关系则都是并行启动(很多时候进程没有真正启动而是只有一个信号或者说是标记而已,在真正利用的时候才会真正启动)。Systemd为了解决上文的问题而诞生。它的目标是,为系统的启动和管理提供一套完整的解决方案。

服务:从业务角度来称呼,例如 web 服务,数据库服务。

守护进程(daemon):web 服务器对外提供 web 服务,由 web 相关的进程提供支持。

例如:

# 安装软件包[root@centos7 ~10:43:51]# yum install -y httpd# 启动服务[root@centos7 ~11:13:45]# systemctl start httpd# 查看进程[root@centos7 ~11:15:12]# ps -C httpd fPID TTY STAT TIME COMMAND3785? Ss0:00 /usr/sbin/httpd-DFOREGROUND3796? S0:00\_ /usr/sbin/httpd-DFOREGROUND3797? S0:00\_ /usr/sbin/httpd-DFOREGROUND3798? S0:00\_ /usr/sbin/httpd-DFOREGROUND3799? S0:00\_ /usr/sbin/httpd-DFOREGROUND3800? S0:00\_ /usr/sbin/httpd-DFOREGROU

httpd 服务对应的守护进程是3785、3796…

systemd 架构

systemd 是 Linux 下 PID=1 的初始化进程,替代 SysVinit,采用事件驱动、并行启动。

核心将各类资源抽象为Unit 单元(service/target/mount/timer 等),通过配置定义依赖(Requires/Wants)与启动顺序(After/Before);

内置 journald 统一收集系统日志,依托 cgroups 管理进程组、限制资源;

提供 systemctl、journalctl 等工具管理单元;target 替代传统运行级别,完成系统初始化、服务启停、关机重启全生命周期管控。

unit 类型

systemctl 命令用于管理不同类型的系统对象,这些对象称之为units

单元类型作用后缀示例
Service unit定义系统服务.servicehttpd.service
Socket unit进程间通信 socket.socketsshd.socket
Target unit模拟传统运行级别,整合一组单元.targetmulti-user.target
Timer unit实现定时任务.timerbackup.timer
Device unit内核识别的硬件设备.devicedev-sda1.device
Mount unit定义文件系统挂载点.mountmnt-data.mount
Snapshot unit管理系统快照.snapshotclean.snapshot
Swap unit管理 Swap 交换设备.swapdev-sdb2.swap
Automount unit文件系统自动挂载点.automountmnt-cdrom.automount
Path unit监控文件变动,触发服务.pathlog-monitor.path
Slice unit配合 cgroup 进行资源管控.sliceuser.slice

查看 unit 列表信息

# 列出状态为loaded units[root@centos7 ~16:53:11]# systemctl list-units

systemctl list-units命令输出说明:

  • 字段说明
    UNIT服务单元名称
    LOADsystemd 是否正确解析单元配置,并加载至内存
    ACTIVE单元高级别激活状态,表示单元是否成功启动
    SUB单元低级别激活状态,提供更详细状态信息,随单元类型、运行状态变化
    DESCRIPTION单元简短描述
# -t选项查看特定类型unit 清单[root@centos7 ~16:53:27]# systemctl list-units -t timerUNIT LOAD ACTIVE SUB DESCRIPTION systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directori unbound-anchor.timer loaded active waiting daily update of the root trust ancho 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.2loadedunitslisted. Pass--allto see loaded but inactive units, too. To show all installed unit files use'systemctl list-unit-files'.# 列出类型为service,状态为active和inactive unit[root@centos7 ~]# systemctl list-units --type service --all# 列出所有unit,包括未loaded的unit[root@centos7 ~16:53:37]# systemctl list-unit-files# 查看失败的服务[root@centos7 ~16:54:05]# systemctl --failed --type service

查看单个 unit 信息

[xzh@centos7 ~16:54:37]$ 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 三2026-07-2216:50:46 CST;4min 31s ago Docs: man:sshd(8)man:sshd_config(5)Main PID:1228(sshd)Tasks:1CGroup: /system.slice/sshd.service └─1228 /usr/sbin/sshd-D
关键字概述
loaded单元配置文件已处理
active(running)正在运行
active(exited)已成功完成一次性配置
active(waiting)运行中,正在等待事件
inactive不再运行
enabled系统引导时启动
disabled系统引导时不启动
static无法启动,依赖其他单元启动

控制系统服务

命令任务
systemctl statusUNIT查看单元状态的详细信息。
systemctl stopUNIT在运行中的系统上停止一项服务。
systemctl startUNIT在运行中的系统上启动一项服务。
systemctl restartUNIT在运行中的系统上重新启动一项服务。
systemctl reloadUNIT重新加载运行中服务的配置文件。
systemctl maskUNIT禁用服务,使其无法手动启动或在系统引导时启动。
systemctl unmaskUNIT使屏蔽的服务变为可用。
systemctl enableUNIT将服务配置为在系统引导时启动。使用--now选项也会启动该服务。
systemctl disableUNIT禁止服务在系统引导时启动。使用--now选项也会停止该服务。
# 停止服务[root@centos7 ~16:57:50]# systemctl stop sshd.service# 客户端连接测试[root@centos7 ~16:58:37]# ssh xzh@10.1.8.10ssh: connect tohost10.1.8.10 port22: Connection refused# 启动服务[root@centos7 ~17:01:38]# systemctl start sshd.service# 客户端连接测试[root@centos7 ~17:03:29]# ssh xzh@10.1.8.10The authenticity ofhost'10.1.8.10 (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:R/m5F/fO4mbXy7tOrX7ht5X3p5y+PKzQuoy2wYtC6LE. ECDSA key fingerprint is MD5:f4:44:73:b7:ed:03:1f:61:cc:c1:06:b8:62:2d:10:29. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.1.8.10' (ECDSA) to the list of known hosts. xzh@10.1.8.10's password: Last login: Wed Jul2216:51:322026from10.1.8.1# 重启服务,相当于stop再start[root@centos7 ~]# systemctl restart sshd.service# 一般用于配置文件变动后,重新加载[root@centos7 ~17:06:39]# systemctl restart sshd.service# 重新加载服务,服务对应的主进程不会重启,只会重新加载一次配置文件。# 禁止服务开机自启[root@centos7 ~17:07:20]# systemctl disable sshd.service[root@centos7 ~17:07:42]# systemctl is-enabled sshd.servicedisabled# 重启系统验证[root@centos7 ~17:08:02]# reboot# 设置服务开机自启[root@centos7 ~17:08:25]# systemctl enable sshd.service[root@centos7 ~17:08:45]# systemctl is-enabled sshdenabled# 重启系统验证[root@centos7 ~17:08:48]# reboot# 禁用服务:服务被禁用后,将无法start,因为服务的配置文件指向/dev/null[root@centos7 ~17:12:40]# systemctl mask sshd.service# 取消禁用[root@centos7 ~17:12:47]# systemctl unmask sshd.service

unit 配置文件

unit 配置文件存放在多个位置:

  • /etc /systemd/system/unit.service,优先生效。一般是管理员自定义的配置。
  • /usr/lib /systemd/system/unit.service,其次生效。软件包自带的默认配置。

配置文件说明

示例单元文件/usr/lib/systemd/system/sshd.service说明

# 标识该部分为 Unit 配置,用于描述服务的基本信息、依赖关系等。 [Unit] # 服务的描述信息,说明这是 "OpenSSH 服务器守护进程",便于管理员识别服务用途。 Description=OpenSSH server daemon # 指定服务的文档路径,这里指向 sshd 命令的手册页(man 8 sshd)和配置文件的手册页(man 5 sshd_config),方便用户查阅帮助。 Documentation=man:sshd(8) man:sshd_config(5) # 定义服务的启动顺序:sshd 服务必须在 network.target(网络服务就绪)和 sshd-keygen.service(SSH 密钥生成服务)之后启动,确保依赖的资源已准备好。 After=network.target sshd-keygen.service # 表示 sshd 服务 "希望" sshd-keygen.service 运行(但不是强制依赖)。如果 sshd-keygen.service 启动失败,sshd 仍会尝试启动(通常用于生成初始 SSH 密钥,若密钥已存在则不影响)。 Wants=sshd-keygen.service # 标识该部分为 Service 配置,用于定义服务的启动方式、执行命令、重启策略等。 [Service] # 定义服务的类型为 notify:表示服务启动后会主动通知 systemd 自己已就绪(通过 sd_notify() 函数),systemd 会等待这个通知后再继续后续流程,确保服务真正可用。 Type=notify # 指定环境变量文件的路径,/etc/sysconfig/sshd 中通常定义 OPTIONS 等变量(如额外的 sshd 启动参数),这些变量会被后续的 ExecStart 引用。 EnvironmentFile=/etc/sysconfig/sshd # 服务启动时执行的命令: ExecStart=/usr/sbin/sshd -D $OPTIONS # /usr/sbin/sshd:sshd 守护进程的可执行文件路径。 # -D:表示 sshd 以非守护进程模式运行(前台运行),因为 systemd 通常管理前台进程,便于监控。 # $OPTIONS:引用 EnvironmentFile 中定义的额外参数(如 -p 2222 指定端口)。 # 服务重载配置时执行的命令: ExecReload=/bin/kill -HUP $MAINPID # kill -HUP 发送 SIGHUP 信号给 sshd 主进程,使其重新加载配置文件(无需重启服务)。 # $MAINPID 是 systemd 自动维护的服务主进程 ID。 # 定义服务停止时的杀死模式:process 表示只杀死服务的主进程(sshd 主进程),其子进程(如已建立的 SSH 连接)会被保留(避免强制中断现有连接)。 KillMode=process # 定义服务的重启策略:当服务因非正常退出(如崩溃、信号终止)时,systemd 会自动重启服务;正常退出(如主动停止)则不重启。 Restart=on-failure # 服务重启前的等待时间,这里设置为 42 秒,避免频繁重启导致资源耗尽。 RestartSec=42s # 标识该部分为 Install 配置,用于定义服务如何被 "启用"(即系统启动时自动运行)。 [Install] # 表示当系统启动到 multi-user.target(多用户命令行模式,非图形界面)时,该服务会被自动启动。这是服务器的默认运行级别,确保 SSH 服务在系统启动后可用。 WantedBy=multi-user.target

开发一个 study 服务

  1. 开发 studyd 服务主程序 study

脚本说明:这是一个无限循环的脚本,每 5 秒会向/var/log/study.log文件中追加一行包含当前时间的日志,内容为[时间]: I'M studying [ Linux ]

[root@centos7 ~15:11:59]# vim /usr/local/bin/study#!/bin/bash# 第一行内容是脚本的 "解释器声明"(shebang),指定该脚本使用 /bin/bash 作为解释器执行。系统会根据这一行找到对应的 shell 程序来解析后续命令。# 启动一个无限循环:while 是循环关键字,true 是一个永远为真的条件,因此这个循环会一直执行下去,直到被外部终止(如 Ctrl+C)。whiletrue# 循环体的开始标记,do 和后面的 done 之间的内容是循环中重复执行的命令。do# 执行 date 命令(获取当前系统时间),并通过 $(...) 捕获其输出,将结果赋值给变量 DATE。DATE=$(date)# echo 命令输出字符串,其中 $DATE 会被替换为变量的值# >> 是追加重定向符号,将输出内容追加到 /var/log/study.log 文件中# 最终输出内容类似 Fri Oct 31 10:00:00 CST 2025: I'M studying [ Linux ]。echo"$DATE: I'M studying [ Linux ]">>/var/log/study.log# 让脚本暂停执行 5 秒(sleep 命令用于延迟,单位默认为秒),避免循环执行过快。sleep5# 循环体的结束标记,与前面的 while 和 do 配合,标志着一次循环的结束。done[root@centos7 ~15:13:35]# chmod +x /usr/local/bin/study
  1. 创建 studyd 服务单元文件
# 参考 sshd.service[root@centos7 ~15:13:45]# cp /usr/lib/systemd/system/sshd.service \>/etc/systemd/system/studyd.service[root@centos7 ~15:13:58]# vim /etc/systemd/system/studyd.service[Unit]Description=study server daemon[Service]ExecStart=/usr/local/bin/study[Install]WantedBy=multi-user.target# 通知 systemd 读取 unit 变化[root@centos7 ~15:20:59]# systemctl daemon-reload# 启用并启动服务[root@centos7 ~15:21:13]# systemctl enable studyd --now# 查看服务状态[root@centos7 ~15:21:17]# systemctl status studyd● studyd.service - study server daemon Loaded: loaded(/etc/systemd/system/studyd.service;enabled;vendor preset: disabled)Active: active(running)since 三2026-07-2215:21:13 CST;8s ago Main PID:3389(study)CGroup: /system.slice/studyd.service ├─3389 /bin/bash /usr/local/bin/study └─3432sleep572215:21:13 centos7.xzh.cloud systemd[1]: Started study server daemon.
  1. 验证日志
[root@centos7 ~15:21:22]# tail -f /var/log/study.log2026年 07月22日 星期三15:21:14 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 15:21:19 CST: I'M studying[Linux]2026年 07月22日 星期三15:21:24 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 15:21:29 CST: I'M studying[Linux]2026年 07月22日 星期三15:21:34 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 15:21:39 CST: I'M studying[Linux]2026年 07月22日 星期三15:21:44 CST: I'M studying[Linux]......

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询