Linux系统性能调优实战指南
前言
在生产环境中,Linux系统的性能直接影响着业务的稳定性和用户体验。很多运维人员在面对系统变慢、响应超时等问题时,往往无从下手。本文将从监控工具、CPU、内存、磁盘I/O、网络、内核参数等多个维度,系统性地介绍Linux性能调优的方法论和实战技巧。
本文适用于CentOS 7/8、Ubuntu 18.04/20.04等主流发行版,所有命令均经过实际验证。
一、性能监控:调优的前提
在进行任何调优之前,首先要学会量化系统性能。以下是每个运维工程师必须掌握的监控工具。
1.1 综合性能查看:top & htop
# 基础top命令
top
# 更友好的htop(需要安装)
yum install htop -y # CentOS
apt install htop -y # Ubuntutop命令关键指标解读:
us:用户态CPU使用率(>70%需要关注)sy:内核态CPU使用率(>30%需要关注)wa:I/O等待时间(>5%说明磁盘瓶颈)load average:1/5/15分钟平均负载(超过CPU核心数说明过载)
1.2 内存分析:free & vmstat
# 查看内存使用(人性化显示)
free -h
# 每秒刷新一次,共5次
vmstat 1 5关键内存指标:
available> 20%:内存充足swap used> 0:开始使用交换分区,说明内存紧张si/so> 0:频繁交换,严重影响性能
1.3 磁盘I/O:iostat & iotop
# 安装sysstat工具包
yum install sysstat -y
# 查看磁盘I/O统计
iostat -x 1
# 查看进程I/O使用
iotop1.4 网络监控:ss & netstat & sar
# 查看TCP连接状态
ss -s
ss -tulnp
# 网络流量统计
sar -n DEV 1二、CPU性能调优
2.1 查看CPU信息
# 查看CPU核心数
lscpu | grep 'CPU(s)'
# 查看CPU型号
cat /proc/cpuinfo | grep 'model name' | head -12.2 CPU亲和性绑定
对于关键进程,可以绑定到特定CPU核心,避免上下文切换开销:
# 将进程PID绑定到CPU 0,1,2
taskset -cp 0,1,2
<PID>
# 启动时绑定
taskset -c 0-3 nginx2.3 调整进程优先级
# 启动时设置nice值(-20最高,19最低)
nice -n -10 /path/to/your/program
# 调整已运行进程优先级
renice -10 -p
<PID>2.4 关闭不必要的服务
# 查看开机启动服务
systemctl list-unit-files | grep enabled
# 关闭不需要的服务
systemctl disable postfix
systemctl stop postfix三、内存性能调优
3.1 swappiness参数优化
swappiness决定了系统何时开始使用交换分区:
# 查看当前值
cat /proc/sys/vm/swappiness
# 临时设置(推荐值:10)
sysctl -w vm.swappiness=10
# 永久生效
echo 'vm.swappiness = 10' >> /etc/sysctl.conf
sysctl -p推荐值:
- 内存充足的服务器:
swappiness = 10 - 内存紧张的服务器:
swappiness = 60(默认)
3.2 关闭OOM Killer
对于关键服务,避免被系统误杀:
# 禁止OOM Killer杀死某个进程
echo -1000 > /proc/
<PID>/oom_score_adj
# 在systemd服务中配置
[Service]
OOMScoreAdjust=-10003.3 清除缓存(谨慎使用)
# 清除pagecache
sync && echo 1 > /proc/sys/vm/drop_caches
# 清除dentries和inodes
sync && echo 2 > /proc/sys/vm/drop_caches
# 清除所有缓存
sync && echo 3 > /proc/sys/vm/drop_caches四、磁盘I/O性能调优
4.1 I/O调度器选择
不同场景选择不同的调度算法:
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 临时修改
echo 'deadline' > /sys/block/sda/queue/scheduler
# 永久生效(CentOS)
grubby --update-kernel=ALL --args="elevator=deadline"调度器选择建议:
- SSD磁盘:
none或noop - 机械磁盘:
deadline(数据库)或cfq(通用)
4.2 文件系统挂载优化
编辑 /etc/fstab:
# EXT4优化
UUID=xxx /data ext4 defaults,noatime,nodiratime,barrier=0 0 0
# XFS优化
UUID=xxx /data xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0参数说明:
noatime:禁止记录访问时间,减少磁盘写入nodiratime:禁止记录目录访问时间barrier=0:关闭写入屏障,提高性能(有数据丢失风险)
4.3 提高文件描述符限制
# 临时生效
ulimit -n 65535
# 永久生效,编辑 /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535五、网络性能调优
5.1 TCP内核参数优化
编辑 /etc/sysctl.conf:
# 基本网络优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# TCP优化
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_tw_buckets = 5000
# TCP缓冲区优化
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 启用TCP复用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1应用配置:
sysctl -p5.2 连接跟踪优化(高并发场景)
# 查看连接跟踪数
cat /proc/sys/net/netfilter/nf_conntrack_count
# 调大最大值
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 36005.3 网卡多队列优化
# 查看网卡队列数
ethtool -l eth0
# 设置多队列
ethtool -L eth0 combined 8六、Nginx Web服务器优化
6.1 核心配置优化
# worker进程数(建议等于CPU核心数)
worker_processes auto;
# 绑定CPU
worker_cpu_affinity auto;
# 每个worker的最大连接数
events {
worker_connections 65535;
use epoll;
multi_accept on;
}
http {
# 文件传输优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 超时优化
keepalive_timeout 65;
client_header_timeout 10;
client_body_timeout 10;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss;
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}6.2 隐藏版本号
server_tokens off;
proxy_hide_header X-Powered-By;七、MySQL数据库优化
7.1 关键配置(my.cnf)
[mysqld]
# 内存配置(约为物理内存的50-70%)
innodb_buffer_pool_size = 4G
innodb_log_file_size = 1G
# 连接配置
max_connections = 500
wait_timeout = 600
interactive_timeout = 600
# 查询缓存(MySQL 8.0已移除)
query_cache_type = 0
query_cache_size = 0
# InnoDB优化
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2八、实战案例:高并发Web服务器调优
场景描述
- 4核8G云服务器
- Nginx + PHP-FPM + MySQL
- 日PV 100万+
完整调优脚本
#!/bin/bash
# Linux性能调优脚本
echo "=== 开始系统调优 ==="
# 1. 文件描述符限制
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
EOF
# 2. 内核参数优化
cat >> /etc/sysctl.conf << EOF
# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 网络优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
EOF
sysctl -p
# 3. 关闭不必要的服务
systemctl disable postfix
systemctl disable firewalld
systemctl stop postfix
systemctl stop firewalld
echo "=== 调优完成,请重启服务器生效 ==="九、调优原则与注意事项
9.1 黄金法则
- 先监控,后调优:没有数据支撑的调优都是瞎调
- 小步快跑:一次只改一个参数,观察效果
- 基准测试:调优前后都要进行性能对比
- 留有余量:不要把资源用到100%
9.2 常见误区
❌ 错误:盲目调大所有参数 ✅ 正确:根据实际负载和硬件配置调整
❌ 错误:直接复制网上的配置 ✅ 正确:理解每个参数的含义后再使用
❌ 错误:生产环境直接测试 ✅ 正确:先在测试环境验证
总结
Linux性能调优是一门实践艺术,没有放之四海而皆准的标准答案。本文介绍的方法论和参数只是起点,真正的高手需要:
- 深入理解原理:知其然更知其所以然
- 积累实战经验:在不同场景中总结规律
- 建立监控体系:及时发现性能瓶颈
- 持续迭代优化:业务在变,调优也要跟进
希望本文能帮助你建立系统化的性能调优思维框架。记住:最好的性能优化就是——在设计阶段就考虑性能。
参考资料:
- Linux Kernel Documentation
- Red Hat Performance Tuning Guide
- Nginx Official Documentation