目录
[1. 基础工具](#1. 基础工具)
[2. 高级工具](#2. 高级工具)
[1. CPU优化](#1. CPU优化)
[2. 内存优化](#2. 内存优化)
[3. 磁盘I/O优化](#3. 磁盘I/O优化)
[4. 网络优化](#4. 网络优化)
[1. ulimit](#1. ulimit)
[2. cgroups(控制组)](#2. cgroups(控制组))
一、性能优化概述
-
目标:提升系统响应速度、资源利用率,避免瓶颈。
-
核心原则:
-
监控先行:先分析瓶颈,再针对性优化。
-
逐步调整:避免一次性修改过多参数。
-
稳定性优先:优化后需充分测试。
-
二、性能监控工具
1. 基础工具
-
top
/htop
top # 实时查看CPU、内存、进程 htop # 增强版(支持鼠标操作)
- 关键指标 :
%CPU
(CPU占用)、%MEM
(内存占用)、LOAD AVERAGE
(系统负载)。
- 关键指标 :
-
vmstat
vmstat 1 # 每秒输出一次系统状态
-
关键列:
-
r
:等待CPU的进程数(> CPU核数表示过载)。 -
si
/so
:Swap交换频率(频繁交换说明内存不足)。
-
-
-
iostat
iostat -xz 1 # 查看磁盘I/O
- 关键指标 :
%util
(磁盘利用率 >80% 表示瓶颈)、await
(I/O等待时间)。
- 关键指标 :
-
netstat
/ss
netstat -ant | grep ESTABLISHED | wc -l # 查看TCP连接数 ss -s # 统计套接字信息
2. 高级工具
-
sar
(系统活动报告)sar -u 1 3 # 查看CPU使用率(每秒1次,共3次) sar -r # 查看内存使用历史
-
dstat
dstat -cmsn # 综合监控CPU、内存、网络、磁盘
三、子系统优化策略
1. CPU优化
-
调整进程优先级
nice -n 19 ./script.sh # 启动低优先级进程 renice 19 -p PID # 修改运行中进程的优先级
-
绑定CPU核心(减少上下文切换)
taskset -c 0,1 ./program # 绑定到CPU0和CPU1
-
内核参数调整
# 修改/etc/sysctl.conf kernel.sched_child_runs_first = 1 # 子进程优先调度
2. 内存优化
-
调整Swap使用策略
# 修改/etc/sysctl.conf vm.swappiness = 10 # 降低Swap使用倾向(0-100,默认60) vm.vfs_cache_pressure = 50 # 减少inode缓存回收频率
-
禁用透明大页(THP)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
3. 磁盘I/O优化
-
选择合适I/O调度器
# 查看当前调度器 cat /sys/block/sda/queue/scheduler # 临时修改为deadline调度器(适用于SSD) echo deadline > /sys/block/sda/queue/scheduler
-
文件系统优化(ext4)
# 挂载参数:noatime(不记录访问时间), data=writeback UUID=xxx / ext4 defaults,noatime,data=writeback 0 1
4. 网络优化
-
TCP参数调优
# 修改/etc/sysctl.conf net.core.somaxconn = 4096 # 提高连接队列长度 net.ipv4.tcp_fin_timeout = 30 # 缩短TIME_WAIT超时 net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME_WAIT连接
sysctl -p # 应用配置
-
限制连接数
# 使用iptables限制单IP连接数 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP
四、资源限制优化
1. ulimit
-
修改用户级限制
# 编辑/etc/security/limits.conf * soft nofile 65535 # 文件描述符软限制 * hard nofile 65535 # 硬限制
-
生效方式 :重启会话或执行
ulimit -n 65535
。
2. cgroups(控制组)
-
限制进程资源
# 创建cgroup(需安装cgroup-tools) cgcreate -g cpu,memory:/my_group # 限制CPU使用为50% cgset -r cpu.cfs_period_us=100000 -r cpu.cfs_quota_us=50000 my_group # 限制内存为1GB cgset -r memory.limit_in_bytes=1G my_group # 将进程加入cgroup cgexec -g cpu,memory:my_group ./program
五、安全与注意事项
-
备份配置文件 :修改前备份
/etc/sysctl.conf
、/etc/security/limits.conf
。 -
灰度测试:先在测试环境验证参数调整效果。
-
避免过度优化:如无明确瓶颈,优先使用默认配置。
六、综合案例
案例1:TCP连接数过高导致Web服务卡顿
问题描述
Nginx服务器在高并发时出现 Too many open files
错误,TCP连接数超过默认限制。
优化配置
-
修改文件描述符限制
# 编辑 /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 nginx soft nofile 65535 # 针对Nginx用户单独设置
-
调整Nginx配置
# /etc/nginx/nginx.conf worker_rlimit_nofile 65535; # 与limits.conf一致 events { worker_connections 4096; # 每个Worker进程连接数 }
-
内核TCP参数优化
# 编辑 /etc/sysctl.conf net.core.somaxconn = 65535 # 最大连接队列 net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列长度 net.ipv4.tcp_tw_reuse = 1 # 重用TIME_WAIT连接 net.ipv4.tcp_fin_timeout = 30 # 缩短FIN超时
sysctl -p # 生效配置
验证方法
ss -lnt | grep 'LISTEN' # 查看监听队列长度
cat /proc/$(pidof nginx)/limits | grep 'open files' # 确认Nginx进程限制
案例2:Java应用内存溢出导致系统崩溃
问题描述
Tomcat服务频繁触发OOM(Out of Memory),且系统Swap使用率过高。
优化配置
-
限制JVM堆内存
# 修改Tomcat启动脚本 catalina.sh export JAVA_OPTS="-Xms2G -Xmx2G -XX:MaxMetaspaceSize=512M"
-
调整系统Swap策略
# 编辑 /etc/sysctl.conf vm.swappiness = 10 # 降低Swap使用倾向 vm.overcommit_memory = 1 # 允许超量分配内存(谨慎使用)
-
使用cgroups限制内存
# 创建内存限制组 cgcreate -g memory:/tomcat cgset -r memory.limit_in_bytes=4G /tomcat cgset -r memory.memsw.limit_in_bytes=6G /tomcat # 物理内存+Swap总限制 # 启动Tomcat cgexec -g memory:tomcat /opt/tomcat/bin/startup.sh
验证方法
free -h # 查看内存和Swap使用
ps aux | grep tomcat # 确认cgroup限制生效
cat /sys/fs/cgroup/memory/tomcat/memory.usage_in_bytes # 查看内存占用
案例3:磁盘I/O延迟导致数据库性能下降
问题描述
MySQL读写缓慢,iostat
显示磁盘 %util
持续高于90%。
优化配置
-
切换I/O调度器
# 临时切换为deadline调度器(SSD推荐) echo deadline > /sys/block/sda/queue/scheduler # 永久生效(GRUB配置) vi /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline" update-grub # Debian/Ubuntu grub2-mkconfig -o /boot/grub2/grub.cfg # CentOS/RHEL
-
调整文件系统挂载参数
# 编辑 /etc/fstab UUID=xxxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2
-
MySQL配置优化
# /etc/my.cnf innodb_flush_method = O_DIRECT # 绕过内核缓存 innodb_io_capacity = 2000 # SSD建议值 innodb_buffer_pool_size = 8G # 分配足够缓冲池
验证方法
cat /sys/block/sda/queue/scheduler # 确认调度器
iostat -xm 1 # 观察%util和await变化
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%'; # 查看缓冲池命中率
案例4:CPU竞争导致多线程应用性能差
问题描述
Python多进程数据处理程序运行缓慢,top
显示CPU在多个核心间频繁切换。
优化配置
-
绑定进程到特定CPU核心
# 使用taskset绑定到CPU0-3 taskset -c 0-3 python3 data_processing.py
-
调整进程优先级
nice -n -20 python3 high_priority_task.py # 最高优先级(需root) renice -n 19 -p 1234 # 将运行中的PID=1234进程设为低优先级
-
禁用CPU节能模式
# 安装cpufrequtils(Debian/Ubuntu) apt install cpufrequtils # 设置为性能模式 cpufreq-set -g performance -c 0 # 对每个CPU核心执行
验证方法
mpstat -P ALL 1 # 查看各核心利用率
cpufreq-info # 确认当前CPU频率策略
案例5:网络丢包导致视频流传输卡顿
问题描述
视频流服务器在传输大流量UDP数据时出现丢包,sar -n UDP 1
显示 idgm/s
(输入数据报)超过网卡处理能力。
优化配置
-
增大Socket缓冲区
# 编辑 /etc/sysctl.conf net.core.rmem_max = 67108864 # 接收缓冲区最大值(64MB) net.core.wmem_max = 67108864 # 发送缓冲区最大值 net.core.netdev_max_backlog = 500000 # 网卡队列长度
-
多队列网卡优化
# 启用RSS(Receive Side Scaling) ethtool -L eth0 combined 8 # 设置8个队列(需网卡支持) # 绑定IRQ到不同CPU核心 vi /etc/rc.local /usr/bin/irqbalance --powerthresh=50 # 启用IRQ平衡
-
应用层优化(FFmpeg示例)
ffmpeg -i input -c copy -f mpegts udp://target:1234?buffer_size=4194304 # 增大发送缓冲区
验证方法
ethtool -S eth0 | grep rx_dropped # 查看丢包统计
sar -n UDP 1 # 监控UDP报文状态
cat /proc/interrupts | grep eth0 # 确认IRQ分布
总结:优化配置原则
-
精准定位瓶颈:
-
使用
perf top
分析CPU热点。 -
通过
dmesg
检查内核OOM或I/O错误日志。
-
-
层级化调整:
层级 工具/方法 应用层 代码优化、连接池配置 运行时 JVM参数、Golang GC策略 操作系统 sysctl、cgroups、ulimit 硬件/驱动 升级SSD、调整RAID级别 -
自动化监控:
# 使用Prometheus + Grafana监控模板 - node_exporter 采集系统指标 - alertmanager 配置CPU/内存阈值告警
附:配置修改注意事项
-
备份原始文件:
cp /etc/sysctl.conf /etc/sysctl.conf.bak
-
分阶段生效:
-
优先通过
sysctl -w
临时修改测试。 -
确认稳定后写入配置文件。
-
-
回归测试:
ab -n 10000 -c 500 http://localhost/ # ApacheBench压力测试 iperf3 -c target_ip -t 60 # 网络带宽测试
附:常用命令速查表
命令 | 作用 |
---|---|
sar -u 1 3 |
查看CPU使用率 |
vmstat 1 |
监控内存和进程队列 |
iostat -xz 1 |
分析磁盘I/O瓶颈 |
ss -s |
统计TCP连接状态 |