内核性能优化

核心知识点

1. 内核性能优化概述

1.1 内核性能的重要性

内核性能是指 Linux 内核处理系统请求和管理资源的效率。优化内核性能可以:

  • 提高系统响应速度:减少系统调用和资源管理的延迟
  • 增加系统吞吐量:提高系统处理并发请求的能力
  • 降低系统资源使用:减少 CPU、内存、磁盘和网络的使用
  • 改善应用程序性能:为应用程序提供更好的运行环境
  • 延长硬件寿命:减少硬件的负载和磨损

1.2 内核性能瓶颈的识别

常见的内核性能瓶颈

  • CPU 瓶颈:CPU 使用率过高,处理能力不足
  • 内存瓶颈:内存不足,频繁发生页面置换
  • 磁盘 I/O 瓶颈:磁盘读写速度慢,I/O 操作等待时间长
  • 网络瓶颈:网络带宽不足,网络延迟高
  • 内核锁竞争:多个进程或线程竞争内核锁,导致阻塞
  • 系统调用开销:频繁的系统调用增加内核开销

识别性能瓶颈的方法

  • 使用性能分析工具:如 top、vmstat、iostat、netstat、perf 等
  • 监控系统资源使用:监控 CPU、内存、磁盘和网络的使用情况
  • 分析系统日志:查看系统日志中的性能相关信息
  • 使用追踪工具:如 ftrace、systemtap、lttng 等追踪内核行为
  • 压力测试:使用压力测试工具模拟高负载场景

2. 性能分析工具

2.1 系统级性能分析工具

top/htop

实时监控系统的 CPU、内存、进程等使用情况。

# 运行 top
top

# 运行 htop(需要安装)
htop

# 常用快捷键:
# 1: 显示所有 CPU 核心
# M: 按内存使用排序
# P: 按 CPU 使用排序
# T: 按运行时间排序
# k: 终止进程
# q: 退出

vmstat

监控虚拟内存、进程、CPU 活动等系统状态。

# 运行 vmstat,每秒刷新一次
vmstat 1

# 输出解释:
# procs: 进程状态
# memory: 内存使用
# swap: 交换区使用
# io: I/O 操作
# system: 系统调用
# cpu: CPU 使用

iostat

监控磁盘 I/O 性能。

# 运行 iostat,每秒刷新一次,显示扩展信息
iostat -x 1

# 输出解释:
# tps: 每秒传输次数
# kB_read/s: 每秒读取的千字节数
# kB_wrtn/s: 每秒写入的千字节数
# r/s, w/s: 每秒读/写次数
# avgqu-sz: 平均 I/O 队列长度
# await: 平均 I/O 等待时间
# svctm: 平均服务时间
# %util: 设备利用率

netstat/ss

监控网络连接和网络统计信息。

# 运行 netstat,显示所有连接
netstat -ant

# 运行 ss,显示所有连接
ss -ant

# 查看网络统计信息
netstat -s
ss -s

mpstat

监控每个 CPU 核心的使用情况。

# 运行 mpstat,每秒刷新一次
mpstat -P ALL 1

# 输出解释:
# CPU: CPU 核心编号
# %usr: 用户空间 CPU 使用率
# %nice:  nice 进程 CPU 使用率
# %sys: 系统空间 CPU 使用率
# %iowait: I/O 等待 CPU 使用率
# %irq: 中断处理 CPU 使用率
# %soft: 软中断处理 CPU 使用率
# %steal: 虚拟化环境中被窃取的 CPU 使用率
# %guest: 运行虚拟机的 CPU 使用率
# %idle: 空闲 CPU 使用率

2.2 内核级性能分析工具

perf

内核内置的性能分析工具,可以分析系统的性能瓶颈。

# 安装 perf
sudo apt-get install linux-tools-common  # Ubuntu/Debian
sudo yum install perf                    # CentOS/RHEL

# 查看系统整体性能
perf top

# 记录性能数据
perf record -a -g sleep 10

# 分析性能数据
perf report

# 分析特定事件
perf stat -e cycles,instructions,cache-references,cache-misses ./program

