针对 4核 16G内存的 Linux 服务器,优化性能需要从内核参数、文件系统、应用层配置、监控与调优等多个维度入手。以下是一套系统性的优化方案:
一、内核参数优化(sysctl)
1. 网络相关优化
# 增加 TCP 连接队列长度
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 启用 TCP 快速回收和 TIME_WAIT 复用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 6
# 增大本地端口范围
net.ipv4.ip_local_port_range = 1024 65535
# 启用 TCP 窗口缩放
net.ipv4.tcp_window_scaling = 1
# 禁用 IP 转发(如果不需要路由功能)
net.ipv4.ip_forward = 0
2. 内存管理优化
# 减少交换使用倾向(值越大越不容易 swap)
vm.swappiness = 10
# 提高 inode 缓存效率
vm.vfs_cache_pressure = 50
# 增大文件句柄限制
fs.file-max = 1000000
# 调整脏页写回策略
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
3. CPU 调度优化
# 启用 NO_HZ_IDLE(空闲时停止定时器 tick)
kernel.hz = 100
# 在 systemd 中设置:systemd-tmpfiles --create /etc/tmpfiles.d/nohz.conf
# 或直接在内核启动参数添加:nohz=on idle=poll
生效方式:
sysctl -p /etc/sysctl.conf
二、文件系统优化
1. 挂载选项优化
# ext4/xfs 推荐挂载选项
defaults,noatime,commit=60,data=ordered,discard
# noatime: 避免每次读取都更新访问时间戳
# commit=60: 每60秒同步一次元数据到磁盘,减少 I/O
# data=ordered: 保证数据一致性
# discard: SSD 支持 TRIM(谨慎使用,可能影响寿命)
2. 日志模式选择
- ext4:
data=journal(最安全但慢)、data=ordered(默认平衡)、data=writeback(最快但不安全) - xfs: 默认已较优,无需特殊调整
3. 预读设置
# 查看当前预读值
blockdev --getra /dev/sda
# 增大预读(例如设为 256KB)
blockdev --setra 256 /dev/sda
三、应用层优化
1. Web 服务器(Nginx/Apache)
Nginx 优化示例:
worker_processes auto; # 自动匹配 CPU 核心数
worker_connections 65535; # 每个 worker 最大连接数
multi_accept on; # 接受多个连接请求
use epoll; # 使用 epoll 模型
sendfile on; # 启用 sendfile
tcp_nopush on; # 合并小包发送
tcp_nodelay on; # 禁用 Nagle 算法
keepalive_timeout 65; # 保持连接超时时间
client_max_body_size 50m; # 限制上传大小
Apache 优化(MPM Event/Worker):
StartServers 4
MinSpareThreads 64
MaxSpareThreads 128
ThreadLimit 64
ThreadsPerChild 64
MaxRequestWorkers 256
MaxConnectionsPerChild 0
2. 数据库优化(MySQL/MariaDB)
[mysqld]
# 根据 16G 内存分配缓冲池(建议 70%-80% 内存)
innodb_buffer_pool_size = 10G
# 日志文件大小
innodb_log_file_size = 1G
innodb_log_buffer_size = 16M
# 并发线程数
innodb_thread_concurrency = 0 # 0 表示自适应
# 刷新频率
innodb_flush_log_at_trx_commit = 2 # 每秒刷盘,兼顾性能和安全性
sync_binlog = 1 # 二进制日志同步策略
# 查询缓存(MySQL 5.7+ 已移除,MariaDB 可启用)
query_cache_type = 1
query_cache_size = 256M
3. Java 应用 JVM 优化
-Xms4g -Xmx4g # 堆内存固定为 4G
-XX:+UseG1GC # G1 垃圾回收器
-XX:MaxGCPauseMillis=200 # 最大 GC 暂停时间
-XX:InitiatingHeapOccupancyPercent=35 # 触发并发标记的阈值
-XX:+AlwaysPreTouch # 预先分配内存,避免运行时碎片
-XX:+DisableExplicitGC # 禁用 System.gc()
四、I/O 调度器优化
检查当前调度器:
cat /sys/block/sda/queue/scheduler
推荐配置:
| 存储类型 | 推荐调度器 |
|---|---|
| SSD/NVMe | none 或 mq-deadline |
| HDD | bfq 或 deadline |
# 临时修改
echo "none" > /sys/block/sda/queue/scheduler
# 永久修改:编辑 /etc/default/grub
GRUB_CMDLINE_LINUX="elevator=none"
update-grub
reboot
五、进程与资源限制
1. 用户级文件描述符限制
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
2. systemd 服务限制
# /etc/systemd/system/<service>.service.d/override.conf
[Service]
LimitNOFILE=65535
LimitNPROC=65535
3. CPU 亲和性绑定(可选)
对于关键服务,可将进程绑定到特定 CPU 核心:
taskset -c 0-3 ./my_application
六、监控与持续调优
1. 关键监控指标
# CPU 使用率
top / htop / mpstat
# 内存使用
free -h / vmstat 1
# I/O 性能
iostat -x 1 / iotop
# 网络统计
sar -n DEV 1 / ss -s
# 系统调用延迟
perf stat ./application
2. 定期维护任务
- 清理日志文件(logrotate)
- 更新内核和软件包
- 检查磁盘健康状态(SMART)
- 定期重启以释放内存碎片
七、常见陷阱与注意事项
- 不要过度优化:基准测试验证每一步改动
- Swap 并非完全禁用:保留少量 swap 作为缓冲区
- NUMA 架构注意:多 NUMA 节点需使用
numactl绑定内存和 CPU - 容器环境:Docker/K8s 需额外设置 cgroup 限制和资源隔离
- 安全与性能的平衡:如
tcp_tw_reuse可能在某些场景下带来安全风险
八、一键检查脚本示例
#!/bin/bash
echo "=== CPU Info ==="
lscpu | grep "CPU(s)"
echo "=== Memory Info ==="
free -h
echo "=== Disk I/O Scheduler ==="
for disk in $(lsblk -dn -o NAME); do
echo "$disk: $(cat /sys/block/$disk/queue/scheduler)"
done
echo "=== File Descriptor Limit ==="
ulimit -n
echo "=== Sysctl Network Settings ==="
sysctl net.ipv4.tcp_tw_reuse net.ipv4.tcp_fin_timeout net.core.somaxconn
总结
| 优化方向 | 优先级 | 预期收益 |
|---|---|---|
| 应用层配置 | ⭐⭐⭐⭐⭐ | 最高 |
| 内核网络参数 | ⭐⭐⭐⭐ | 高 |
| 文件系统挂载 | ⭐⭐⭐ | 中等 |
| I/O 调度器 | ⭐⭐⭐ | 中等 |
| 内存管理参数 | ⭐⭐⭐ | 中等 |
| CPU 亲和性 | ⭐⭐ | 特定场景有效 |
最佳实践:先建立基线性能数据 → 逐一优化 → 再次测试对比 → 记录变更。始终在测试环境验证后再应用于生产环境。
轻量云Cloud