> 技术文档 > Linux性能监控与调优全攻略_如何分析Linux服务器瓶颈

Linux性能监控与调优全攻略_如何分析Linux服务器瓶颈


**一、一、性能检测(监控)

**1. CPU1. CPU 监控

命令

功能

关键参数/输出

场景

top / htop

实时进程

%CPU(进程占用率)、%MEM内存占用率)、Load Average(负载平均值)

快速定位高 CPU 进

mpstat -P ALL 1

每个核心的 CPU 使用率

%usr(用户态)、%sys(内核态)、%iowait(I/O 等待)

多核负载均衡分析

uptime

系统负载与运行时间

11:32:20 up  3:21,  2 users,  load average: 0.00, 0.01, 0.05

快速查看负载趋势

perf top

实时 CPU 热点函数分析

按函数名排序 CPU 占用率

深入代码级

说明:

1. top 

分类 具体指标 数值 / 说明 系统基本信息 当前时间 11:16:47 开机时长 up 3:05(已开机 3 小时 05 分钟) 登录用户数 2 users 系统平均负载 load average: 0.00, 0.01, 0.05(1 分钟、5 分钟、15 分钟平均负载) 任务(进程)统计 总进程数 226 total 运行中进程数 1 running 休眠进程数 222 sleeping 停止进程数 3 stopped 僵尸进程数 0 zombie CPU 使用率 用户态(us) 0.1%(应用程序占用 CPU 比例) 内核态(sy) 0.1%(系统内核功能占用 CPU 比例) 调整优先级的用户态(ni) 0.0% 空闲(id) 99.8%(空闲 CPU 比例,越高越空闲) 等待 I/O(wa) 0.0%(因等待磁盘、网络等 I/O 操作占用 CPU 耗时比例) 硬件中断(hi) 0.0%(处理硬件中断占用 CPU 耗时比例) 软件中断(si) 0.0%(处理软件中断占用 CPU 耗时比例) 被虚拟机 “偷走”(st) 0.0%(虚拟机场景下,被其他虚拟机占用的 CPU 时间比例) 内存信息 总物理内存(KiB Mem total) 4026372 KiB(约 4GB ) 空闲物理内存(free) 2535540 KiB 已用物理内存(used) 783396 KiB 缓存(buff/cache) 707436 KiB(可被释放给应用的临时缓存) 交换分区信息 总交换分区(KiB Swap total) 4194300 KiB(约 4GB ) 空闲交换分区(free) 4194300 KiB 已用交换分区(used) 0 KiB(未用到磁盘交换,性能较好) 实际可用内存(avail Mem) 2899668 KiB(含可回收缓存,体现实际可用内存) 进程详情 PID(进程 ID) 10463、12545、1、2 等 USER(所属用户) root(所列进程均属 root 用户 ) PR(进程优先级) 20(数值越小优先级越高,所列进程多为 20 ) NI(nice 值) 0(调整进程优先级,范围 -20 ~ 19 ) VIRT(虚拟内存总量) 如 566636 KiB(vmtoolsd 进程)、162012 KiB(top 进程 )等 RES(实际物理内存占用) 如 25912 KiB(vmtoolsd 进程)、2372 KiB(top 进程 )等 SHR(共享内存) 如 19120 KiB(vmtoolsd 进程)、1588 KiB(top 进程 )等 S(进程状态) S(休眠)、R(运行,如 top 进程状态为 R )等 % CPU(进程 CPU 使用率) 如 0.3%(vmtoolsd、top 进程 )、0.0%(systemd 等进程 ) % MEM(进程内存使用率) 如 0.6%(vmtoolsd 进程)、0.1%(top 进程 )、0.2%(systemd 进程 )等 TIME+(累计 CPU 耗时) 如 0:13.54(vmtoolsd 进程)、0:00.02(top 进程 )、0:01.55(systemd 进程 )等 COMMAND(进程名称 / 命令) vmtoolsd、top、systemd、kthreadd 等

2.mpstat -P ALL 1

列名 全称 / 含义 示例值(以 all 行为例) 补充说明 11:27:17 AM
11:27:18 AM 采样时间 采样时间戳 第一行是 “表头时间”,后续是实际采样时间 CPU CPU 标识:
all = 所有 CPU 总览
0/1 = 单个 CPU 核心编号 all01 你的输出里还有 23 核心(截图未完整显示) %usr 用户态 CPU 使用率(应用程序、脚本等用户空间程序占用 CPU 比例) 0.00 数值越高,用户程序越繁忙 %nice 调整过优先级(nice 值)的用户态 CPU 使用率 0.00 通常为 0(少用优先级调整时) %sys 内核态 CPU 使用率(系统内核功能、驱动等占用 CPU 比例) 0.25all 行) 数值高可能因内核任务多(如 I/O 调度) %iowait CPU 等待 I/O 耗时比例(因磁盘、网络等 I/O 阻塞,CPU 空闲等待的时间) 0.00 高值可能表示存储 / 网络性能瓶颈 %irq 硬件中断(如键盘、磁盘控制器触发)占用 CPU 比例 0.00 通常较低,驱动异常时可能升高 %soft 软件中断(内核内部触发的中断)占用 CPU 比例 0.00 同上,异常时需关注 %steal 虚拟机场景下,被宿主机 “偷走” 的 CPU 时间(仅虚拟机内可见) 0.00 物理机无此损耗,虚拟机需关注 %guest 运行虚拟机客户机(如 KVM 虚机)占用的 CPU 比例 0.00 无虚拟机时通常为 0 %gnice 调整过优先级的虚拟机客户机 CPU 使用率 0.00 同上,少用场景为 0 %idle CPU 空闲比例(完全无任务时的空闲时间) 99.75all 行)
2. 内存监控