# 追踪特定函数
perf record -g -p <pid> -e cpu-clock
tperf report

ftrace

内核内置的追踪工具,可以追踪内核函数的调用、调度事件等。

# 挂载 debugfs
mount -t debugfs debugfs /sys/kernel/debug

# 启用函数追踪
echo function > /sys/kernel/debug/tracing/current_tracer

# 开始追踪
echo 1 > /sys/kernel/debug/tracing/tracing_on

# 执行需要追踪的操作

# 停止追踪
echo 0 > /sys/kernel/debug/tracing/tracing_on

# 查看追踪结果
cat /sys/kernel/debug/tracing/trace

# 清空追踪缓冲区
echo > /sys/kernel/debug/tracing/trace

# 追踪特定函数
echo "sys_open do_fork" > /sys/kernel/debug/tracing/set_ftrace_filter

systemtap

动态追踪工具,可以编写脚本对内核进行动态追踪。

# 安装 systemtap
sudo apt-get install systemtap  # Ubuntu/Debian
sudo yum install systemtap      # CentOS/RHEL

# 创建追踪脚本 (trace.stp)
probe kernel.function("sys_open") {
    printf("sys_open called with filename: %s\n", user_string($filename))
}

# 运行追踪脚本
sudo stap trace.stp

# 执行需要追踪的操作

# 按 Ctrl+C 停止追踪

LTTng

高性能的 Linux 追踪工具,可以收集内核和用户空间的事件。

# 安装 LTTng
sudo apt-get install lttng-tools lttng-modules-dkms  # Ubuntu/Debian
sudo yum install lttng-tools lttng-modules          # CentOS/RHEL

# 创建会话
lttng create session1

# 启用内核事件
lttng enable-event -k -a

# 开始追踪
lttng start

# 执行需要追踪的操作

# 停止追踪
lttng stop

# 查看追踪结果
lttng view

# 销毁会话
lttng destroy

3. 内存管理优化

3.1 内存分配优化

内核内存分配器

Linux 内核使用多种内存分配器,如 SLAB、SLUB、SLOB 等。

# 查看当前使用的内存分配器
cat /proc/sys/kernel/slabinfo | head -n 1

# 配置内存分配器
# 在 GRUB 配置文件中添加:
# GRUB_CMDLINE_LINUX="slub_debug=O"

内存分配参数调优

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-memory.conf

# 添加内存分配参数
# 调整 SLAB 缓存
kernel.slab_max_order = 0
kernel.slab_min_order = 0

# 调整内存分配策略
vm.overcommit_memory = 1
vm.overcommit_ratio = 90

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-memory.conf

3.2 页面置换优化

页面置换算法

Linux 内核使用多种页面置换算法,如 LRU(最近最少使用)、LRU-2、MFU(最常使用)等。

页面置换参数调优

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-memory.conf

# 添加页面置换参数
# 调整交换空间使用倾向
vm.swappiness = 10

# 调整脏页写入策略
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500

# 调整内存回收策略
vm.min_free_kbytes = 65536
vm.lowmem_reserve_ratio = 256 256 32

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-memory.conf

3.3 内存使用监控

内存使用情况

# 查看内存使用情况
free -h

# 查看内存详细使用情况
cat /proc/meminfo

# 查看进程内存使用情况
top -o %MEM
ps aux --sort=-%mem | head -10

# 查看 SLAB 缓存使用情况
sudo slabtop

# 查看页面置换情况
vmstat 1 | awk '{print $7, $8, $9, $10}'

内存泄漏检测

# 启用 kmemleak
# 在 GRUB 配置文件中添加:
# GRUB_CMDLINE_LINUX="kmemleak=on"

# 扫描内存泄漏
echo scan > /sys/kernel/debug/kmemleak

# 查看内存泄漏信息
cat /sys/kernel/debug/kmemleak

4. CPU 调度优化

4.1 CPU 调度器

Linux 调度器

Linux 内核使用多种调度器,如 CFS(完全公平调度器)、RT(实时调度器)、DL(截止时间调度器)等。

