一、为什么需要优化Linux默认配置

刚装好的Linux系统就像一辆没调校的新车,虽然能开,但要想飙起来还得动点手脚。默认配置为了兼顾各种场景,往往采取保守策略:文件描述符数量限制、Swappiness值偏高、磁盘调度算法未必最优……这些都会让服务器在高负载时表现不佳。

举个例子,某电商大促时API响应突然变慢,排查发现是系统默认的fs.file-max = 78692导致Nginx报"Too many open files"错误。通过优化后,单机QPS从800提升到2400:

# 查看当前文件描述符限制
ulimit -n  # 用户级限制
cat /proc/sys/fs/file-max  # 系统级限制

# 永久修改配置(CentOS 7示例)
echo "fs.file-max = 1000000" >> /etc/sysctl.conf
echo "* soft nofile 1000000" >> /etc/security/limits.conf
sysctl -p  # 立即生效

二、内存与交换空间的黄金法则

Linux内存管理有个反直觉现象:空闲内存越少不代表性能差。内核的Page Cache机制会主动利用空闲内存加速磁盘IO,但错误的Swappiness设置可能导致频繁交换,引发性能断崖。

关键参数调优:

# 将vm.swappiness从默认的60降到10(针对数据库服务器)
sysctl vm.swappiness=10

# 禁止交换分区(适用于内存充足场景)
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab

# 透明大页禁用(Oracle/MySQL场景常见问题)
echo never > /sys/kernel/mm/transparent_hugepage/enabled

某MongoDB集群在负载测试时出现周期性卡顿,最终发现是透明大页与NUMA没优化导致的。调整后尾延迟降低40%:

# 检查NUMA状态
numactl --hardware

# 启动时关闭NUMA(在grub配置中添加)
numa=off

三、磁盘IO的隐藏陷阱

默认的CFQ调度器在SSD时代已成瓶颈,deadline/noop调度器更适合现代硬件。EXT4/XFS的默认挂载参数也可能拖慢你的数据库:

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# 永久修改为deadline(SSD推荐)
echo 'ACTION=="add|change", KERNEL=="sd*", ATTR{queue/scheduler}="deadline"' > /etc/udev/rules.d/60-ioscheduler.rules

# 优化MySQL服务器的挂载选项(/etc/fstab示例)
UUID=xxx /data xfs noatime,nodiratime,nobarrier,logbsize=256k 0 0

曾有个PostgreSQL实例的UPDATE性能比预期慢3倍,最后发现是默认的vm.dirty_ratio=20导致大量写缓冲堆积。调整为更激进的值后TPS提升210%:

# 控制脏页刷新阈值
sysctl vm.dirty_ratio=10
sysctl vm.dirty_background_ratio=5

四、网络栈的极速狂飙

当你的应用需要处理10万+并发连接时,默认的1024个本地端口范围显然不够用。TCP参数优化能显著降低高并发下的延迟:

# 扩大临时端口范围
echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf

# 应对TIME_WAIT问题(高频短连接服务必备)
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_tw_buckets = 180000" >> /etc/sysctl.conf

# 提升队列长度防御SYN Flood
sysctl net.core.somaxconn=32768
sysctl net.ipv4.tcp_max_syn_backlog=8192

某直播平台在流量突增时出现大量连接超时,通过优化以下参数解决:

# 加快TCP故障检测
sysctl net.ipv4.tcp_keepalive_time=600
sysctl net.ipv4.tcp_fin_timeout=30

# 启用BBR拥塞控制(替代默认的cubic)
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

五、实战:全链路优化案例

给一个4核8G的Nginx+PHP服务器做全套优化:

  1. 内核参数调优
# /etc/sysctl.conf 关键修改
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_syncookies = 0  # 高并发时禁用
vm.min_free_kbytes = 65536   # 避免OOM杀手误杀
  1. 服务级优化
; php-fpm.conf 调整
pm = dynamic
pm.max_children = 200
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 50
  1. 硬件级配合
# 关闭节能模式(服务器必做)
cpupower frequency-set --governor performance

# 中断均衡(多队列网卡优化)
irqbalance --oneshot

六、避坑指南与监控之道

优化不是一劳永逸,需要持续监控:

  • 危险操作

    • 随意修改vm.overcommit_memory可能导致OOM
    • 过度减小vm.swappiness会触发内存耗尽
  • 推荐监控项

    # 实时查看瓶颈
    dstat -tcmnd --disk-util --top-bio
    perf top -g  # 函数级性能分析
    
  • 自动化工具

    # 使用tuned优化方案(CentOS)
    yum install tuned
    tuned-adm profile throughput-performance
    

记住:所有修改都要通过sysctl -p或重启验证,并在测试环境充分验证后再上线生产环境。