Linux系统性能优化实战:从内核参数到应用调优
前言
在日常运维工作中,系统性能优化是一个永恒的话题。一台未经优化的Linux服务器与经过精心调优的服务器,在相同硬件条件下性能差距可达数倍。本文将从内核参数、文件系统、内存管理、CPU调度和I/O等多个维度,系统性地介绍Linux性能优化的实战技巧。
一、性能分析工具链
在动手优化之前,首先要建立完善的性能监控和分析体系。
1.1 基础监控命令
# CPU使用情况
top -b -n 1 | head -20
mpstat -P ALL 1 5
# 内存使用
free -h
vmstat 1 10
# I/O性能
iostat -x 1 5
iotop -o
# 网络性能
sar -n DEV 1 5
iftop -i eth0
1.2 综合性能分析工具
| 工具 | 用途 | 安装方式 |
|---|---|---|
perf |
CPU性能分析 | yum install perf |
strace |
系统调用追踪 | 系统自带 |
lsof |
文件/端口查看 | yum install lsof |
sysbench |
基准测试 | yum install sysbench |
dstat |
全能监控 | yum install dstat |
二、内核参数调优
内核参数是系统性能的基石。通过调整 /etc/sysctl.conf 中的参数,可以显著提升系统吞吐量。
2.1 网络相关参数
# TCP连接优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# TIME_WAIT复用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
# TCP keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
2.2 内存与文件系统
# Swappiness - 降低swap使用倾向
vm.swappiness = 10
# 脏页刷新策略
vm.dirty_ratio = 30
vm.dirty_background_ratio = 5
# 文件描述符上限
fs.file-max = 6553560
fs.nr_open = 1048576
2.3 立即生效
sysctl -p
三、文件系统与磁盘优化
3.1 选择合适的文件系统
- XFS:适合大文件场景(日志、数据库)
- ext4:通用场景,稳定可靠
- btrfs:需要快照、压缩等高级特性
3.2 挂载参数优化
# /etc/fstab 挂载选项
UUID=xxx /data xfs defaults,noatime,nodiratime,nobarrier 0 0
noatime:禁止更新文件访问时间,减少写操作nodiratime:禁止更新目录访问时间nobarrier:禁用写屏障(有UPS/BBU时)
3.3 磁盘调度算法
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# SSD使用noop或none
echo noop > /sys/block/sda/queue/scheduler
# HDD使用deadline
echo deadline > /sys/block/sda/queue/scheduler
四、应用程序层面优化
4.1 进程优先级管理
# 调整nice值(-20最高优先级,19最低)
nice -n -10 ./critical-app
renice -n -10 -p 12345
4.2 资源限制设置
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
4.3 使用Systemd资源控制
# /etc/systemd/system/myapp.service
[Service]
CPUQuota=200%
MemoryLimit=2G
TasksMax=512
五、实战案例分析
案例1:Web服务器响应缓慢
问题现象:Nginx服务器响应时间从50ms上升到500ms
排查过程:
- 使用
top发现CPUwa(IO等待)高达40% iostat -x 1发现磁盘await超过100msiotop定位到MySQL大量写操作
解决方案:
# 调整MySQL刷盘策略
# my.cnf
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
sync_binlog = 0
案例2:内存泄漏导致OOM
排查命令:
# 查看OOM日志
dmesg | grep -i oom
grep -i "out of memory" /var/log/messages
# 按内存排序进程
ps aux --sort=-%mem | head -20
# 查看进程内存详情
pmap -x 12345
总结
系统优化是一个循序渐进的过程,切忌盲目调参。建议遵循以下原则:
- 测量先行:优化前建立性能基线
- 单点变更:每次只改一个参数,观察效果
- 文档记录:详细记录每次变更和效果
- 灰度验证:先在测试环境验证,再上线
- 持续监控:优化后持续观察指标变化
优化的最高境界不是参数调得多高,而是让系统在现有资源下达到最佳运行状态。