调度器参数调优

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-cpu.conf

# 添加调度器参数
# 调整 CFS 调度器
kernel.sched_autogroup_enabled = 1
kernel.sched_latency_ns = 6000000
kernel.sched_wakeup_granularity_ns = 1000000
kernel.sched_min_granularity_ns = 1500000

# 调整实时调度器
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-cpu.conf

4.2 进程优先级管理

nice 和 renice

调整进程的优先级。

# 启动进程时设置优先级
nice -n 10 ./program

# 调整正在运行的进程的优先级
renice 10 -p <pid>

# 查看进程优先级
ps -eo pid,comm,nice,pcpu | sort -k3

chrt

设置进程的实时优先级。

# 设置实时优先级
chrt -f 99 ./program

# 查看进程的实时优先级
chrt -p <pid>

4.3 CPU 亲和性

taskset

设置进程的 CPU 亲和性,将进程绑定到特定的 CPU 核心。

# 启动进程时设置 CPU 亲和性
taskset -c 0,1 ./program

# 调整正在运行的进程的 CPU 亲和性
taskset -cp 0,1 <pid>

# 查看进程的 CPU 亲和性
taskset -p <pid>

numactl

在 NUMA 系统上设置进程的内存和 CPU 亲和性。

# 安装 numactl
sudo apt-get install numactl  # Ubuntu/Debian
sudo yum install numactl      # CentOS/RHEL

# 查看 NUMA 节点信息
numactl --hardware

# 启动进程时设置 NUMA 亲和性
numactl --cpunodebind=0 --membind=0 ./program

# 调整正在运行的进程的 NUMA 亲和性
numactl --cpunodebind=0 --membind=0 -p <pid>

5. 磁盘 I/O 优化

5.1 I/O 调度器

Linux I/O 调度器

Linux 内核使用多种 I/O 调度器,如 CFQ(完全公平队列)、Deadline、NOOP、BFQ 等。

设置 I/O 调度器

# 查看当前使用的 I/O 调度器
cat /sys/block/sda/queue/scheduler

# 设置 I/O 调度器
echo deadline > /sys/block/sda/queue/scheduler

# 永久设置 I/O 调度器
# 在 GRUB 配置文件中添加:
# GRUB_CMDLINE_LINUX="elevator=deadline"

I/O 调度器参数调优

# 调整 CFQ 调度器参数
echo 8 > /sys/block/sda/queue/iosched/quantum
echo 4 > /sys/block/sda/queue/iosched/slice_idle

# 调整 Deadline 调度器参数
echo 500 > /sys/block/sda/queue/iosched/read_expire
echo 5000 > /sys/block/sda/queue/iosched/write_expire
echo 2 > /sys/block/sda/queue/iosched/writes_starved

# 调整 NOOP 调度器参数
# NOOP 调度器参数较少,主要依赖硬件调度

5.2 文件系统优化

文件系统选择

不同的文件系统有不同的性能特点,如 ext4、XFS、Btrfs、ZFS 等。

文件系统挂载选项

# 编辑 /etc/fstab 文件
sudo nano /etc/fstab

# 添加挂载选项
# 示例:
# UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,noatime,discard,errors=remount-ro 0 1

# 常用挂载选项:
# noatime: 禁用访问时间更新
# nodiratime: 禁用目录访问时间更新
# discard: 启用 TRIM 支持(SSD)
# barrier=0: 禁用写屏障(提高性能,但可能影响数据安全)
# data=writeback: 使用回写模式(提高性能,但可能影响数据安全)

# 保存文件并退出

# 重新挂载文件系统
sudo mount -o remount /

文件系统参数调优

# 调整 ext4 文件系统参数
sudo tune2fs -o journal_data_writeback /dev/sda1
sudo tune2fs -r 1000000 /dev/sda1

# 调整 XFS 文件系统参数
sudo xfs_admin -L root /dev/sda1
sudo xfs_growfs /

5.3 磁盘性能优化

磁盘对齐

确保磁盘分区对齐,提高 I/O 性能。

