Linux 系统调优与CPU-IO-网络内核参数调优
1. Linux系统调优
1.1 安装工具包
在开始监控前,需要确保系统已安装以下工具包,它们是后续操作的基础:
sysstat
:包含 mpstat、iostat、sar 等核心统计工具iotop
:专门监控磁盘 I/O 的进程级工具nethogs
:按进程查看网络占用的利器nload
:实时可视化网络带宽的工具httpd-tools
:含 ab 压力测试工具(用于网络测试)
以 CentOS 为例,安装命令如下:
yum install sysstat iotop nethogs nload httpd-tools -y
Ubuntu/Debian 系统则用apt-get install
替代即可。
1.2 CPU 负载查看
CPU 是系统的 “大脑”,一旦过载,整个系统都会变慢。下面这些工具能帮你快速定位 CPU 问题。
1. 快速看负载:uptime
最简单的负载查看命令,执行后一秒出结果:
uptime
# 示例输出:16:30:45 up 2 days, 4:12, 2 users, load average: 1.25, 0.98, 0.85
输出解读:
- 前半部分是当前时间、系统运行时长、登录用户数
- 关键看最后三个数字:1 分钟、5 分钟、15 分钟平均负载
- 判断标准:若 1 分钟负载 > CPU 核心数(可通过
lscpu | grep "CPU(s):"
查看核心数),说明系统可能短暂过载,需结合 5/15 分钟趋势 —— 如果三者都高,那就是真过载了。
比如我这台机器是 1 核 CPU,1 分钟负载 1.25>1,说明此刻有点 “忙”,但 5/15 分钟负载在下降,问题不大。
2. 实时监控进程:top
top
能实时显示进程 CPU 占用。执行top
后,按大写 P,进程会按 CPU 使用率降序排列,谁在 “吃 CPU” 一目了然:
top
# 按P后,表头%CPU列会标红,高占用进程排在最前面
如果想退出,按
q
即可。
3. 批量查高 CPU 进程:ps
如果不想实时监控,只想一次性导出前 10 个高 CPU 进程,用ps
命令更方便:
ps -aux --sort -pcpu | head -10
参数解读:
-aux
:列出所有进程(包括无终端的后台进程),显示 CPU、内存等详细信息--sort -pcpu
:按 CPU 使用率(pcpu)降序排列(负号表示降序)| head -10
:只显示前 10 条结果,避免输出太多看不过来
4. 看 CPU 核心详情:mpstat
如果想知道每个 CPU 核心的负载(比如是不是某一个核心被占满),用mpstat
(来自 sysstat 包):
mpstat -P ALL 1 5
# -P ALL:显示所有核心(包括整体平均)
# 1 5:每1秒采样一次,共采样5次
重点关注这几列:
%usr
:用户空间进程占用 CPU 比例(比如 Java、Python 程序)%sys
:内核空间占用 CPU 比例(比如系统调用、驱动)%iowait
:CPU 等待 I/O 的时间比例(如果这个值高,说明不是 CPU 本身忙,而是等磁盘 / 网络)%idle
:CPU 空闲比例(越低越忙)
1.3 内存运行状态查看
内存不足时,系统会用磁盘当 “虚拟内存”(swap),而磁盘速度比内存慢 100 倍以上,所以内存监控也很关键。
1. 快速看内存:free
执行free -m
(-m 表示以 MB 为单位,更直观):
关键看available 列:这是系统实际可用的内存(包括可回收的缓存),比 free 列更准确。如果 available 很低,说明内存紧张。
2. 看详细内存信息:/proc/meminfo
/proc/meminfo
是内核暴露的内存详情文件,用cat
查看:
cat /proc/meminfo
重点关注两项:
Active
:活跃内存(正在被使用,不容易释放)Inactive
:非活跃内存(暂时不用,系统可换出到 swap)
如果 Inactive 很高,说明内存有 “闲置”,可通过调整内核参数释放。
3. 实时看进程内存:top + M
和看 CPU 类似,执行top
后按大写 M,进程会按内存使用率降序排列,能快速找到 “内存大户”。
4. 批量查高内存进程:ps
一次性导出前 10 个高内存进程:
ps -aux --sort -rss | head -10
# --sort -rss:按物理内存占用(RSS)降序排列
1.4 磁盘 I/O状态查看
磁盘 I/O 是很多系统的性能瓶颈 —— 比如数据库读写频繁、日志写入量大时,磁盘会成为 “短板”。
1. 先看文件系统块大小
不同文件系统的块大小会影响 I/O 效率(比如 4KB 块适合小文件,64KB 适合大文件),先确认块大小:
- EXT4/EXT3 系统(常见于旧服务器):
tune2fs -l /dev/sda1 | grep "Block size" # 示例输出:Block size: 4096(4KB)
- XFS 系统(常见于 CentOS 7+):
xfs_growfs -l /dev/sda1 | grep bsize # 示例输出:bsize=4096(4KB)
2. 监控磁盘整体 I/O:iostat
iostat
能看磁盘的读写速度,执行:
iostat -d -k -p /dev/sda 1 5
# -d:只显示磁盘统计(不显示CPU)
# -k:以KB为单位(默认是块,不直观)
# -p /dev/sda:显示sda磁盘及所有分区
# 1 5:每1秒采样一次,共5次
重点关注:
kB_read/s
:每秒从磁盘读取的数据量kB_wrtn/s
:每秒写入磁盘的数据量
如果这两个值持续很高(比如超过磁盘标称的 IOPS),说明磁盘很忙。
3. 测试磁盘写入速度:dd
想知道磁盘实际能跑多快,用dd
命令做个简单测试(注意:会生成 1GB 大文件,测试后可删除):
dd if=/dev/zero of=testfile bs=1M count=1000; sync
# if=/dev/zero:从“零设备”读数据(无限输出0,不占CPU)
# of=testfile:写入到testfile文件
# bs=1M:每次读写1MB块
# count=1000:共写1000块,总大小1GB
# sync:强制刷内存到磁盘(避免缓存影响结果)
执行后会显示写入速度,比如 “1000+0 records out,1048576000 bytes (1.0 GB) copied, 12.345 seconds, 84.9 MB/s”,表示写入速度约 85MB/s。
4. 看进程级 I/O:iotop
iostat
能看磁盘整体情况,但想知道哪个进程在频繁读写,需要iotop
(需 root 权限):
iotop -o -d 1
# -o:只显示正在产生I/O的进程(过滤空进程,更简洁)
# -d 1:每秒刷新一次
测试方法:在另一个终端执行find /
(遍历整个文件系统,产生大量 I/O),再看iotop
输出,就能看到find
进程的读写情况。
1.5 网络状态查看
无论是 Web 服务还是数据库同步,网络问题都会直接影响业务,下面两个工具能帮你监控网络。
1. 实时看带宽:nload
nload
是可视化工具,执行后能看到流入(Incoming)和流出(Outgoing)的带宽使用:
nload
# 界面左侧是流入,右侧是流出,显示当前/平均/最大速率
比如 “Curr: 41.12 kBit/s” 表示当前流入速率 41KB/s,“Max: 1.33 MBit/s” 是峰值。
2. 按进程看网络:nethogs
想知道哪个进程在占用带宽(比如是不是某个下载进程占满了带宽),用nethogs
:
nethogs
测试方法:在另一个终端用wget https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
下载大文件,再看nethogs
,就能看到wget
进程的下载带宽。
1.6 系统整体状态查看
如果想一次性看 CPU、内存、磁盘、网络的整体情况,vmstat
和sar
是最佳选择。
1. 实时全局监控:vmstat
执行vmstat 1 5
(每 1 秒采样一次,共 5 次):
vmstat 1 5
重点关注这些列:
r
:运行队列长度(长期 > CPU 核心数,说明 CPU 不够用)b
:阻塞进程数(高则 I/O 忙)si/so
:swap 换入 / 换出(非 0 说明内存不足)bi/bo
:磁盘读写块数(高则磁盘忙)wa
:CPU 等待 I/O 时间占比(>20% 则 I/O 是瓶颈)us/sy
:用户态 / 内核态 CPU 占比(us 高是应用忙,sy 高是系统调用多)id
:CPU 空闲占比(低则 CPU 忙)
2. 记录历史状态:sar
sar
不仅能实时监控,还能记录历史数据,方便后续分析(比如排查 “昨天下午系统卡顿” 的原因)。
记录 CPU 状态(保存到 cpu.sar 文件):
sar -u 2 5 -o cpu.sar # -u:监控CPU # 2 5:每2秒采样一次,共5次 # -o cpu.sar:保存到文件
后续查看记录:
sar -u -f cpu.sar
记录内存状态:
sar -r 1 5 # -r:监控内存和swap
记录网络状态:
sar -n DEV 1 5 # -n DEV:监控网络接口(如eth0) # 重点看rxkB/s(接收)、txkB/s(发送)
查看系统自带的历史日志:
系统默认会在/var/log/sa
目录下保存历史 sar 日志(如 sa15 表示 15 号的日志),查看 15 号的网络日志:sar -n DEV -f /var/log/sa/sa15
2. CPU、磁盘 I/O、网络与内核参数调优
2.1 CPU 资源调优
1. 调整进程优先级(nice 值)
- 作用:通过修改
nice
值改变进程 CPU 调度优先级,实现资源合理分配。 - 范围:
-20
(最高优先级)~19
(最低优先级),默认值为0
。 - 核心命令:
- 启动时设置:
nice -n -5 vim a.txt
,将vim a.txt
进程的nice
值设为-5
,提升其优先级,系统繁忙时优先分配 CPU。 - 运行中修改:
renice -n 6 24318
,将 PID 为24318
的进程nice
值设为6
,降低优先级,使其 “谦让” CPU 资源。
- 启动时设置:
- 关键规律:
nice
值越小,进程优先级越高,获取 CPU 资源越多;值越大,优先级越低,资源获取越少。 - 适用场景:给核心业务进程(如服务器进程)提权,给后台备份等非紧急进程降权。
2. 设置 CPU 亲和力(taskset)
- 作用:将进程绑定到指定 CPU 核心,减少上下文切换开销,提升运行稳定性。
- 安装:需先安装
util-linux
包(yum install util-linux
)。 - 核心命令:
- 绑定单个核心:
taskset -c 0 vim a.txt
,启动的vim
进程仅在 CPU0 上运行。 - 查看绑定情况:
taskset -cp 20146
,查看 PID 为20146
进程的 CPU 绑定核心(示例输出绑定 CPU0)。 - 绑定多个核心:
taskset -c 1,3 vim b.txt
,vim
进程仅在 CPU1 和 CPU3 间调度。
- 绑定单个核心:
3. 查看 CPU 信息(cat /proc/cpuinfo)
- 作用:读取
/proc
虚拟文件系统,获取 CPU 硬件详细参数,相当于 “CPU 身份证”。 - 核心信息解读:
- 核心数量:
processor
条目数 = 总逻辑核心数(含超线程);cpu cores
= 单个物理 CPU 的物理核心数(如cpu cores : 4
表示 4 核)。 - 型号与主频:
model name
显示 CPU 型号(如i7-7700HQ
)和基础主频;cpu MHz
显示实时运行频率(动态调频时会变化)。 - 厂商与功能:
vendor_id
区分 Intel/AMD;flags
列出支持的指令集(如avx2
加速多媒体、vmx
支持虚拟化)。
- 核心数量:
- 常用操作指令:
- 查看物理 CPU 数量:
cat /proc/cpuinfo | grep "physical id" | sort | uniq
。 - 查看逻辑 CPU 数量:
cat /proc/cpuinfo | grep "processor" | sort -u | wc -l
。 - 查看 CPU 核数:
cat /proc/cpuinfo | grep "cpu cores" | sort | uniq
。
- 查看物理 CPU 数量:
4. 用 vmstat 分析系统瓶颈
- 关键指标:
r
:等待运行的进程数,持续大于 “CPU 核心数 ×3” 表示 CPU 繁忙。us
:用户态 CPU 时间占比,高则说明应用程序消耗资源多。sy
:系统态 CPU 时间占比,高则表示内核消耗资源多。wa
:CPU 等待 I/O 的时间占比,高则提示磁盘 I/O 存在瓶颈。id
:空闲 CPU 时间占比,低则表示 CPU 负载高。
- 实战场景对应:
- 上传大文件:
wa
高、bo
(每秒写入块数)大,说明写磁盘繁忙。 - 复制文件:
bi
(每秒读取块数)和bo
均高、wa
高,说明磁盘读写均繁忙。 - 高并发 HTTP 请求:
r
高、us
高,说明 CPU 处理能力不足。
- 上传大文件:
2.2 磁盘 I/O 调优
1. ulimit 资源限制
- 配置文件:
/etc/security/limits.conf
(或/etc/security/limits.d/
目录下文件),用于限制用户进程资源上限。 - 常用设置(对所有用户生效):
* soft nofile 1024000
:软限制,最多打开 1024000 个文件描述符(超限时警告)。* hard nofile 1024000
:硬限制,绝对不能超过 1024000 个文件描述符(软限制≤硬限制)。* soft nproc 65535
:软限制,最多创建 65535 个进程 / 线程(超限时警告)。* hard nproc 65535
:硬限制,绝对不能超过 65535 个进程 / 线程。
- 查看与临时修改:
- 查看
nofile
软限制:ulimit -n
;硬限制:ulimit -Hn
。 - 查看
nproc
软限制:ulimit -u
。 - 临时修改
nofile
限制:ulimit -n 10000
(重启后失效)。
- 查看
2. 测试磁盘速度
- 读速度测试:
hdparm -t --direct /dev/sda
hdparm
:硬盘参数查看与调整工具;-t
测试缓存读取速度;--direct
启用直接 IO(跳过系统缓存,反映真实物理读速);/dev/sda
指定测试硬盘。
- 写速度测试:
dd if=/dev/zero of=/test.dbf bs=1M count=2000 oflag=direct
dd
:文件复制工具;if=/dev/zero
从 “无限空数据设备” 读数据;of=/test.dbf
写入到test.dbf
;bs=1M
块大小 1MB;count=2000
共 2000 块(约 2GB);oflag=direct
直接 IO(跳过缓存,反映真实物理写速)。
- 时间测试:
time dd if=/dev/zero of=/test.dbf bs=1M count=200
time
统计命令耗时;无oflag=direct
时,速度含系统缓存加速,需注意与真实物理速度区分。- 输出解读:
real
为实际总耗时,user
为用户态耗时,sys
为内核态耗时(主要是磁盘 IO 处理时间)。
2.3 内核参数调优(防御 SYN 洪水攻击)
1. 配置文件与参数
- 修改文件:
/etc/sysctl.conf
,添加以下参数:plaintext
net.ipv4.tcp_synack_retries = 0 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_max_syn_backlog = 20480 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 10 fs.file-max = 819200 net.core.somaxconn = 65535 net.core.rmem_max = 1024123000 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 165536 net.ipv4.ip_local_port_range = 10000 65535
- 生效命令:
sysctl -p
(使配置立即生效)。
2. 关键参数说明
tcp_synack_retries = 0
:不重发 SYN+ACK 包,快速释放半连接。tcp_syncookies = 1
:启用 SYN Cookie,防御少量 SYN 洪水攻击。fs.file-max = 819200
:设置系统最大文件句柄数。net.core.somaxconn = 65535
:设置最大连接队列长度。
2.4 扩展:网卡绑定(Bonding)
1. 常用模式
mode=0
:负载均衡,需交换机支持。mode=1
:主备模式,常用(一个网卡故障时自动切换到备用网卡)。mode=4
:LACP 聚合,需交换机支持。
2. 配置命令(主备模式示例)
# 创建bond0连接,指定主备模式、监控间隔、主网卡及IP
nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary ens33 ip4 192.168.1.63/24
# 添加ens33为bond从网卡
nmcli connection add type bond-slave ifname ens33 master bond0
# 添加ens38为bond从网卡
nmcli connection add type bond-slave ifname ens38 master bond0
3. 验证命令
cat /proc/net/bonding/bond0
,查看网卡绑定状态。
2.5 调优模块汇总表
模块 | 调优手段 | 适用场景 |
---|---|---|
CPU | nice、taskset、vmstat | 高 CPU 负载、多进程调度优化 |
磁盘 I/O | ulimit、hdparm、dd | 高并发读写、磁盘速度测试与优化 |
网络 | 网卡 Bonding、内核参数(防 SYN 攻击) | 高可用、负载均衡、网络安全防护 |
内核 | sysctl 参数优化(连接、文件句柄等) | 高并发连接、系统资源限制调整 |
3. 总结
3.1 核心监控工具
CPU
- 负载:
uptime
(1/5/15 分钟负载,超 CPU 核心数需警惕) - 进程:
top
(按 P 排序)、ps -aux --sort -pcpu | head -6
(前 6 高耗进程) - 详情:
mpstat -P ALL 1 5
(各核心使用率)
- 负载:
内存
- 概览:
free -m
(关注 available 列) - 详情:
cat /proc/meminfo
(Active/Inactive) - 进程:
top
(按 M 排序)、ps -aux --sort -rss | head -10
- 概览:
磁盘 I/O
- 信息:XFS 用
xfs_growfs -l
,EXT4 用tune2fs -l
(查块大小) - 统计:
iostat -d -k -p /dev/sda 1 5
(读写速率) - 进程:
iotop -o -d 1
(实时 I/O 进程) - 测试:
dd if=/dev/zero of=testfile bs=1M count=1000; sync
- 信息:XFS 用
网络
- 带宽:
nload
(实时流入 / 流出) - 进程:
nethogs
(各进程占用) - 压测:
ab -n 1000 -c 2 网址
- 带宽:
整体状态
- 实时:
vmstat 1 5
(运行队列、I/O 等待等) - 记录:
sar
(CPU / 内存 / 网络,支持历史查询)
- 实时:
3.2 关键调优手段
CPU
- 优先级:
nice/renice
(-20~19,值小优先级高) - 亲和性:
taskset -c 核心号 进程
(减少切换)
- 优先级:
磁盘 I/O
- 限制:
/etc/security/limits.conf
(设 nofile/nproc 上限) - 测速:
hdparm -t --direct
(读)、time dd
(时间统计)
- 限制:
内核
- 配置:
/etc/sysctl.conf
(防 SYN 攻击:tcp_syncookies=1
;高并发:somaxconn=65535
等) - 生效:
sysctl -p
- 配置: