Linux系统性能调优与监控
目录
前言
以“理论+实践”的方式,系统讲解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 :进程 IDUSER :进程所属用户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
|
列名
|
含义
|
|
%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
|
列名
|
含义 |
|
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最多的进程
安装 iotopyum install iotop -yiotop基本用法# 显示正在使用磁盘的进程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监控总体带宽# 安装nloadyum install -y nload# 运行nloadnloadnload 会显示两个方向的流量: Incoming (入站)和 Outgoing (出站)。按左右箭头可以切换查看不同网卡。

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

图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.imgdd if=/dev/zero of=/opt/test.img bs=1M count=5000 oflag=direct# 同时监控vmstatvmstat 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# 监控vmstatvmstat 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到+19nice -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,实际只会变成-20renice -n -21 24219# 输出:old priority -20, new priority -20# 尝试设置20,实际只会变成19renice -n 20 24219# 输出:old priority -19, new priority -19
6.2CPU亲和力
CPU 亲和力简介CPU 亲和力( CPU Affinity )是指将某个进程强制绑定到特定的 CPU 核心上运行。在多核CPU系统中,这个功能非常有用:减少进程在不同 CPU 之间切换的开销提高 CPU 缓存命中率绑定的 CPU 核心发生故障时,可以及时发现满足特定应用的需求
taskset命令# 安装tasksetyum 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 1024000root soft nofile 1024000root 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=200real 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)等手段进行针对性优化,强调各子系统间的依赖关系,最终目标是实现系统资源的整体平衡,是云计算运维中排查慢问题和保障服务稳定性的实用指南。
更多推荐


所有评论(0)