# 检查磁盘对齐情况
sudo fdisk -l /dev/sda

# 分区时确保对齐
# 使用 parted 工具进行分区,默认会自动对齐

RAID 配置

使用 RAID 提高磁盘性能和可靠性。

# 查看 RAID 状态
sudo mdadm --detail /dev/md0

# 调整 RAID 缓存
# 编辑 /etc/mdadm/mdadm.conf 文件,添加:
# ARRAY /dev/md0 metadata=1.2 name=server:0 UUID=xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
#   devices=/dev/sda1,/dev/sdb1
#   options=bitmap=internal,chunk=64

SSD 优化

针对 SSD 进行特殊优化,延长使用寿命和提高性能。

# 启用 TRIM 支持
echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch

# 禁用 swap(如果内存充足)
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

# 调整 swappiness
vm.swappiness = 10

6. 网络性能优化

6.1 网络协议栈优化

TCP/IP 协议栈参数调优

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-network.conf

# 添加网络参数
# TCP 相关参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_no_metrics_save = 1

# 套接字相关参数
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096
net.core.optmem_max = 81920

# 内存相关参数
net.ipv4.tcp_mem = 4096 87380 174760
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 4194304

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-network.conf

6.2 网络设备优化

网络设备参数调优

# 查看网络设备信息
ip link show

# 调整网络设备参数
sudo ethtool -s eth0 speed 1000 duplex full autoneg on

# 启用网络设备特性
sudo ethtool -K eth0 tso on gso on gro on lro on rx on tx on

# 调整网络设备缓冲区
sudo ethtool -G eth0 rx 4096 tx 4096

# 查看网络设备统计信息
ethtool -S eth0

6.3 网络性能测试

网络带宽测试

# 安装 iperf3
sudo apt-get install iperf3  # Ubuntu/Debian
sudo yum install iperf3      # CentOS/RHEL

# 启动服务器
iperf3 -s

# 启动客户端
iperf3 -c server_ip -t 60 -P 8

网络延迟测试

# 使用 ping 测试网络延迟
ping -c 10 server_ip

# 使用 hping3 测试网络延迟
# 安装 hping3
sudo apt-get install hping3  # Ubuntu/Debian
sudo yum install hping3      # CentOS/RHEL

# 测试 TCP 延迟
hping3 -S -p 80 -c 10 server_ip

网络连接数测试

# 使用 wrk 测试 HTTP 性能
# 安装 wrk
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin/

# 测试 HTTP 性能
wrk -t12 -c400 -d30s http://server_ip/

7. 内核参数调优

7.1 通用内核参数

核心内核参数

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-kernel.conf

# 添加核心内核参数
# 进程管理
kernel.pid_max = 65536
kernel.threads-max = 65536

# 信号处理
kernel.sigpending_max = 16384

# 内核栈大小
kernel.threads-max = 65536

# 内核日志缓冲区
kernel.printk = 7 4 1 3

# 内核模块
kernel.modules_disabled = 0

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-kernel.conf

7.2 内核编译优化

内核编译参数

# 配置内核
make menuconfig

# 启用以下优化选项:
# Processor type and features --->
#   [*] Processor family ---> (Generic-x86-64)
#   [*] Maximum number of CPUs (256) --->
#   [*] SMT (Hyperthreading) scheduler support
#   [*] Multi-core scheduler support
#   [*] Machine Check / overheating reporting
#   [*] Enable MCE recovery

# Power management and ACPI options --->
#   [*] ACPI (Advanced Configuration and Power Interface) Support
#   [*] CPU frequency scaling
#   [*] CPU Frequency scaling --->
#     [*] 'ondemand' cpufreq policy governor
#     [*] 'performance' cpufreq policy governor

# 保存配置并退出

# 编译内核
make -j$(nproc) CC="gcc -O2 -march=native"

# 安装内核
sudo make modules_install
sudo make install

内核模块优化

# 只编译必要的内核模块
make localmodconfig

# 禁用不需要的内核模块
# 在 make menuconfig 中禁用不需要的模块

