目录

前言

一、系统调优概述与CPU负载监控

1.1系统调优

1.1.1什么是系统性能调优

1.1.2系统调优的步骤

1.1.3各子系统之间的依赖关系

1.2查看CPU负载的相关工具

1.2.1 uptime命令        

1.2.2找出使用CPU最多的进程

1.2.2.1 top命令

1.2.2.2 ps命令

1.2.3 mpstat查看CPU运行情况

二、内存运行状态监控

2.1查看内存运行状态

2.1.1 free命令

2.1.2查看内存详细信息

2.2找出使用内存最多的进程

2.2.1 top命令

2.2.2 ps命令

三、磁盘IO运行状态监控

3.1查看磁盘IO状态

3.2使用iotop命令找出磁盘IO最多的进程

四、网络运行状态监控

4.1找出使用网络最多的进程

4.2压力测试

五、系统整体运行状态监控

5.1使用vmstat查看系统整体状态

5.2判断系统瓶颈

5.2.1刚开机一切正常的系统

5.2.2在/opt下生成一个文件

5.2.3 web服务器压力测试

5.3使用sar记录系统运行状态

六、CPU资源调优

6.1调整进程优先级

6.2CPU亲和力

七、磁盘IO调优

7.1 ulimit资源限制

7.2测试硬盘速度

总结


前言

以“理论+实践”的方式,系统讲解Linux系统性能调优与监控的核心技术。从CPU、内存、磁盘IO到网络,逐层剖析各子系统的监控工具(如uptime、top、vmstat、iostat、sar等)与调优方法(包括进程优先级、CPU亲和力、ulimit限制等),并结合生活化类比与大量动手实验,帮助您快速建立排查瓶颈、优化系统平衡的实战能力,为云计算运维工作打下坚实基础。

一、系统调优概述与CPU负载监控

1.1系统调优

1.1.1什么是系统性能调优

性能优化就是找到系统处理中的瓶颈以及去除这些瓶颈的过程,性能优化其实是对操作系统
各子系统达到一种平衡状态的定义。一个高效的系统需要在 CPU 、内存、磁盘 IO 、网络等
各个方面达到良好的平衡状态,任何一个子系统成为瓶颈都会影响整体性能。

1.1.2系统调优的步骤

系统调优通常遵循以下三个步骤:
第一步:观察系统运行状况
按照优先级依次检查: CPU 状态 内存使用 磁盘 IO 网络流量 应用程序性能。这是
因为 CPU 是最核心的处理单元,任何操作都需要 CPU 参与;内存不足会导致系统频繁使用
swap ,影响所有性能;磁盘 IO 是最慢的操作;网络则是与外部通信的通道。
第二步:分析是否存在瓶颈
根据当前应用的实际需求,判断各个子系统是否存在性能问题。例如,一个文件服务器主要
关注磁盘 IO 性能,一个 Web 服务器主要关注 CPU 和网络性能,一个数据库服务器则需要同时
关注内存、 CPU 和磁盘 IO
第三步:采取调优措施
针对发现的瓶颈采取相应措施,使其变得优异。这可能包括调整内核参数、优化应用程序配
置、升级硬件等方式。

1.1.3各子系统之间的依赖关系

Linux 系统的各个子系统之间是相互依赖、相互影响的,理解这种关系对于准确定位问题至
关重要:
CPU 与内存的关系 :大量的网页调入请求会导致内存队列的拥塞,当内存不足时,系统会
花费大量 CPU 时间在内存管理上,反而降低了处理业务的能力。 CPU 与网络的关系 :网卡的大吞吐量可能导致更多的 CPU 开销,因为每个网络包都需要
CPU 处理。如果网络中断处理占用过多 CPU ,会严重影响其他业务的执行。
内存与磁盘的关系 :大量来自内存的磁盘写请求可能导致更多的 CPU 以及 IO 问题。内存中
的数据最终需要写入磁盘,如果磁盘 IO 缓慢,会导致内存中待写入的数据堆积。
内存与 CPU 的关系 :当内存不足时,内核需要频繁进行内存页的换入换出操作(swapping ),这会消耗大量 CPU 资源,同时产生大量磁盘 IO ,形成恶性循环。

