一、为什么需要优化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服务器做全套优化:
- 内核参数调优
# /etc/sysctl.conf 关键修改
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_syncookies = 0 # 高并发时禁用
vm.min_free_kbytes = 65536 # 避免OOM杀手误杀
- 服务级优化
; php-fpm.conf 调整
pm = dynamic
pm.max_children = 200
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 50
- 硬件级配合
# 关闭节能模式(服务器必做)
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或重启验证,并在测试环境充分验证后再上线生产环境。
评论