# 调整内核模块加载顺序
# 编辑 /etc/modprobe.d/local.conf 文件,添加:
# options module_name param=value

8. 实时内核优化

8.1 实时内核概述

实时内核

实时内核是一种特殊的 Linux 内核,提供确定性的响应时间,适用于对实时性要求高的应用场景。

实时内核的特点

  • 确定性响应时间:保证在规定的时间内完成任务
  • 低延迟:减少中断处理和调度延迟
  • 高优先级:实时任务优先于普通任务

8.2 实时内核配置

安装实时内核

# 下载实时内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.0.tar.xz
tar -xf linux-5.10.0.tar.xz
cd linux-5.10.0

# 应用实时补丁
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.0-rt10.patch.xz
xzcat patch-5.10.0-rt10.patch.xz | patch -p1

# 配置实时内核
make menuconfig

# 启用以下选项:
# General setup --->
#   [*] Preemption Model (Fully Preemptible Kernel (RT)) --->

# Processor type and features --->
#   [*] High Resolution Timer Support
#   [*] Tickless System (Dynamic Ticks)

# 保存配置并退出

# 编译实时内核
make -j$(nproc)
sudo make modules_install
sudo make install

# 更新 GRUB
sudo update-grub

实时内核参数调优

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-rt.conf

# 添加实时内核参数
# 调整优先级
kernel.sched_rt_runtime_us = -1

# 调整中断处理
kernel.irqaffinity = 0

# 调整内存分配
vm.swappiness = 0

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-rt.conf

8.3 实时性能测试

实时延迟测试

# 安装 rt-tests
git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
cd rt-tests
make
sudo make install

# 运行实时延迟测试
cyclictest -t1 -p99 -n -i1000 -l1000000

# 分析测试结果
# 输出中的最大值和平均值表示实时延迟

实时任务调度测试

# 运行实时任务调度测试
hackbench -l 10000

# 分析测试结果
# 输出中的时间表示任务调度的延迟

9. 性能监控和维护

9.1 性能监控系统

系统监控工具

  • Prometheus + Grafana:强大的监控和可视化系统
  • Nagios/Icinga:传统的监控系统
  • Zabbix:企业级监控系统
  • Netdata:实时性能监控系统

安装 Netdata