命令

功能

关键参数/输出

场景

free -h

内存使用情况(人类可读)

available(可用内存)、buff/cache(缓存)、used(已用)

**关键指标:关键指标:available < 10% 需警惕

vmstat 1 5

内存、进程、I/O 综合统计

si/so(Swap 交换量)、bi/bo(磁盘r(运行队列长度

内存不足或 I/O 瓶颈

sar -r 1 5

内存使用率历史数据

kbmemfree(空闲内存)、kbmemused(已用内存)、%memused(使用率)

 1.  free -h

分类 字段 含义 & 示例值 补充说明 内存 total 总物理内存:3.8G 系统总内存约 3.8GB used 已用内存:765M 实际被程序占用的内存 free 空闲内存:2.4G 完全未被使用的 “纯空闲” 内存 buff/cache 缓存内存:690M 用于磁盘缓存(可释放给程序) available 可用内存:2.8G 程序实际可申请的内存(含可回收缓存) 交换分区 total 总交换空间:4.0G 硬盘模拟的 “虚拟内存” 总大小 used 已用交换:0B 未用到交换分区(性能好) free 空闲交换:4.0G 交换分区剩余空间

总结:系统物理内存充足(总 3.8G,已用仅 765M,可用 2.8G ),且未用到交换分区(Swap 用 0B ),内存状态非常健康,无内存压力~

2. vmstat 1 5

3. sar -r 1 5

3. 磁盘 I/O 监控

命令

功能

关键参数/输出

场景

iostat -dx 1 5

磁盘 I/O 性能(扩展模式)

%util(设备繁忙度)、await(I/O 延迟)、r/s(读请求数)、w/s(写请求数)

瓶颈判断:%util > 80% 或 await > 20ms

df -h

磁盘分区空间使用率

Use%(使用率)、Mounted on(挂载点)

磁盘空间告

1.  iostat -dx 1 5

分类 字段 / 列名 含义 & 示例值 补充说明 磁盘设备 Device 磁盘设备名:scd0sda sda 通常是主硬盘,scd0 可能是光驱 I/O 指标 tps 每秒 I/O 操作数:
scd0: 0.00
sda: 0.44 数值越高,磁盘越繁忙 kB_read/s 每秒读数据量(kB):
scd0: 0.02
sda: 15.91 读吞吐量,反映读性能 kB_wrtn/s 每秒写数据量(kB):
scd0: 0.00
sda: 1.25 写吞吐量,反映写性能 累计统计 kB_read 累计读总量(kB):
scd0: 1050
sda: 676095 系统启动以来的读总数据量 kB_wrtn 累计写总量(kB):
scd0: 0
sda: 53193 系统启动以来的写总数据量

关键结论

  • sda(主硬盘):有一定读写活动(tps=0.44kB_read/s=15.91kB_wrtn/s=1.25 ),但整体负载低,属于正常使用状态。
  • scd0(可能是光驱):读写极少(tps=0.00kB_wrtn/s=0.00 ),符合光驱低使用场景。
    系统磁盘 I/O 压力小,无明显性能瓶颈。
4. 网络监控

命令

功能

关键参数/输出

场景

sar -n DEV 1 5

网络接口流量统计

rxkB/s(接收速率)、txkB/s(发送速率)、rxerr/s(接收错误)

带宽瓶颈或丢包问题

ss -tuln

监听端口与连接状态

LISTEN(监听端口)、ESTAB(已建立连接)

检查服务端口是否正常

netstat -s

网络协议统计(TCP/UDP/ICMP)

segments retransmitted(TCP 重传)、packet receive errors(接收错误)

网络层问题分析

 1. sar -n DEV 1 5

2.ss -tuln

3. netstat -s

5. 综合监控工具

工具

功能

特点

dstat

CPU/内存/磁盘/网络一体化监控

dstat -tcmndpy(时间+CPU+内存+磁盘+网络+系统调用)

glances

跨平台系统监控(Web/终端)

支持插件扩展,可监控 Docker、传感器等

nmon

实时性能监控 + 数据导出

生成 CSV 报告用于长期分析


二、性能调优(优化)

1. CPU 调优

场景

调优策略

命令/配置

进程 CPU 绑定

减少跨 CPU 核心切换开销

taskset -cp 0,1 (绑定进程到核心 0,1)

中断亲和性

分散网卡中断到不同 CPU 核心

echo 1 > /proc/irq//smp_affinity(绑定到 CPU 0)

CPU 频率调节

固定高性能模式(省电场景用 ondemand

cpupower frequency-set -g performance

减少上下文切换

降低线程数或使用异步 I/O

优化应用代码(如使用 Nginx 的 worker_processes auto

2. 内存调优

场景

调优策略

命令/配置

减少 Swap 使用

避免内存频繁交换到磁盘(需确保物理内存充足)

sysctl vm.swappiness=10(默认 60,0 表示禁用 Swap)

调整脏页回写

减少磁盘写频率,提升写性能

sysctl vm.dirty_ratio=15(脏页占比达 15% 时阻塞写)

启用大页内存

减少 TLB Miss(适用于数据库、虚拟化)

echo 2048 > /proc/sys/vm/nr_hugepages(分配 2048 个 2MB 大页)

OOM Killer 保护

防止关键进程被杀

echo -1000 > /proc//oom_score_adj(值越低越不易被杀)

3. 磁盘 I/O 调优

场景

调优策略

命令/配置

更换 I/O 调度器

SSD 用 none/mq-deadline,HDD 用 mq-deadline

echo mq-deadline > /sys/block/sda/queue/scheduler

调整队列深度

提高并发 I/O 能力(SSD 可设 256-1024)

echo 512 > /sys/block/sda/queue/nr_requests

启用读写预取

提升顺序读写性能

echo 1024 > /sys/block/sda/queue/read_ahead_kb(单位 KB)

文件系统挂载优化

禁用访问时间更新、启用写回模式

mount -o noatime,nodiratime,data=writeback /dev/sda1 /mnt

4. 网络调优

场景

调优策略

命令/配置

调整 TCP 缓冲区

高带宽或高延迟网络需增大缓冲区

sysctl net.ipv4.tcp_rmem=\"4096 87380 16777216\"(最小/默认/最大接收缓冲区)

启用 BBR 拥塞算法

提升高丢包网络吞吐量(需内核 ≥4.9)

sysctl net.ipv4.tcp_congestion_control=bbr

连接复用

减少 TIME_WAIT 连接

sysctl net.ipv4.tcp_tw_reuse=1

增大连接跟踪表

高并发服务器(如 NAT 网关)

sysctl net.netfilter.nf_conntrack_max=1000000


三、调优实战案例

场景:Web 服务器响应缓慢

 1.监控诊断

top  # 发现 CPU 占用 90%,负载 15(8核机)vmstat 1 # 显示 r(运行队列)>10,so(Swap Out)>0free -h # available 内存仅 500MB(总 16GB)

结论:CPU 瓶颈 + 内存不足导致 Swap。

 2.调优措施

2.1 应用层

# 优化 Nginx 配置(减少 worker 数)worker_processes auto;worker_connections 512; # 原值 1024
# 优化慢 SQL(如添加索引)EXPLAIN SELECT * FROM users WHERE name=\'Alice\';

 2.2 内核层 

sysctl vm.swappiness=10 # 减少 Swapsysctl net.ipv4.tcp_tw_reuse=1 # 复用 TIME_WAIT 连接

 硬件:增加内存至 32GB。

3.验证效果

ab -n 10000 -c 100 http://localhost/ # 压力测试# 结果:TPS 从 200 提升至 800,响应时间从 500ms 降至 120ms
  1. 安全第一:生产环境调优前 务必备份
  2. 单一变量:每次只修改一个参数,避免无法定位问题根源。 3
  3. 监控先行:调优后持续sar -u 1 3600 记录 1 小时 CPU)。 4
  4. 工具选择
    • 快速诊断:`top/vmstat/iostat
    • 深度分析:perf/eBPFbcc-tools
    • 长期Prometheus + Grafana

五、命令速查表

目标

命令

输出关键字

CPU 瓶颈

mpstat -P ALL 1

%usr > 80% 或 %iowait > 20

内存不足

free -h

available < 10% 总内存

磁盘瓶颈

iostat -dx 1

%util > 80% 或 `awaitawait > 20ms

网络丢包

sar -n DEV 1

rxerr/s > 0 或 rxdrop/s > 0

高负载进程

ps aux --sort=-%cpu | head -10

第一列高 CPU 进

Swap 使用

vmstat 1

siso

六,Linux内核版本优化 

linux内核优化
升级内核
rpm -ivh kernel-3.10...rpm  
查看内核模块
/lib/modules
uname -r  查看内核版本
3.10.0-957.el7.x86_64
内核版本号由3部分组成
3.10.0-957
主版本号
次版本号:次版本号决定该内核是稳定版本还是开发版本  偶数稳定版本  奇数 开发版本
末版本号(修订版本号)
查询模块
lsmod |grep xfs
modinfo  xfs
加载模块
modprobe  ext4
卸载模块
modprobe  -r  ext4
开启IP转发
vim  /etc/sysctl.conf
net.ipv4.ip_forward  =  1
sysctl -p /etc/sysctl.conf
开启禁ping
vim  /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all  =  1
sysctl -p /etc/sysctl.conf