1.2查看CPU负载的相关工具

1.2.1 uptime命令        

uptime 命令是最简单也是最常用的系统负载查看工具,它能够告诉我们系统运行了多久、
有多少用户登录、以及系统负载情况。

图1.1

输出内容解析
第一项18:42:15 是当前时间;
第二项 up 1min 表示系统连续运行了1分钟
第三项2  users 表示当前有2 个用户登录
第四项 load average: 0.21, 0.14, 0.05 是系统负载平均值,三个数值分别表示 1 分钟、 5 分钟、
15 分钟前到现在的平均值。
判断 CPU 负载是否过高的示例
服务器 1 load average: 0.15, 0.08, 0.01 1 负载很低,正常
服务器 2 load average: 4.15, 6.08, 6.01 1 负载过高!需要关注
服务器 3 load average: 10.15, 10.08, 10.01 4 负载正常( 10 < 12
# 查看CPU详细信息
cat /proc/cpuinfo
# 查看CPU型号
cat /proc/cpuinfo | grep "model name"
# 查看CPU核心数
cat /proc/cpuinfo | grep "processor" | wc -l

查看CPU详细信息

图1.2

查看CPU型号

图1.3

查看CPU核心数

图1.4

1.2.2找出使用CPU最多的进程

1.2.2.1 top命令
top 命令是 Linux下最常用的进程监控工具,可以实时显示系统进程的资源使用情况:
# 运行top命令
top
# 在top界面中按大写P键,可以按CPU使用率排序

图1.5

top 命令的输出中各列含义如下:
PID :进程 ID
USER :进程所属用户
PR :进程优先级
NI nice
VIRT :虚拟内存大小
RES :常驻内存大小
SHR :共享内存大小
S :进程状态( R= 运行, S= 睡眠, D= 不可中断, T= 停止, Z= 僵尸)
%CPU CPU 使用率
%MEM :内存使用率
TIME+ CPU 累计使用时间
COMMAND :进程命令
1.2.2.2 ps命令
ps 命令可以显示进程的静态快照,配合排序选项可以找出 CPU使用最多的进程:
# 按CPU使用率降序排列所有进程
ps -aux --sort -pcpu | more
# 只显示前10个使用CPU最多的进程
ps -aux --sort -pcpu | head -n 11
参数说明: -aux 表示显示所有进程, --sort -pcpu 表示按 CPU 使用率降序排序。使用 -pcpu
以看到进程的绝对路径,方便找出可疑程序(如木马程序)的位置。

按CPU使用率降序排列所有进程

图1.6

只显示前10个使用CPU最多的进程

图1.7

理解 VIRT RES SHR 的含义
VIRT (虚拟内存) :进程 " 需要的 " 虚拟内存大小,包括进程使用的库、代码、数据等。如
果进程申请 100MB 内存但实际只使用了 10MB VIRT 仍会显示 100MB
RES (常驻内存) :进程当前实际使用的内存大小,不包括 swap out 的部分。包含其他进
程的共享内存。如果申请 100MB 但实际使用 10MB RES 只显示 10MB
SHR (共享内存) :除了自身进程的共享内存,也包括其他进程的共享内存。虽然进程只
使用了几个共享库的函数,但它包含了整个共享库的大小。计算某个进程实际占用物理内存
的公式是: RES - SHR

1.2.3 mpstat查看CPU运行情况

首先查看是否安装mpstat    rpm -q mpstat 

若没有安装,则安装sysstat  yum install sysstat -y      mpstat是软件包sysstat的一部分

mpstat 基本用法
# 查看所有CPU的统计信息
mpstat
# 查看每个CPU核心的详细状态
mpstat -P ALL
# 每秒刷新一次,连续显示10次
mpstat -P ALL 1 10

查看所有CPU的统计信息

图1.8

查看每个CPU核心的详细状态

图1.9

每秒刷新一次,连续显示10次

图1.10

mpstat输出各列含义

列名
含义
%usr
用户空间 CPU 使用占比
%nice
低优先级进程使用 CPU 占比( nice 值大于 0 的进程)
%sys
内核空间 CPU 使用占比
%iowait
CPU 等待 IO 占比(这个值高说明磁盘可能是瓶颈)
%irq
CPU处理硬中断占比        
%soft
CPU 处理软中断占比
%idle
CPU 空闲时间占比(最重要!越高越好)
CPU 使用率参考值
一个健康的 CPU 使用率分布应该是这样的:
65%-70% :用户态时间(运行应用程序)
30%-35% :系统态时间(运行内核)
0%-5% :空闲时间
如果 %iowait 很高,说明系统在等待磁盘 IO ,这时候需要检查磁盘性能。如果 %idle 很低
%usr 也不高,可能是内存不足导致频繁 swap ,或者有其他系统资源瓶颈。

二、内存运行状态监控

2.1查看内存运行状态

Linux 内存管理机制
Linux 系统有一个非常重要的特性:内存总是会被尽可能地利用。系统会把空闲的内存用于
缓存( cache )和缓冲区( buffer ),当应用程序需要内存时,这些缓存可以立即被释放使
用。所以,看到 free 内存很少并不意味着内存不足,关键要看 available 的值。
CentOS 7 系统中, free 命令的 available 列显示的是真正可用的内存。这个值包括了 buffer
cache 中可以被释放的内存。当物理内存不够用时,内核会把非活跃的数据从内存中清
除,所以 available 通常会比 free + buffer + cache 的总和要大。

2.1.1 free命令

# 以MB为单位显示内存使用情况
free -m
# 以GB为单位显示内存使用情况
free -g
# 显示详细信息以对人友好的内容显示(包含buffers和cache)
free -h

图2.1

total :总内存
used :已使用的内存
free :完全空闲的内存
shared :共享内存
buff/cache :缓冲区 / 缓存内存
available :真正可用的内存(最重要!)

2.1.2查看内存详细信息

# 查看详细的内存信息
cat /proc/meminfo

图2.2

重要指标说明:
MemTotal :总物理内存
MemFree :空闲内存
Buffers :用于块设备缓存的内存
Cached :用于文件缓存的内存
Active :活跃内存(进程一直在读写)
Inactive :非活跃内存(最近未被访问,可以被回收)
关键判断 :如果 inactive 内存很多,说明系统有足够的内存可以释放。但如果是 active 内存
很多,那就要考虑增加内存了。

2.2找出使用内存最多的进程

2.2.1 top命令

# 运行top命令
top
# 在top界面中按大写M键,可以按内存使用率排序

操作方式与找出使用CPU最多的进程一致详情请看1.2.2.1

2.2.2 ps命令

# 按内存使用量降序排列
ps -aux --sort -rss | more
# 只显示前10个使用内存最多的进程
ps -aux --sort -rss | head -n 11
参数说明: -rss 表示按实际占用的物理内存( Resident Set Size )排序。加上负号是降序,
去掉负号就是升序。

操作方式与找出使用CPU最多的进程一致详情请看1.2.2.2

三、磁盘IO运行状态监控

3.1查看磁盘IO状态

# iostat是sysstat软件包的一部分之前已经安装过
iostat基本用法
# 只显示磁盘统计信息
iostat -d -k
# 显示指定磁盘的统计信息
iostat -d -k -p /dev/sda
# 每秒刷新一次
iostat -d -k 1

只显示磁盘统计信息

图3.1

显示指定磁盘的统计信息

图3.2

每秒刷新一次

图3.3

iostat 输出各列含义
列名
含义
tps
每秒传输次数( I/O 请求数)
kB_read/s        
每秒读取的数据量( KB
kB_wrtn/s
每秒写入的数据量( KB
kB_read
总读取数据量( KB
kB_wrtn
总写入数据量( KB
判断磁盘 IO 瓶颈
如果发现磁盘的 kB_read/s kB_wrtn/s 值非常高,或者 %iowait 很高,说明磁盘 IO 是系统瓶
颈,需要考虑:
优化应用程序的磁盘读写逻辑
使用 SSD 替代机械硬盘
增加内存减少 IO 需求
使用 RAID 提高 IO 性能

3.2使用iotop命令找出磁盘IO最多的进程

安装 iotop
yum install iotop -y
iotop基本用法
# 显示正在使用磁盘的进程
iotop -o
# 每2秒刷新一次
iotop -d 2
# 只显示有IO输出的进程
iotop -o -d 1

显示正在使用磁盘的进程iotop -o

图3.4

每2秒刷新一次iotop -d 2

图3.5

只显示有IO输出的进程iotop -o -d 1

图3.6

iiotop交互操作
左右箭头:改变排序方式(默认按 IO 排序)
r :改变排序顺序
p :切换进程 / 线程显示
a:显示累积使用量
q :退出
模拟磁盘 IO密集型操作
# 在一个终端启动大量磁盘读写
find /
# 在另一个终端运行iotop观察
iotop -o

图3.7

四、网络运行状态监控

4.1找出使用网络最多的进程

网络监控的重要性
在云计算环境中,网络监控尤为重要。虚拟机和容器都需要通过网络进行通信,如果某个进
程占用了大量网络带宽,会影响其他服务的正常运行。当接到 IDC 机房电话说服务器流量异
常时,需要快速定位是哪个进程在占用带宽。
使用 nload监控总体带宽
# 安装nload
yum install -y nload
# 运行nload
nload
nload 会显示两个方向的流量: Incoming (入站)和 Outgoing (出站)。按左右箭头可以切
换查看不同网卡。

图4.1

使用 nethogs 查看进程带宽
# 安装nethogs
yum install -y nethogs
# 查看进程网络带宽使用
nethogs
nethogs 可以显示每个进程的网络带宽使用情况,非常适合找出 " 谁在偷跑流量 "

图4.2

定位异常流量
# 1. 使用nethogs快速定位
nethogs
# 2. 找出带宽使用最多的进程
# 3. 如果是wget/curl在下载,kill掉
# 4. 如果是正常业务进程,检查是否被攻击

4.2压力测试

在其他终端向本终端发送东西用nload查看流量

在其他终端中输入ab -n 10000 -c 1000 http://192.168.10.3/index.html 在本终端中用nload查看  图4.3和4.4对比图

图4.3

图4.4

五、系统整体运行状态监控

5.1使用vmstat查看系统整体状态

vmstat简介
vmstat Virtual Memory Statistics )是 Linux/Unix 下最常见的监控工具之一,它可以展现
给定时间间隔的服务器状态值,包括服务器的 CPU 使用率、内存使用情况、虚拟内存交换情
况、 IO 读写情况等。
vmstat top 最大的区别是: vmstat 可以看到整个机器的 CPU 、内存、 IO 使用情况,而不是
只看各个进程的 CPU 和内存使用率,而且 vmstat top 更节省资源。当机器运行比较慢时,
建议使用 vmstat 而不是 top
vmstat基本用法
# 查看系统整体状态
vmstat
# 每秒刷新一次,连续显示10次
vmstat 1 10

查看系统整体状态

图5.1

每秒刷新一次,连续显示10次

图5.2

vmstat输出各列详解
Procs (进程)
r :等待运行的进程数(如果超过 CPU 核心数的 3 倍,说明 CPU 繁忙)
b :不可中断睡眠的进程数(通常在等待 IO
Memory (内存)
swpd :已使用的虚拟内存大小
free :空闲的物理内存大小
buff :用于 buffer 的内存大小
cache :用于 cache 的内存大小
Swap (交换分区)
si :从磁盘换入内存的量( KB/s
so :从内存换出到磁盘的量( KB/s
如果 si so 长期大于 0 ,说明物理内存不够用。
IO
bi :从磁盘读入内存的数据量( blocks/s
bo :从内存写入磁盘的数据量( blocks/s
System (系统)
in :每秒中断次数
cs :每秒上下文切换次数
CPU
us :用户态 CPU 时间百分比
sy :系统态 CPU 时间百分比
id CPU 空闲时间百分比
wa :等待 IO CPU 时间百分比

5.2判断系统瓶颈

5.2.1刚开机一切正常的系统

vmstat 1 10
观察结果: r 列数值很小( < 12 ), free 很大, si so 都是 0 id 很高( > 90% ), wa 很低。这
是正常状态。

图5.3

5.2.2在/opt下生成一个文件

打开两个相同终端
# 在/opt下生成一个5G的文件为test.img
dd if=/dev/zero of=/opt/test.img bs=1M count=5000 oflag=direct
# 同时监控vmstat
vmstat 1 1000

图5.4

图5.5

5.2.3 web服务器压力测试

# 启动Web服务
systemctl start httpd
# 进行压力测试
ab -n 10000 -c 1000 http://192.168.10.3/index.html
# 监控vmstat
vmstat 1 1000
观察结果: r 列超过 12 wa 0 ,但 us sy 都很高。说明 CPU 是瓶颈,需要优化或增加CPU 资源。

图5.6

5.3使用sar记录系统运行状态

sar简介
sar System Activity Reporter )是 sysstat 软件包中最强大的工具,它可以收集、报告和保
存系统活动信息。与 vmstat 不同, sar 不仅可以实时采样,还可以读取历史数据,这对于分
析系统过去的状态非常有用。
sar 的默认配置是每 10 分钟采样一次,并把数据保存到 /var/log/sa/ 目录下。这意味着我们可
以查看过去任意时间点的系统状态,非常适合排查问题。

sar在sysstat软件包里不用安装

# 查看sar的计划任务
cat /etc/cron.d/sysstat

图5.7

sar 常用选项
# 查看CPU使用情况
sar -u 1 3
# 查看内存使用情况
sar -r 1 3
# 查看磁盘IO情况
sar -d 1 3
# 查看网络接口情况
sar -n DEV 1 3
# 查看所有信息
sar -A  1 3
'1'为一秒一次  '3'为一共三次

图5.8

保存和读取历史数据
# 保存采样数据到文件
sar -u 2 5 -o cpu.sar
# 读取历史二进制文件
sar -u -f cpu.sar
# 查看历史日志
sar -f /var/log/sa/sa04

查看历史日志

图5.9

常见用法示例
# 查看今天早上9点到10点的系统状态
sar -s 09:00:00 -e 10:00:00 -f /var/log/sa/sa16
# 查看内存历史
sar -r -f /var/log/sa/sa16
# 查看磁盘历史
sar -d -f /var/log/sa/sa16
# 查看网络历史
sar -n DEV -f /var/log/sa/sa16

六、CPU资源调优

6.1调整进程优先级

nice值原理
Linux 系统中, nice 值的范围从 -20 +19 (不同系统可能略有差异)。正值表示低优先
级,负值表示高优先级,值为零则表示不会调整该进程的优先级。
重要规则 nice 值越低,优先级越高。 -20 是最高优先级, +19 是最低优先级。
默认情况下,所有进程的 nice 值都是 0
使用 nice命令
# 在命令运行前调整nice值
nice -n 6 httpd # 将http的优先级提高到6
# nice值范围是-20到+19
nice -n -10 command # 高优先级
nice -n 10 command # 低优先级
使用 renice 命令
# 查看进程的PID和当前nice值
ps -axu | grep httpd
# 修改运行中进程的优先级
renice -n 6 44470 # 将PID为44470的进程nice值改为6
# 限制:普通用户只能降低自己的进程优先级
# root用户可以调整任何进程的优先级

图6.1

图6.2

验证

图6.3

注意事项
进程优先级不能超过范围限制:
# 尝试设置-21,实际只会变成-20
renice -n -21 24219
# 输出:old priority -20, new priority -20
# 尝试设置20,实际只会变成19
renice -n 20 24219
# 输出:old priority -19, new priority -19

6.2CPU亲和力

CPU 亲和力简介
CPU 亲和力( CPU Affinity )是指将某个进程强制绑定到特定的 CPU 核心上运行。在多核
CPU系统中,这个功能非常有用:
减少进程在不同 CPU 之间切换的开销
提高 CPU 缓存命中率
绑定的 CPU 核心发生故障时,可以及时发现
满足特定应用的需求
taskset命令
# 安装taskset
yum install -y util-linux
# 查看进程的CPU亲和力
taskset -cp 进程PID
# 指定进程在特定CPU上运行
taskset -c 0 vim a.txt # 在CPU 0上运行
taskset -c 1,3 vim b.txt # 在CPU 1或3上运行
taskset -c 0-3 vim c.txt # 在任意CPU 0-3上运行

查看进程的CPU亲和力

图6.4

本机只有一个CPU

七、磁盘IO调优

7.1 ulimit资源限制

ulimit简介
ulimit Linux 系统用于限制用户或进程使用系统资源的功能。常见的限制包括:
最大文件数( open files
最大进程数( max user processes
最大内存大小
最大 CPU 时间
最大栈大小
# 查看所有资源限制
ulimit -a

图7.1

临时修改限制
# 临时修改最大文件数(重启后失效)
ulimit -n 1024000
永久修改限制
# 编辑配置文件
vim /etc/security/limits.conf
# 添加以下内容(最后追加)
* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000
说明: soft 是警告值, hard 是真正限制值。超过 soft 会警告,超过 hard 会报错。

临时修改限制

图7.2

修改最大进程数(修改后需要重启系统才能生效)
# 编辑配置文件
vim /etc/security/limits.d/90-nproc.conf
# 修改内容
* soft nproc 88888
* hard nproc 88888

7.2测试硬盘速度

使用 hdparm测试磁盘读速度
# 测试磁盘读速度(不带缓存)
hdparm -t --direct /dev/sda

图7.3

使用 dd测试磁盘写速度
# 测试磁盘顺序写速度
dd if=/dev/zero of=/opt/test.dbf bs=1M count=2000 oflag=direct,nonblock
# 参数说明:
# if=/dev/zero:输入文件(空字符流)
# of=/opt/test.dbf:输出文件
# bs=1M:块大小1MB
# count=2000:复制2000次(共2GB)
# oflag=direct,nonblock:直接IO,非阻塞

图7.4

使用 time命令测试进程运行时间
# 使用time测试命令执行时间
time dd if=/dev/zero of=/opt/test.dbf bs=1M count=200
real 0m0.522s # 实际执行时间
user 0m0.001s # 用户态CPU时间
sys 0m0.515s # 系统态CPU时间
real time :从命令开始到结束的总时间
user CPU time :在用户态执行的时间
system CPU time :在内核态执行的时间

图7.5

总结

Linux性能调优的核心方法论与实操工具,遵循“CPU → 内存 → 磁盘 → 网络”的排查顺序,借助uptime、top、free、vmstat、iostat、sar等监控工具定位子系统瓶颈,并通过调整进程优先级(nice/renice)、绑定CPU亲和力(taskset)、修改资源限制(ulimit)及测试磁盘IO(dd/hdparm)等手段进行针对性优化,强调各子系统间的依赖关系,最终目标是实现系统资源的整体平衡,是云计算运维中排查慢问题和保障服务稳定性的实用指南。

更多推荐