Linux 内核调优:从系统参数到性能优化 内核参数调优 内存管理 虚拟内存参数 应用配置 网络栈优化 TCP 参数 网络性能优化 文件系统优化 ext4 优化 XFS 优化 文件描述符限制 进程调度优化 CPU 调度器 进程优先级 I/O 调度 I/O 调度算法 CFQ(完全公平队列) Deadline(截止时间) NOOP(无操作) I/O 调度优化 增加队列深度 调整 I/O 调度器参数 CPU 优化 CPU 频率调节 cpufreq 调节器 CPU 亲和性 中断优化 中断负载均衡 禁用不必要的硬件 网络优化 网络接口优化 增加网络缓冲区 启用 GRO/GSO 连接跟踪优化 监控与调优 性能监控工具 perf(性能分析) iostat(I/O 统计) vmstat(虚拟内存统计)
# /etc/sysctl.conf # 虚拟内存:降低 swap 使用倾向 vm.swappiness=10 # 脏页回写:降低延迟 vm.dirty_ratio=10 vm.dirty_background_ratio=5 vm.dirty_expire_centisecs=3000 vm.dirty_writeback_centisecs=500 # 巨页内存 vm.nr_hugepages=128 vm.hugetlb_shm_group=1001 # 内存过载保护 vm.overcommit_memory=1 vm.overcommit_ratio=50
# 立即生效 sysctl -w vm.swappiness=10 # 永久生效 echo "vm.swappiness=10" >> /etc/sysctl.conf sysctl -p
# /etc/sysctl.conf # TCP 连接队列 net.core.somaxconn=65535 net.ipv4.tcp_max_syn_backlog=8192 # TCP keepalive net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_intvl=30 net.ipv4.tcp_keepalive_probes=3 # TCP 超时 net.ipv4.tcp_fin_timeout=30 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle=0 # TCP 缓冲区 net.ipv4.tcp_rmem=4096 87380 16777216 net.ipv4.tcp_wmem=4096 65536 16777216 net.core.rmem_max=16777216 net.core.wmem_max=16777216 # TCP 窗口缩放 net.ipv4.tcp_window_scaling=1 net.ipv4.tcp_sack=1
# 增加 TCP 队列长度 net.core.netdev_max_backlog=16384 # 快速回收 TIME_WAIT sockets net.ipv4.tcp_tw_reuse=1 # 启用 TCP Fast Open net.ipv4.tcp_fastopen=3 # 禁用 TCP 慢启动 net.ipv4.tcp_slow_start_after_idle=0
# 挂载选项 mount -t ext4 -o noatime,nodiratime,data=writeback /dev/sda1 /mnt # /etc/fstab /dev/sda1 /mnt ext4 defaults,noatime,nodiratime,data=writeback 0 0
# 挂载选项 mount -t xfs -o nobarrier,logbufs=8 /dev/sda1 /mnt # 调整日志缓冲区 xfs_growfs -l logbufs=8 /mnt
# /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 # /etc/sysctl.conf fs.file-max=2097152
# 查看 CPU 调度器 cat /sys/block/sda/queue/scheduler # 设置为 deadline(适合数据库) echo deadline > /sys/block/sda/queue/scheduler # 设置为 cfq(适合桌面) echo cfq > /sys/block/sda/queue/scheduler
# nice 值:-20(最高优先级)到 19(最低优先级) nice -n -5 ./high_priority_app # 调整运行中进程的优先级 renice -n -5 -p 1234 # ionice:I/O 优先级 ionice -c 1 -n 0 ./io_intensive_app
# 适合桌面和多用户系统 echo cfq > /sys/block/sda/queue/scheduler # 配置 echo 8 > /sys/block/sda/queue/iosched/quantum echo 100 > /sys/block/sda/queue/iosched/slice_idle
# 适合数据库和实时应用 echo deadline > /sys/block/sda/queue/scheduler # 配置 echo 500 > /sys/block/sda/queue/iosched/read_expire echo 5000 > /sys/block/sda/queue/iosched/write_expire
# 适合 SSD 和 RAID echo noop > /sys/block/sda/queue/scheduler
# 增加请求队列大小 echo 4096 > /sys/block/sda/queue/nr_requests
# 调整 cfq 组 echo 2 > /sys/block/sda/queue/iosched/group_isolation echo 1 > /sys/block/sda/queue/iosched/group_idle
# 查看可用调节器 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors # 设置为 performance(最高性能) echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor # 设置为 ondemand(按需调节) echo ondemand > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor # 设置为 powersave(节能) echo powersave > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 绑定进程到特定 CPU taskset -c 0,1 ./myapp # 查看进程 CPU 亲和性 taskset -c -p 1234 # 修改运行中进程的亲和性 taskset -p -c 2,3 1234
# 查看中断分布 cat /proc/interrupts # 设置中断亲和性 echo 2 > /proc/irq/24/smp_affinity # 使用 irqbalance 自动平衡 service irqbalance start
# 禁用 NMI watchdog echo 0 > /proc/sys/kernel/nmi_watchdog # 禁用 CPU 休眠 echo 1 > /sys/devices/system/cpu/smt/control
# 增加套接字缓冲区 net.core.rmem_max=134217728 net.core.wmem_max=134217728 # 调整 TCP 缓冲区 net.ipv4.tcp_rmem=4096 87380 67108864 net.ipv4.tcp_wmem=4096 65536 67108864
# 启用 Generic Receive Offload ethtool -K eth0 gro on # 启用 Generic Segmentation Offload ethtool -K eth0 gso on # 启用 Large Receive Offload ethtool -K eth0 lro on
# 增加连接跟踪表大小 net.netfilter.nf_conntrack_max=262144 # 减少连接跟踪超时 net.netfilter.nf_conntrack_tcp_timeout_established=7200 net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
# CPU 性能分析 perf top # 记录性能数据 perf record -g ./myapp perf report # 火焰图生成 perf script | stackcollapse-perf.pl | flamegraph.pl > flamegraph.svg
# 查看磁盘 I/O iostat -x 1 # 查看特定设备 iostat -x 1 -p sda
# 查看虚拟内存统计 vmstat 1 # 查看详细信息 vmstat -s
# 安装 tuned yum install tuned # 启动服务 systemctl start tuned systemctl enable tuned # 查看可用配置 tuned-adm list # 应用性能配置 tuned-adm profile throughput-performance # 应用延迟配置 tuned-adm profile latency-performance
# 列出所有参数 sysctl -a # 加载配置 sysctl -p /etc/sysctl.conf # 测试参数 sysctl -w vm.swappiness=10
# 使用 sysbench sysbench cpu --threads=4 --time=60 run # 使用 stress stress --cpu 4 --timeout 60s
# 使用 sysbench sysbench memory --threads=4 --memory-block-size=1K --memory-total-size=10G run # 使用 memtester memtester 1G 5
# 使用 fio fio --name=random-write --ioengine=libaio --iodepth=1 \ --rw=randwrite --bs=4k --direct=1 --size=512M --numjobs=4 \ --runtime=60 --time_based --group_reporting --filename=fio-test-file # 使用 dd dd if=/dev/zero of=testfile bs=1M count=1024 oflag=direct
# 使用 iperf3 iperf3 -s # 服务器 iperf3 -c server_ip # 客户端 # 使用 netperf netserver # 服务器 netperf -H server_ip # 客户端
# 查看进程 CPU 使用 top -p PID # 查看 CPU 使用详情 pidstat -p PID 1 # 查看 CPU 性能计数器 perf stat -p PID
# 查看进程内存使用 ps -o pid,vsz,rss,comm -p PID # 使用 valgrind 检测内存泄漏 valgrind --leak-check=full --show-leak-kinds=all ./myapp # 使用 smem 分析内存 smem --pid PID -c name,pss,uss
# 查看 I/O 等待 iostat -x 1 # 查看 I/O 栈 blktrace -d /dev/sda -o - | blkparse -i - # 使用 iosnoop 追踪 I/O iosnoop
# 测试延迟 ping -c 100 example.com # 查看网络统计 netstat -s # 抓包分析 tcpdump -i eth0 -w capture.pcap
Linux 内核调优是系统性能优化的重要环节:
记住:调优需要根据实际应用场景进行,没有万能的配置!