# 安装 Netdata
bash <(curl -Ss https://my-netdata.io/kickstart.sh)

# 访问 Netdata 界面
# 打开浏览器,访问 http://server_ip:19999

9.2 性能分析报告

生成性能分析报告

# 使用 sar 收集系统性能数据
# 安装 sysstat
sudo apt-get install sysstat  # Ubuntu/Debian
sudo yum install sysstat      # CentOS/RHEL

# 配置 sar 数据收集
# 编辑 /etc/sysstat/sysstat 文件,设置:
# ENABLED="true"

# 启动 sysstat 服务
sudo systemctl start sysstat
sudo systemctl enable sysstat

# 查看 sar 数据
sar -u 1 10  # CPU 使用情况
sar -r 1 10  # 内存使用情况
sar -d 1 10  # 磁盘 I/O 情况
sar -n DEV 1 10  # 网络使用情况

# 生成性能分析报告
sar -A > performance_report.txt

9.3 性能优化的持续改进

建立性能基线

定期收集系统性能数据,建立性能基线,以便比较和分析性能变化。

性能优化的最佳实践

  1. 定期监控:定期监控系统性能,及时发现性能问题
  2. 分析瓶颈:使用性能分析工具找出性能瓶颈
  3. 逐步优化:逐步优化系统,每次只修改一个参数,测试效果
  4. 文档化:记录性能优化的过程和结果
  5. 培训:培训系统管理员,提高性能优化技能

10. 内核性能优化的最佳实践

  1. 了解系统需求:根据系统的具体需求进行性能优化
  2. 识别瓶颈:使用性能分析工具准确识别性能瓶颈
  3. 循序渐进:逐步优化系统,避免一次性修改过多参数
  4. 测试验证:每次优化后进行测试,验证优化效果
  5. 监控维护:建立长期的性能监控和维护机制
  6. 文档记录:详细记录性能优化的过程和结果
  7. 持续学习:关注内核的新特性和性能改进
  8. 硬件升级:在软件优化的基础上,合理升级硬件
  9. 安全优先:在性能优化的同时,确保系统的安全性
  10. 团队协作:与开发人员和其他系统管理员协作,共同优化系统性能

实用案例分析

案例 1:Web 服务器性能优化

场景描述

搭建一个高并发的 Web 服务器,需要优化内核性能以提高响应速度和吞吐量。

解决方案

步骤 1:分析系统性能

# 监控系统性能
top
vmstat 1
iostat -x 1
netstat -s

# 使用 perf 分析性能瓶颈
perf record -a -g sleep 60
perf report

步骤 2:优化内存管理

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-memory.conf

# 添加内存参数
# 调整 swappiness
vm.swappiness = 10

# 调整脏页写入策略
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10

# 调整内存回收策略
vm.min_free_kbytes = 65536

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-memory.conf

步骤 3:优化 CPU 调度

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-cpu.conf

# 添加 CPU 调度参数
# 调整 CFS 调度器
kernel.sched_autogroup_enabled = 1
kernel.sched_latency_ns = 6000000
kernel.sched_wakeup_granularity_ns = 1000000

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-cpu.conf

# 设置进程优先级
renice -10 $(pgrep nginx)

步骤 4:优化磁盘 I/O

# 设置 I/O 调度器
echo deadline > /sys/block/sda/queue/scheduler

# 调整文件系统挂载选项
# 编辑 /etc/fstab 文件,修改:
# UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,noatime,discard 0 1

# 重新挂载文件系统
sudo mount -o remount /

步骤 5:优化网络性能

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-network.conf

# 添加网络参数
# TCP 相关参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_tw_reuse = 1

# 套接字相关参数
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096

# 内存相关参数
net.ipv4.tcp_mem = 4096 87380 174760
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 4194304

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-network.conf

# 调整网络设备参数
sudo ethtool -s eth0 speed 1000 duplex full autoneg on
sudo ethtool -K eth0 tso on gso on gro on

步骤 6:优化 Web 服务器配置

# 编辑 Nginx 配置文件
sudo nano /etc/nginx/nginx.conf

# 添加以下配置:
# worker_processes auto;
# worker_connections 4096;
# multi_accept on;
# use epoll;
# keepalive_timeout 65;
# gzip on;

# 保存文件并退出

# 重启 Nginx 服务
sudo systemctl restart nginx

步骤 7:测试优化效果

# 使用 wrk 测试 HTTP 性能
wrk -t12 -c400 -d30s http://localhost/

# 使用 ab 测试 HTTP 性能
ab -n 10000 -c 100 http://localhost/

# 监控系统性能
top
iostat -x 1
vmstat 1
netstat -s

案例 2:数据库服务器性能优化

场景描述

搭建一个高性能的数据库服务器(如 MySQL、PostgreSQL),需要优化内核性能以提高数据库的响应速度和并发处理能力。

解决方案

步骤 1:分析系统性能

# 监控系统性能
top
vmstat 1
iostat -x 1
netstat -s

# 使用 perf 分析性能瓶颈
perf record -a -g sleep 60
perf report

# 监控数据库性能
# MySQL 示例
mysqladmin extended-status -u root -p | grep -E 'Innodb_buffer_pool|Queries|Threads'

# PostgreSQL 示例
psql -U postgres -c "SELECT * FROM pg_stat_database;"

步骤 2:优化内存管理

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-memory.conf

# 添加内存参数
# 调整 swappiness
vm.swappiness = 1

# 调整脏页写入策略
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500

# 调整内存回收策略
vm.min_free_kbytes = 65536
vm.lowmem_reserve_ratio = 256 256 32

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-memory.conf

步骤 3:优化 CPU 调度

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-cpu.conf

# 添加 CPU 调度参数
# 调整 CFS 调度器
kernel.sched_autogroup_enabled = 0
kernel.sched_latency_ns = 4000000
kernel.sched_wakeup_granularity_ns = 500000
kernel.sched_min_granularity_ns = 1000000

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-cpu.conf

# 设置数据库进程优先级
renice -15 $(pgrep mysql)
# 或
renice -15 $(pgrep postgres)

# 设置 CPU 亲和性
taskset -cp 0,1,2,3 $(pgrep mysql)
# 或
taskset -cp 0,1,2,3 $(pgrep postgres)

步骤 4:优化磁盘 I/O

# 设置 I/O 调度器
echo deadline > /sys/block/sda/queue/scheduler

# 调整 I/O 调度器参数
echo 500 > /sys/block/sda/queue/iosched/read_expire
echo 5000 > /sys/block/sda/queue/iosched/write_expire
echo 2 > /sys/block/sda/queue/iosched/writes_starved

# 调整文件系统挂载选项
# 编辑 /etc/fstab 文件,修改:
# UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,noatime,barrier=0,data=writeback 0 1

# 重新挂载文件系统
sudo mount -o remount /

# 调整磁盘队列深度
echo 128 > /sys/block/sda/queue/nr_requests

步骤 5:优化网络性能

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-network.conf

# 添加网络参数
# TCP 相关参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_tw_reuse = 1

# 套接字相关参数
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-network.conf

步骤 6:优化数据库配置

# 编辑 MySQL 配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# 添加以下配置:
# innodb_buffer_pool_size = 8G
# innodb_log_file_size = 1G
# innodb_flush_method = O_DIRECT
# innodb_io_capacity = 2000
# innodb_io_capacity_max = 4000
# innodb_read_io_threads = 64
# innodb_write_io_threads = 64
# innodb_buffer_pool_instances = 8
# innodb_thread_concurrency = 0
# max_connections = 1000

# 保存文件并退出

# 重启 MySQL 服务
sudo systemctl restart mysql

# 或编辑 PostgreSQL 配置文件
sudo nano /etc/postgresql/13/main/postgresql.conf

# 添加以下配置:
# shared_buffers = 8GB
# effective_cache_size = 24GB
# work_mem = 64MB
# maintenance_work_mem = 2GB
# random_page_cost = 1.1
# effective_io_concurrency = 200
# max_connections = 1000

# 保存文件并退出

# 重启 PostgreSQL 服务
sudo systemctl restart postgresql

步骤 7:测试优化效果

# 使用 sysbench 测试数据库性能
# 安装 sysbench
sudo apt-get install sysbench  # Ubuntu/Debian
sudo yum install sysbench      # CentOS/RHEL

# 准备测试数据
sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=root --mysql-password=password --mysql-db=test_db --table-size=1000000 --tables=10 prepare

# 运行测试
sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=root --mysql-password=password --mysql-db=test_db --table-size=1000000 --tables=10 --threads=16 --time=300 run

# 清理测试数据
sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=root --mysql-password=password --mysql-db=test_db cleanup

# 监控系统性能
top
iostat -x 1
vmstat 1
netstat -s

# 监控数据库性能
# MySQL 示例
mysqladmin extended-status -u root -p | grep -E 'Innodb_buffer_pool|Queries|Threads'

# PostgreSQL 示例
psql -U postgres -c "SELECT * FROM pg_stat_database;"

案例 3:实时系统性能优化

场景描述

搭建一个实时控制系统,需要使用实时内核并优化性能以确保确定性的响应时间。

解决方案

步骤 1:安装实时内核

# 下载实时内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.0.tar.xz
tar -xf linux-5.10.0.tar.xz
cd linux-5.10.0

# 应用实时补丁
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.0-rt10.patch.xz
xzcat patch-5.10.0-rt10.patch.xz | patch -p1

# 配置实时内核
make menuconfig

# 启用以下选项:
# General setup --->
#   [*] Preemption Model (Fully Preemptible Kernel (RT)) --->

# Processor type and features --->
#   [*] High Resolution Timer Support
#   [*] Tickless System (Dynamic Ticks)

# 保存配置并退出

# 编译实时内核
make -j$(nproc)
sudo make modules_install
sudo make install

# 更新 GRUB
sudo update-grub

# 重启系统
sudo reboot

# 验证实时内核
uname -r
# 输出应该包含 "rt"

步骤 2:优化实时内核参数

# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/50-rt.conf

# 添加实时内核参数
# 调整优先级
kernel.sched_rt_runtime_us = -1

# 调整中断处理
kernel.irqaffinity = 0

# 调整内存分配
vm.swappiness = 0
vm.dirty_ratio = 5
vm.dirty_background_ratio = 2

# 调整调度器
kernel.sched_latency_ns = 1000000
kernel.sched_wakeup_granularity_ns = 100000
kernel.sched_min_granularity_ns = 200000

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/50-rt.conf

步骤 3:优化系统服务

# 禁用不必要的服务
sudo systemctl disable bluetooth
sudo systemctl disable cups
sudo systemctl disable avahi-daemon
sudo systemctl disable NetworkManager

# 启用必要的服务
sudo systemctl enable systemd-timesyncd
sudo systemctl enable ssh

# 重启系统
sudo reboot

步骤 4:优化实时应用程序

# 编译实时应用程序
# 示例:实时控制程序
cat > rt-app.c << 'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/mman.h>

int main() {
    // 设置实时优先级
    struct sched_param param;
    param.sched_priority = 99;
    if (sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
        perror("sched_setscheduler");
        exit(1);
    }

    // 锁定内存,避免页面置换
    if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) {
        perror("mlockall");
        exit(1);
    }

    // 实时控制循环
    while (1) {
        // 执行实时任务
        // ...

        // 延迟 1ms
        usleep(1000);
    }

    return 0;
}
EOF

