Linux系统性能调优实战指南

· 阅读约需17分钟

前言

在生产环境中,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    # Ubuntu

top命令关键指标解读:

  • 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使用
iotop

1.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 -1

2.2 CPU亲和性绑定

对于关键进程,可以绑定到特定CPU核心,避免上下文切换开销:

# 将进程PID绑定到CPU 0,1,2
taskset -cp 0,1,2 
<PID>

# 启动时绑定
taskset -c 0-3 nginx

2.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=-1000

3.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磁盘nonenoop
  • 机械磁盘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 -p

5.2 连接跟踪优化(高并发场景)

# 查看连接跟踪数
cat /proc/sys/net/netfilter/nf_conntrack_count

# 调大最大值
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 3600

5.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 黄金法则

  1. 先监控,后调优:没有数据支撑的调优都是瞎调
  2. 小步快跑:一次只改一个参数,观察效果
  3. 基准测试:调优前后都要进行性能对比
  4. 留有余量:不要把资源用到100%

9.2 常见误区

错误:盲目调大所有参数 ✅ 正确:根据实际负载和硬件配置调整

错误:直接复制网上的配置 ✅ 正确:理解每个参数的含义后再使用

错误:生产环境直接测试 ✅ 正确:先在测试环境验证


总结

Linux性能调优是一门实践艺术,没有放之四海而皆准的标准答案。本文介绍的方法论和参数只是起点,真正的高手需要:

  1. 深入理解原理:知其然更知其所以然
  2. 积累实战经验:在不同场景中总结规律
  3. 建立监控体系:及时发现性能瓶颈
  4. 持续迭代优化:业务在变,调优也要跟进

希望本文能帮助你建立系统化的性能调优思维框架。记住:最好的性能优化就是——在设计阶段就考虑性能


参考资料:

  • Linux Kernel Documentation
  • Red Hat Performance Tuning Guide
  • Nginx Official Documentation