Linux系统负载监控与服务管理实战笔记
blog_content = ‘’'# Linux系统负载监控与服务管理实战笔记
本文基于CentOS 7系统,梳理了系统负载监控、stress压力测试、systemd服务管理以及OpenSSH服务配置的实战知识点,适合运维初学者和准备RHCE认证的同学。
一、系统负载基础概念
1.1 什么是系统负载
系统负载平均值:Linux内核以活动请求数的指数移动平均值来表示。
- 活动请求数:不仅包含运行中进程®,还包含等待IO的进程(D)。等待IO包括处于睡眠等待预期磁盘和网络响应的任务。
- 指数移动平均值:是一个数学公式,可以平滑趋势数据的高值和低值,更加准确地表示一段时间内系统负载,并确定系统负载是随着时间增加还是减少。
- 计算频率:根据所有CPU活动请求数,每5秒计算一次Load Average。通过汇总这些值,可以得到最近1分钟,5分钟和15分钟内的指数移动平均值。
1.2 Linux负载的特殊性
- 一些UNIX系统仅考虑CPU使用率或运行队列长度。Linux中负载平均值中还包含了对IO的考量,遇到负载平均值很高但CPU活动很低时,检查磁盘和网络活动。
- Linux将各个物理CPU核心和微处理器超线程计为独立执行单元。每个独立的执行单元拥有独立的请求队列。
二、查看系统负载
2.1 uptime命令
[laoma@centos7 ~]$uptime13:47:10 up5:01,2users, load average:0.00,0.01,0.05输出解读:
13:47:10:当前系统时间up 5:01:系统已运行5小时1分钟2 users:当前2个用户登录load average: 0.00, 0.01, 0.05:1分钟、5分钟、15分钟的平均负载
2.2 lscpu查看CPU信息
[laoma@centos7 ~]$ lscpu Architecture: x86_64 CPU(s):2# cpu数量为2On-line CPU(s)list:0,1Thread(s)per core:1Core(s)per socket:1socket:22.3 负载解读实例
假设服务器为4核CPU,负载为2.92, 4.48, 5.20:
| 时间 | 总负载 | 每核负载 | 状态 |
|---|---|---|---|
| 1分钟 | 2.92 | 2.92/4 = 0.73 | 正常 |
| 5分钟 | 4.48 | 4.48/4 = 1.12 | 轻微过载 |
| 15分钟 | 5.20 | 5.20/4 = 1.30 | 过载 |
判断标准:每核负载理想值为0.75左右,超过1.0表示过载。
2.4 模拟高负载
# 给系统加负载[laoma@centos7 ~]$ md5sum /dev/zero&[1]4912[laoma@centos7 ~]$ md5sum /dev/zero&[2]4913# 等30秒左右查看[laoma@centos7 ~]$uptime13:48:57 up5:03,2users, load average:1.02,0.28,0.13三、top命令动态监控
3.1 启动top
toptop命令可以动态查看进程信息,包括不同状态任务数量、CPU消耗和内存消耗。
3.2 常用快捷键
| 快捷键 | 功能 |
|---|---|
1 | 展开多核显示,查看每个CPU核心的使用率 |
P | 按CPU使用率排序(大写P,%CPU从高到低) |
M | 按内存使用率排序(大写M,%MEM从高到低) |
k | 杀死指定进程,输入后提示输入PID和信号(默认15,可输9强制) |
q | 退出top监控 |
h | 显示帮助信息 |
—
四、stress压力测试工具
4.1 安装stress
[root@centos7 ~]# yum install -y stress### 4.2 stress参数说明
-c, --cpu N spawn N workers spinning on sqrt() # CPU压力 -i, --io N spawn N workers spinning on sync() # IO压力 -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) -t, --timeout N timeout after N seconds # 超时时间组合测试:CPU + 内存 + 磁盘(结合top命令查看)
stress --cpu 2 --io 1 --vm 1 --vm-bytes 128M --timeout 10s
4.3 CPU压力测试
# 消耗2个CPU[root@centos7 ~]# stress -c 2stress: info:[2595]dispatching hogs:2cpu,0io,0vm,0hdd# top监控效果top-14:18:22 up47min,2users, load average:1.37,0.50,0.47Tasks:187total,4running,183sleeping,0stopped,0zombie %Cpu(s):100.0 us,0.0sy,0.0ni,0.0id,0.0wa,0.0hi,0.0si,0.0st PIDUSERPR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND2596root20073121000R100.00.01:01.42 stress2597root20073121000R100.00.01:01.25 stress4.4 内存压力测试
# 消耗前内存[root@centos7 ~]# free -mtotal usedfreeshared buff/cache available Mem:393147815001419523201Swap:396703967# 消耗1G内存[root@centos7 ~]# stress -m 1 --vm-bytes 1Gstress: info:[2623]dispatching hogs:0cpu,0io,1vm,0hdd# 消耗后内存[root@centos7 ~]# free -mtotal usedfreeshared buff/cache available Mem:393114035751419522274Swap:3967039674.5 磁盘压力测试
# 消耗磁盘IO[root@centos7 ~]# stress -d 1 --hdd-bytes 2G# 安装sysstat和iotop[root@centos7 ~]# yum install -y sysstat iotop# 监控磁盘读写速度,重点关注rd_sec/s和wr_sec/s,单位是0.5k/每秒[root@centos7 ~]# sar -dp 114时23分29秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util14时23分30秒 sda2699.000.002762752.001023.626.112.260.2979.5014时23分30秒 centos-root2698.000.002761728.001023.626.112.260.2979.504.6 iotop进程级磁盘监控
[root@centos7 ~]# iotopTotal DISK READ:0.00B/s|Total DISK WRITE:51.90M/s Actual DISK READ:0.00B/s|Actual DISK WRITE:62.16M/s TID PRIOUSERDISK READ DISK WRITE>SWAPIN IO COMMAND4573be/4 laoma0.00B/s51.90M/s0.00%96.45% stress-d1--hdd-bytes 2G提示:左右方向键调整排序列,
>代表当前排序列
4.7 网络测试
# 传送一个大size的文件[root@centos7 ~]# wget http://192.168.50.200/course-materials/iso/CentOS-7-x86_64-DVD-2207-02.iso# 监控带宽[root@centos7 ~]# sar -n DEV 114时29分07秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s14时29分08秒 ens3269961.005404.0096338.71513.950.000.000.00五、Linux服务管理(systemd)
5.1 systemd简介
CentOS 7使用Systemd引导系统启动,速度最快,所有进程无论有无依赖关系则都是并行启动。
- 服务:从业务角度来称呼,例如web服务,数据库服务
- 守护进程(daemon):web服务器对外提供web服务,由web相关的进程提供支持
以web服务为例:
- 服务:web服务
- 守护进程:httpd
5.2 systemd架构
- 守护进程:systemd,由守护进程干活
- 工具:systemctl,提供给用户用来跟机器交互的工具
5.3 unit类型
systemctl命令用于管理不同类型的系统对象,这些对象称之为units:
| 类型 | 扩展名 | 用途 |
|---|---|---|
| Service unit | .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 | 用于资源管理 |
5.4 查看unit列表
# 列出状态为loaded的units[root@centos7 ~]# systemctl list-units# 查看特定类型unit清单[laoma@centos7 ~]$ systemctl list-units-ttimer# 列出类型为service,状态为active和inactive的unit[root@centos7 ~]# systemctl list-units --type service --all# 列出系统中所有unit,包括未loaded的unit[root@centos7 ~]# systemctl list-unit-files# 查看失败的服务[root@centos7 ~]# systemctl --failed --type service5.5 查看单个unit信息
[laoma@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:1CGroup: /system.slice/sshd.service └─1167 /usr/sbin/sshd-D
状态关键字说明:
| 关键字 | 概述 |
|---|---|
| loaded | 单元配置文件已处理 |
| active(running) | 正在运行 |
| active(exited) | 已成功完成一次性配置 |
| active(waiting) | 运行中,正在等待事件 |
| inactive | 不再运行 |
| enabled | 系统引导时启动 |
| disabled | 系统引导时不启动 |
| static | 无法启动,依赖其他单元启动 |
5.6 控制系统服务
| 命令 | 任务 |
|---|---|
systemctl status UNIT | 查看单元状态的详细信息 |
systemctl stop UNIT | 在运行中的系统上停止一项服务 |
systemctl start UNIT | 在运行中的系统上启动一项服务 |
systemctl restart UNIT | 在运行中的系统上重新启动一项服务 |
systemctl reload UNIT | 重新加载运行中服务的配置文件 |
systemctl mask UNIT | 禁用服务,使其无法手动启动或在系统引导时启动 |
systemctl unmask UNIT | 使屏蔽的服务变为可用 |
systemctl enable UNIT | 将服务配置为在系统引导时启动(加–now也会启动该服务) |
systemctl disable UNIT | 禁止服务在系统引导时启动(加–now也会停止该服务) |
# 停止服务[root@centos7 ~]# systemctl stop sshd.service# 启动服务[root@centos7 ~]# systemctl start sshd.service# 重启服务,相当于stop再start[root@centos7 ~]# systemctl restart sshd.service# 重新加载服务,主进程不会重启,只会重新加载配置文件[root@centos7 ~]# systemctl reload sshd.service# 禁止服务开机自启[root@centos7 ~]# systemctl disable sshd.service[root@centos7 ~]# systemctl is-enabled sshddisabled# 设置服务开机自启[root@centos7 ~]# systemctl enable sshd.service[root@centos7 ~]# systemctl is-enabled sshdenabled# 禁用服务:服务被禁用后,将无法start,因为服务的配置文件指向/dev/null[root@centos7 ~]# systemctl mask sshd.service# 取消禁用[root@centos7 ~]# systemctl unmask sshd.service六、unit配置文件详解
6.1 配置文件位置
/etc/systemd/system/unit.service:优先生效,一般是管理员自定义的配置/usr/lib/systemd/system/unit.service:其次生效,软件包自带的默认配置
6.2 sshd.service配置文件解析
# 标识该部分为 Unit 配置,用于描述服务的基本信息、依赖关系等。 [Unit] # 服务的描述信息 Description=OpenSSH server daemon # 指定服务的文档路径 Documentation=man:sshd(8) man:sshd_config(5) # 定义服务的启动顺序 After=network.target sshd-keygen.service # 表示sshd服务"希望"sshd-keygen.service运行(但不是强制依赖) Wants=sshd-keygen.service # 标识该部分为 Service 配置 [Service] # 定义服务的类型为notify Type=notify # 指定环境变量文件的路径 EnvironmentFile=/etc/sysconfig/sshd # 服务启动时执行的命令 ExecStart=/usr/sbin/sshd -D $OPTIONS # 服务重载配置时执行的命令 ExecReload=/bin/kill -HUP $MAINPID # 定义服务停止时的杀死模式 KillMode=process # 定义服务的重启策略 Restart=on-failure # 服务重启前的等待时间 RestartSec=42s # 标识该部分为 Install 配置 [Install] # 表示当系统启动到multi-user.target时,该服务会被自动启动 WantedBy=multi-user.target6.3 开发自定义服务示例
步骤1:编写服务主程序
[root@centos7 ~]# vim /usr/local/bin/study#!/bin/bash# 第一行是shebang,指定使用/bin/bash作为解释器# 启动一个无限循环whiletruedo# 获取当前系统时间DATE=$(date)# 将日志追加到/var/log/study.logecho"$DATE: I'M studying [ Linux ]">>/var/log/study.log# 暂停5秒sleep5# 循环结束done[root@centos7 ~]# chmod +x /usr/local/bin/study步骤2:创建服务单元文件
# 参考sshd.service[root@centos7 ~]# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/studyd.service[root@centos7 ~]# vim /etc/systemd/system/studyd.service[Unit] Description=study server daemon [Service] ExecStart=/usr/local/bin/study [Install] WantedBy=multi-user.target步骤3:加载并启动服务
# 通知systemd读取unit变化[root@centos7 ~]# systemctl daemon-reload# 启用并启动服务[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:2CGroup: /system.slice/studyd.service ├─2786 /bin/bash /usr/local/bin/study └─2788sleep5步骤4:验证日志
[root@centos7 ~]# tail -f /var/log/study.log2025年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]......七、OpenSSH服务管理
7.1 环境准备
准备两台虚拟机:
- server虚拟机,IP地址为10.1.8.10/24
- client虚拟机,IP地址为10.1.8.11/24
设置主机名称和名称解析(以client为例):
# 永久设置主机名[root@localhost ~]# hostnamectl set-hostname client.laoma.cloud# 临时设置[root@localhost ~]# hostname client.laoma.cloud# 验证[root@client ~]# bash# 准备名称解析[root@client ~]# echo "10.1.8.10 server.laoma.cloud server10.1.8.11 client.laoma.cloud client">>/etc/hosts7.2 SSH介绍
SSH全称是Secure Shell,SSH协议是基于应用层的协议,为远程登录会话和其他网络服务提供安全性的协议。
实现此功能的传统方式(telnet、rcp、ftp、rlogin、rsh)都是极为不安全的,会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据。
7.3 SSH建立连接的过程
主要分为下面几个阶段:
- SSH协议版本协商阶段:SSH目前包括SSH1和SSH2两个大版本
- 密钥和算法协商阶段:SSH支持多种加密算法,双方根据支持的算法进行协商
- 认证阶段:服务器和客户端互相进行身份验证
- 会话请求阶段:客户端向服务器端发送会话请求(申请伪终端、端口转发等)
- 交互会话阶段:服务器端和客户端进行信息的交互
7.4 加密类型
- 对称加密:加密和解密都使用一个钥匙。确保数据的完整性、速度快。
- 非对称加密:一对钥匙。公钥用来加密数据,私钥用来解密数据。确保数据的安全性。
7.5 双向加密过程
SSH协议是基于非对称加密方法的,服务器和客户端都会生成自己的公钥和私钥:
服务器创建密钥对:远程服务器在
/etc/ssh目录下生成密钥对,如ssh_host_ecdsa_key.pub(公钥)和ssh_host_ecdsa_key(私钥)。每回启动sshd服务时,系统会自动在此路径下查找公钥。客户端记录服务器公钥并计算自己的公私钥:客户端将服务器传来的公钥记录在
~/.ssh/known_hosts中,然后计算客户端自己的公私钥。客户端使用服务器的公钥加密自己的公钥并发送给服务器:服务器端拥有客户端公钥+自己私钥,客户端拥有服务器公钥+自己私钥,组成了非对称加密系统。
双向加解密:
- 服务器发送数据:用客户端公钥加密,客户端收到后用自己私钥解密
- 客户端发送数据:用服务器公钥加密,服务器收到后用自己私钥解密
7.6 ssh工具使用
方式一:只指定IP或主机名
# 通过IP地址[laoma@client ~]$ssh10.1.8.10 The authenticity ofhost'10.1.8.10 (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:... Are you sure you want to continue connecting (yes/no/[fingerprint])? yes laoma@10.1.8.10's password: redhat# 通过主机名称[laoma@client ~]$sshserver方式二:额外指定用户名
# 指定root用户登录[laoma@client ~]$sshroot@server# 或者[laoma@client ~]$ssh-lroot server方式三:额外指定命令
# 同时指定用户和命令[laoma@client ~]$sshlaoma@serverhostnamelaoma@server's password: redhat server.laoma.cloud [laoma@client ~]$ ssh root@server 'hostname;id' server.laoma.clouduid=0(root)gid=0(root)组=0(root)7.7 ssh工具配置文件
~/.ssh/config:用户自己的配置,优先级高于全局配置。文件权限不得高于644。/etc/ssh/ssh_config:全局配置,应用于所有用户。
[laoma@client ~]$mkdir.ssh[laoma@client ~]$chmod700.ssh[laoma@client ~]$vim~/.ssh/configHost * StrictHostKeyChecking no User root PreferredAuthentications Pubkey[laoma@client ~]$chmod600.ssh/config参数说明:
- **Host ***:匹配所有目标服务器
- StrictHostKeyChecking no:连接目标服务器不校验主机key,直接接受
- User root:连接目标服务器默认使用root账户
- PreferredAuthentications password:连接目标服务器使用密码认证
- IdentityFile:指定私钥位置
权限要求:
[laoma@client ~]$sshserver Bad owner or permissions on /home/laoma/.ssh/config[laoma@client ~]$chmod600.ssh/config7.8 配置密钥认证
客户端生成密钥对:
[laoma@client ~]$ ssh-keygen Generating public/private rsa key pair.# 私钥保存位置Enterfileinwhichto save the key(/home/laoma/.ssh/id_rsa): 回车# 私钥加密密码,回车表示不加密Enter passphrase(emptyforno passphrase): 回车 Enter same passphrase again: 回车 Your identification has been savedin/home/laoma/.ssh/id_rsa. Your public key has been savedin/home/laoma/.ssh/id_rsa.pub.推送公钥到服务器:
[laoma@client ~]$ ssh-copy-id laoma@server验证免密登录:
[laoma@client ~]$sshlaoma@serverhostnameserver.laoma.cloud
(切记记得把公钥推给root用户才可以免密返回)
推送公钥的本质:将公钥内容保存到目标服务器目标用户家目录下.ssh/authorized_keys中。
以非交互方式生成密钥对:
[laoma@client ~]$ ssh-keygen-trsa-N''-fid_rsa_new其他选项:
# -i 指定私钥位置[laoma@client ~]$ssh-i/tmp/id_rsa root@serverhostname# -p 选项指定目标服务器sshd服务端口号,默认22[laoma@client ~]$ssh-lroot-p1022serverhostname7.9 密钥认证排故
故障现象:配置密钥登录后,远程登录仍需要输入密码。
模拟故障:将目标主机上目标用户的家目录权限改为777。
[root@server ~]# chmod 777 /root处理过程:
- 查看日志:
[root@server ~]# tail -f /var/log/secureJul3116:13:41 server sshd[3693]: Authentication refused: bad ownership or modesfordirectory /root- 修复权限:
[root@server ~]# ls -ld /rootdrwxrwxrwx.3root root4096Jul3116:09 /root# 更改权限[root@server ~]# chmod 700 /root7.10 加固SSH服务
编辑/etc/ssh/sshd_config:
1. 禁止root密码登录
[root@server ~]# vim /etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin prohibit-password[root@server ~]# systemctl reload sshd测试:即使使用正确的密码,也无法远程登录。如果配置了秘钥登录,则需要使用选项强制密码认证:
[laoma@client ~]$ssh-oPreferredAuthentications=password root@server2. 禁止root登录
[root@server ~]# vim /etc/ssh/sshd_configPermitRootLogin no[root@server ~]# systemctl reload sshd测试:不管是密码还是秘钥都无法登录root。但可以使用普通用户登录,然后提权为root:
[laoma@client ~]$sshlaoma@server[laoma@server ~]$su-[root@server ~]#3. 禁止密码登录
[root@server ~]# vim /etc/ssh/sshd_config#PasswordAuthentication yesPasswordAuthentication no[root@server ~]# systemctl reload sshd测试:
# laoma账户未配置密钥登录,直接拒绝[laoma@client ~]$ssh-oPreferredAuthentications=password laoma@server Permission denied(publickey,gssapi-keyex,gssapi-with-mic).# 秘钥登录,仍然支持[laoma@client ~]$sshlaoma@server4. 只允许特定用户登录
# 准备laowang用户[root@server ~]# useradd laowang[root@server ~]# echo 123 | passwd --stdin laowang[root@server ~]# mkdir -m 700 /home/laowang/.ssh/[root@server ~]# cp .ssh/authorized_keys /home/laowang/.ssh/[root@server ~]# chown -R laowang:laowang /home/laowang/.ssh/# 配置sshd[root@server ~]# vim /etc/ssh/sshd_configAllowUsers lhy[root@server ~]# systemctl reload sshd测试:
# laowang cannot log in[laoma@client ~]$sshlaowang@serverhostnamePermission denied(publickey,gssapi-keyex,gssapi-with-mic).# laoma can log in[laoma@client ~]$sshlaoma@serverhostnameserver.laoma.cloud八、监控总结
以下是针对Linux系统监控的几条实用建议:
核心指标实时监控:重点跟踪CPU使用率(用户态/系统态占比)、内存占用(含缓存/swap使用率)、磁盘I/O(读写吞吐量、IOPS)和网络流量(带宽利用率、连接数)。可通过top/htop(实时)、vmstat/iostat(系统级)等工具快速查看。
部署专业监控工具:对于服务器集群或长期监控需求,建议使用Prometheus + Grafana(可视化强)、Zabbix(全功能监控)或Nagios(轻量告警)等工具。
设置关键阈值告警:针对核心指标配置告警阈值(如CPU持续5分钟超80%、磁盘空间不足10%),通过邮件、短信或即时通讯工具推送告警。
监控进程与服务状态:定期检查关键服务(如Nginx、MySQL)的运行状态、进程数及资源消耗,可通过
systemctl status或自定义脚本实现。日志集中管理与分析:将系统日志(
/var/log/messages)、应用日志集中存储(如使用ELK栈),关注错误信息(ERROR级别)、登录异常(/var/log/secure)和磁盘错误(dmesg | grep error)。磁盘健康监控:除空间使用率外,需关注磁盘坏块(
smartctl工具检测S.M.A.R.T信息)和文件系统完整性(定期运行fsck)。网络与安全监控:监控端口开放状态(
netstat/ss)、异常连接(尤其是外部IP的高频访问)和防火墙规则生效情况。可结合tcpdump抓包分析可疑流量。定期性能基线分析:记录系统正常运行时的指标基线(如平均负载、内存使用峰值),当指标偏离基线时及时排查。
自动化监控脚本:对个性化需求(如特定目录文件数、应用响应时间),编写Shell或Python脚本定期执行检查。
监控权限与安全:限制监控工具的权限(如仅授予读取日志和指标的权限),加密传输监控数据,防止监控系统本身成为安全薄弱点。
课后练习
- 使用stress工具对系统进行CPU、内存、磁盘压力测试,并使用top、sar、iotop进行监控。
- 编写一个自定义systemd服务,实现定时记录日志功能。
- 配置SSH密钥认证,实现免密登录。
- 加固SSH服务:禁止root登录、禁止密码登录、只允许特定用户登录。
本文是课堂笔记整理,如有错误欢迎指正交流!
持续更新中,觉得有用的话记得点赞收藏~