# 编译实时应用程序
gcc -o rt-app rt-app.c -lrt

# 运行实时应用程序
sudo ./rt-app

步骤 5:测试实时性能

# 安装实时测试工具
# 下载 rt-tests
git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
cd rt-tests
make
sudo make install

# 运行实时延迟测试
cyclictest -t1 -p99 -n -i1000 -l1000000

# 分析测试结果
# 输出中的最大值和平均值表示实时延迟

# 运行实时任务调度测试
hackbench -l 10000

# 分析测试结果
# 输出中的时间表示任务调度的延迟

步骤 6:监控实时性能

# 使用 top 监控实时任务
top

# 使用 vmstat 监控系统状态
vmstat 1

# 使用 netstat 监控网络状态
netstat -s

# 使用 iostat 监控磁盘 I/O
iostat -x 1

最佳实践

  1. 了解系统需求:根据系统的具体需求进行性能优化
  2. 识别瓶颈:使用性能分析工具准确识别性能瓶颈
  3. 循序渐进:逐步优化系统,避免一次性修改过多参数
  4. 测试验证:每次优化后进行测试,验证优化效果
  5. 监控维护:建立长期的性能监控和维护机制
  6. 文档记录:详细记录性能优化的过程和结果
  7. 持续学习:关注内核的新特性和性能改进
  8. 硬件升级:在软件优化的基础上,合理升级硬件
  9. 安全优先:在性能优化的同时,确保系统的安全性
  10. 团队协作:与开发人员和其他系统管理员协作,共同优化系统性能

总结

本教程详细介绍了 Linux 内核性能优化的核心概念、工具和最佳实践,包括性能分析方法、内存管理优化、CPU 调度优化、磁盘 I/O 优化、网络性能优化等内容。通过学习,读者可以掌握内核性能调优的技能,提高系统的响应速度、吞吐量和资源利用率。

内核性能优化是一项复杂而又挑战性的工作,需要综合考虑系统的硬件配置、软件环境和应用需求。通过合理的性能分析和优化,可以显著提高系统的性能和可靠性,为应用程序提供更好的运行环境。

希望本教程能够帮助读者在 Linux 内核性能优化的道路上取得更大的进步,为构建高性能、高可靠性的 Linux 系统做出贡献。

« 上一篇 内核版本管理 下一篇 » 内核更新策略