文章目录
- 前言
- 一、系统调优概述
- 1.1 系统调优思路
- 1.2 各子系统之间的依赖关系
- 二、CPU性能监控工具
- 2.1 uptime 命令:查看系统平均负载
- 2.2 判断CPU负载是否过高的示例
- 2.3 查看CPU详细信息
- 2.4 使用 top 按 CPU 使用率排序
- 2.4 使用 ps 查看 CPU 使用最多的进程
- 2.5 mpstat命令:查看CPU详细使用情况
- 三、内存性能监控工具
- 3.1 free命令:查看内存使用情况
- 3.2 查看详细的内存信息
- 3.3 查找内存使用最多的进程
- 四、磁盘I/O监控工具
- 4.1 iostat命令:查看IO是否存在瓶颈
- 4.1.1 iostat案例:使用 dd 测试磁盘写入
- 4.2 iotop命令:查看实时I/O进程
- 五、网络性能监控工具
- 5.1 nload:监控实时带宽使用情况
- 5.2 nethogs:查看进程网络使用
- 六、系统整体监控工具
- 6.1 vmstat命令:查看内存及系统整体运行状态
- 6.2 sar命令:记录系统运行状态
- 6.2.1 命令行参数说明:
- 6.2.2 常用选项列表
- 七、CPU资源调优
- 7.1 调整进程优先级(nice 值)
- 7.1.1 nice 值范围与含义
- 7.2 设置 CPU 亲和力(taskset)
- 八、磁盘IO调优
- 8.1 ulimit 资源限制
- 8.2 测试硬盘速度
- 总结
前言
本文核心是定位并消除CPU、内存、磁盘、网络等子系统的瓶颈,使系统达到平衡状态,并提出了“先整体监控定位,再具体分析瓶颈,最后针对性调优”的完整思路。包含了CPU(uptime、top、mpstat)、内存(free、vmstat)、磁盘I/O(iostat、iotop)到网络(nload、nethogs)的监控工具链,以及进程优先级调整(nice)、CPU亲和力绑定(taskset)和资源限制(ulimit)等具体调优方法。
一、系统调优概述
系统调优是通过调整软硬件配置和代码,在现有资源下提升性能(速度、吞吐量)的实践。核心是先定位瓶颈(用工具找短板),再由易到难调整(网络→系统参数→中间件→代码),每次只改一项并对比结果,避免盲目操作。
1.1 系统调优思路
- 第一步:观察系统运行状况
按照优先级顺序依次检查CPU状态、内存使用情况、磁盘IO、网络流量、应用程序性能 - 第二步:分析是否存在瓶颈
根据应用需求判断是否存在性能瓶颈 - 第三步:采取调优措施
采取针对性措施改善性能
1.2 各子系统之间的依赖关系
各子系统之间是相互依赖、相互影响的,一个子系统的高负载可能导致其他子系统出现问题。
比如:
(1)CPU与内存:大量的网页调入请求导致内存队列的拥塞,系统会频繁交换数据,导致CPU忙于“搬砖”而非处理业务。
(2)CPU与网络:网卡的大吞吐量可能导致更多的CPU开销,因为每个网络包都需要
CPU处理。如果网络中断处理占用过多CPU,会严重影响其他业务的执行。
(3)内存与磁盘:大量来自内存的磁盘写请求可能导致更多的CPU以及IO问题。内存中的数据最终需要写入磁盘,如果磁盘IO缓慢,会导致内存中待写入的数据堆积。
(4)内存与CPU:当内存不足时,内核需要频繁进行内存页的换入换出操作(swapping),这会消耗大量CPU资源,同时产生大量磁盘IO,形成恶性循环。
二、CPU性能监控工具
2.1 uptime 命令:查看系统平均负载
uptime11:21:32是当前时间。up 35min是系统运行时间 ,说明此服务器连续运行 35分钟了。2 users是当前登录用户数。load average: 0.00, 0.01, 0.05是系统负载平均值,即任务队列的平均长度,三个数值分别为 1 分钟、5 分钟、15分钟前到现在的平均值。- 若1分钟负载值 > CPU核心数,说明系统可能过载。
- 根据经验法则:单核心CPU的
load average不要超过3,四核心CPU的负载不要超过12,其中load average为3意味着平均有3个任务在等待CPU处理。
2.2 判断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)因为4核服务器,能承受的合理上限为3x4=12
2.3 查看CPU详细信息
cat/proc/cpuinfo#查看CPU详细信息,CPU核心数是从0开始计算的2.4 使用 top 按 CPU 使用率排序
- top命令的输出中各列含义如下:
PID:进程IDUSER:进程所属用户PR:进程优先级NI:nice值VIRT:虚拟内存大小RES:常驻内存大小SHR:共享内存大小S:进程状态(R=运行,S=睡眠,D=不可中断,T=停止,Z=僵尸)%CPU:CPU使用率%MEM:内存使用率TIME+:CPU累计使用时间COMMAND:进程命令
top#最常用的进程监控工具按大写P按 CPU 使用率降序排列。
2.4 使用 ps 查看 CPU 使用最多的进程
ps-aux--sort-pcpu|head-n11#显示前10个使用CPU最多的进程# -aux表示所有进程, --sort -pcpu表示按CPU使用率降序排序参数含义:
- VIRT(虚拟内存):进程"需要的"虚拟内存大小,包括进程使用的库、代码、数据等。
- RES(常驻内存):进程当前实际使用的内存大小,不包括swap out的部分。
- SHR(共享内存):除了自身进程的共享内存,也包括其他进程的共享内存。计算某个进程实际占用物理内存的公式是:RES - SHR。
2.5 mpstat命令:查看CPU详细使用情况
mpstat- 参数说明
%usr:用户空间 CPU 使用占比。%nice:低优先级进程使用CPU占比(nice值大于0的进程)。%sys:内核空间 CPU 使用占比。%iowait:CPU 等待 IO 占比(这个值高说明磁盘可能是瓶颈)。%irq:CPU处理硬中断占比。%soft:CPU处理软中断占比。%idle:CPU 空闲时间占比(最重要,越高越好)。
三、内存性能监控工具
3.1 free命令:查看内存使用情况
free-h#显示详细信息(包括buffers和cache)- 字符解释
total:总内存used:已使用内存free:完全空闲的内存shared:共享内存buff/cache:缓冲区/缓存内存available:真正可用的内存(重要)
3.2 查看详细的内存信息
cat/proc/meminfo3.3 查找内存使用最多的进程
方法1:运行top,然后按大写M可以按内存使用率来排序显示。
方法2:按照实际使用内存,从大到小排序显示所有进程列表
ps-aux--sort-rss|head#按物理内存降序,-rss表示按实际占用的物理内存排序。加上负号是降序,去掉负号就是升序。四、磁盘I/O监控工具
4.1 iostat命令:查看IO是否存在瓶颈
rpm-qsysstat#检查是否安装sysstat,因为iostat是sysstat软件包的一部分yuminstall-ysysstat#若未安装sysstat,则yum install下载iostat-d-k#只显示磁盘统计信息iostat-d-k-p/dev/sda#显示指定磁盘的统计信息iostat-d-k1#每秒刷新一次iostat-d-k-p/dev/sda15#共采集五次常用参数:-d仅显示磁盘统计信息。-k以KB为单位显示每秒的磁盘请求数,默认单位块。-pdevice | ALL 用于显示块设备及系统分区的统计信息。1:采样间隔时间,单位为秒(这里表示每 1 秒采集一次数据)5:采样次数
关键指标:kB_read/s每秒从磁盘读入的数据量,单位为K.kB_wrtn/s每秒向磁盘写入的数据量,单位为K.kB_read读入的数据总量,单位为K.kB_wrtn写入的数据总量,单位为K.
4.1.1 iostat案例:使用 dd 测试磁盘写入
ddif=/dev/zeroof=a.txtbs=10Mcount=1000#if:输入文件。of:输出文件。bs=10M:设置每次读写的块大小为 10MB。count=1000:设置读写的块数量为 1000,所以总文件大小是 10MB×1000=10000MB(约 10GB)iostat-psda-dk#查看磁盘I/O使用情况4.2 iotop命令:查看实时I/O进程
问题场景:公司服务器运行缓慢,但CPU使用率和内存占用均正常,主要卡顿出现在启动新程序或打开文件时。此时系统瓶颈可能在哪里?
解决方案:问题通常出在磁盘I/O上。可通过iotop命令检查磁盘读写最频繁的进程。iotop实时监控磁盘I/O使用情况。
yuminstall-yiotop iotop-o#显示正在使用磁盘的进程iotop-d2#每2秒刷新一次iotop-o-d1#只显示有IO输出的进程iotop常用快捷键
| 快捷键 | 功能描述 |
|---|---|
| 左箭头/右箭头 | 切换排序依据的列(默认按 IO 使用率排序) |
| r | 反转当前排序顺序(升序/降序) |
| p | 切换进程/线程的显示模式(显示线程或聚合为进程) |
| a | 切换显示累计 IO 使用量(而非实时值) |
| q | 退出iotop工具 |
五、网络性能监控工具
5.1 nload:监控实时带宽使用情况
#安装nloadyuminstallnload-ynload#nload会显示两个方向的流量:Incoming(入站)和Outgoing(出站)。按左右箭头可以切换查看不同网卡。ab-n100000-c1000http://10.8.0.10/index.html#做ab压测,-n 100000:指定总请求数为 100000 次。ab 会向目标 URL 发送共计 100000 次 HTTP 请求。# -c 1000:设置并发连接数为1000。表示同时有1000个请求并行发送到服务器。# http://10.8.0.10/index.html 目标测试 URL。ab 会针对该地址发起请求测试。5.2 nethogs:查看进程网络使用
yum-yinstallnethogs#安装 nethogsnethogs#查看进程网络宽带六、系统整体监控工具
6.1 vmstat命令:查看内存及系统整体运行状态
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存交换情况,IO读写情况。
使用vmstat可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率。 比top命令节省资源。
vmstat#查看系统整体状态vmstat15#每秒刷新一次,连续显示5次
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时间百分比
6.2 sar命令:记录系统运行状态
yuminstall-ysysstat#安装sysstatcat/etc/cron.d/sysstat#查看sar的计划任务6.2.1 命令行参数说明:
t:指定采样间隔(必需参数)
n:指定采样次数(可选参数,默认值为1)
-o file参数表示将命令结果以二进制格式保存到指定文件中
6.2.2 常用选项列表
sar-u15# 查看CPU使用情况sar-r15# 查看内存使用情况sar-d15# 查看磁盘IO情况sar-nDEV15# 查看网络接口情况sar-A15# 查看所有信息sar-u25-ocpu.sar# 保存采样数据到文件sar-u-fcpu.sar# 读取历史二进制文件sar-f/var/log/sa/sa16# 查看历史日志重点关注 %iowait 和 %idle:
(1)若 %iowait 过高,说明硬盘存在 I/O 瓶颈
(2)%idle 较高表示 CPU 空闲,但如果系统响应仍然缓慢,可能是 CPU 在等待内存分配,此时建议增加内存容量
(3)若 %idle 持续低于 10%,则表明 CPU 处理能力不足,需要优先优化 CPU 资源
七、CPU资源调优
7.1 调整进程优先级(nice 值)
7.1.1 nice 值范围与含义
范围:-20(最高优先级)到 19(最低优先级),默认值为 0。
规律:
(1)nice 值越小(甚至为负),优先级越高,系统会更频繁地调度该进程;
(2)nice 值越大,优先级越低,系统会减少对其的 CPU 资源分配。
nice-n-5vimb.txt#命令运行前调整nice值ps-eopid,ni,comm|grepvim#查看进程的PID和nice值7.2 设置 CPU 亲和力(taskset)
功能:通过将进程绑定到指定 CPU 核心,减少上下文切换开销,提升性能。
yuminstall-yutil-linux taskset-cp103255#查看进程的CPU亲和力taskset-c0vima.txt# 在CPU 0上运行taskset-c1,3vimb.txt# 在CPU 1或3上运行taskset-c0-3vimc.txt# 在任意CPU 0-3上运行八、磁盘IO调优
8.1 ulimit 资源限制
ulimit是Linux系统用于限制用户或进程使用系统资源的功能。常见的限制包括:最大文件数(open files)、最大进程数(max user processes)、最大内存大小、最大CPU时间、最大栈大小。
常用配置
* soft nofile1024000* hard nofile1024000* soft nproc65535* hard nproc65535*:表示对 所有用户 生效(也可以指定具体用户名,如 root 或 www) soft:软限制(警告线),超过时系统会警告,但允许临时超过(直到进程结束) hard:硬限制(强制线),由内核强制执行,绝对不能超过(软限制不能高于硬限制) nofile:限制 打开文件描述符的数量(包括文件、网络连接、管道等,Linux 中 “一切皆文件”) nproc:限制 用户能创建的进程 / 线程数量 具体配置的含义: * soft nofile1024000所有用户的 软限制:最多可打开1024000个文件描述符(超过会警告) * hard nofile1024000所有用户的 硬限制:绝对不能打开超过1024000个文件描述符 * soft nproc65535所有用户的 软限制:最多可创建65535个进程 / 线程(超过会警告) * hard nproc65535所有用户的 硬限制:绝对不能创建超过65535个进程 / 线程ulimit-a#查看所有资源限制ulimit-n# 查看 nofile 软限制ulimit-Hn# 查看 nofile 硬限制ulimit-u# 查看 nproc 软限制ulimit-n1024000#临时修改软限制#永久修改vim/etc/security/limits.conf#修改内容* soft nofile1024000* hard nofile1024000root soft nofile1024000root hard nofile10240008.2 测试硬盘速度
这是一个用于测试硬盘读取速度的命令,主要用于评估磁盘的顺序读取性能
hdparm-t--direct/dev/sda#hdparm:Linux 下用于查看和调整硬盘参数的工具# -t:测试硬盘的缓存读取速度(读取数据时会利用硬盘缓存和系统缓存)# --direct:启用 “直接 IO” 模式(跳过系统缓存,直接从硬盘读取原始数据,更接近真实的物理读取速度)# /dev/sda:指定要测试的硬盘设备(sda 通常是系统的第一个硬盘)ddif=/dev/zeroof=/test.dbfbs=1Mcount=2000oflag=direct,nonblock参数说明:if=/dev/zero:输入文件(空字符流)of=/test.dbf:输出文件bs=1M:块大小1MBcount=2000:复制2000次(共2GB)oflag=direct,nonblock:直接IO,非阻塞
总结
系统性能调优是一个系统工程,需要:
全面监控:使用各种工具收集系统状态数据
综合分析:理解各子系统间的相互影响
针对性优化:根据瓶颈类型采取适当措施