跳转至

11. 内核与模块管理

本章介绍 RHEL 9 的内核版本管理、内核模块加载与持久化配置、sysctl 运行时参数调整、GRUB 引导参数管理,以及面向生产场景的内核性能调优。内核管理是系统稳定性和安全性的底层基础,正确的参数调整能显著提升服务器性能与安全水位。

操作前提示

内核操作影响范围广,所有步骤均应在已创建 VMware 快照的情况下执行。修改 GRUB 配置或内核参数前务必备份相关文件。


11.1 前提条件

  • 已完成第一阶段全部配置(第 1–9 章),服务管理已掌握(第 10 章)。
  • 通过 SecureCRT(SSH 端口 2222)以 ops 用户、密钥认证方式登录 192.168.1.100,执行 sudo -i 切换至 root 环境。
  • 官方仓库已启用(第 7 章)。

11.2 内核版本管理

11.2.1 查看当前内核信息

# 当前运行的内核版本
uname -r

# 内核详细信息(版本、构建时间、架构)
uname -a

# 查看所有已安装的内核包
rpm -qa | grep '^kernel' | sort

# 等效命令
dnf list installed 'kernel*'

11.2.2 更新内核

RHEL 9 支持多内核共存,新内核安装后原内核保留,可随时回滚。

# 检查可用内核更新
dnf check-update kernel

# 仅更新内核(不更新其他包)
dnf update kernel -y

# 查看更新后已安装的内核列表
rpm -qa | grep '^kernel-[0-9]' | sort

更新后需重启

内核更新后,新内核在重启前不会生效。执行 reboot 后,GRUB 默认引导最新内核。重启后执行 uname -r 验证版本。

11.2.3 管理 GRUB 引导内核

RHEL 9 使用 grubby 工具管理内核引导配置,不要直接编辑 grub.cfg

# 查看所有可用内核及当前默认内核
grubby --info=ALL

# 查看默认内核
grubby --default-kernel

# 设置默认引导内核(回滚场景)
grubby --set-default /boot/vmlinuz-<旧版本号>

# 验证
grubby --default-kernel

回滚流程

新内核引发问题时:先执行 grubby --set-default 设置旧内核为默认,再 reboot。重启后确认问题消失,再考虑是否卸载问题内核。

11.2.4 控制已安装内核数量

# 查看当前保留内核数量配置
grep installonly_limit /etc/dnf/dnf.conf

# 手动删除指定旧内核(谨慎操作)
dnf remove kernel-5.14.0-<旧版本>.x86_64

# 自动清理多余内核(保留当前运行 + 最新版)
dnf remove --oldinstallonly --setopt installonly_limit=2 kernel

勿删除当前运行的内核

执行 uname -r 确认当前版本,对应版本绝对不能删除


11.3 内核模块管理

内核模块(.ko 文件)是内核功能的动态扩展,按需加载,无需重编译内核。

11.3.1 查看模块信息

# 列出当前已加载的所有模块
lsmod

# 过滤查找特定模块
lsmod | grep vfat

# 查看模块详细信息(参数、依赖、描述)
modinfo vfat
modinfo xfs

# 查看模块的参数列表
modinfo -p vfat

11.3.2 手动加载与卸载模块

# 加载模块(自动处理依赖)
modprobe vfat

# 加载模块并传入参数
modprobe nf_conntrack hashsize=65536

# 验证已加载
lsmod | grep vfat

# 卸载模块(自动处理反向依赖)
modprobe -r vfat

# 查看模块依赖关系
modprobe --show-depends vfat

卸载前确认无依赖

若模块被其他模块或进程使用,modprobe -r 会失败。先用 lsmod | grep <module> 查看 Used by 列,确认为 0 后再卸载。

11.3.3 配置模块开机自动加载

# 方法一:modules-load.d(直接加载模块,推荐)
echo "vfat" > /etc/modules-load.d/vfat.conf

# 一次配置多个模块
tee /etc/modules-load.d/custom.conf << 'EOF'
vfat
nf_conntrack
br_netfilter
EOF

# 方法二:modprobe.d(加载时传入参数)
tee /etc/modprobe.d/nf_conntrack.conf << 'EOF'
options nf_conntrack hashsize=65536
EOF

验证(重启后确认):

reboot
# 重启后
lsmod | grep vfat
lsmod | grep nf_conntrack

11.3.4 黑名单禁用模块

# 创建黑名单配置文件(禁用 USB 存储)
tee /etc/modprobe.d/blacklist-usb-storage.conf << 'EOF'
blacklist usb-storage
install usb-storage /bin/false
EOF

# 立即卸载已加载的模块
modprobe -r usb-storage

安全加固场景

禁用不需要的内核模块是 CIS 基线和 STIG 合规的常见要求,如禁用 cramfsfreevxfsjffs2hfshfsplussquashfsudf 等不常用文件系统模块。


11.4 内核参数管理(sysctl)

sysctl 用于在运行时读取和修改内核参数,涵盖网络、内存、进程等多个子系统。

11.4.1 查看内核参数

# 查看所有参数
sysctl -a

# 查看特定参数
sysctl vm.swappiness
sysctl net.ipv4.ip_forward

# 搜索相关参数
sysctl -a | grep "net.ipv4"

11.4.2 临时修改参数(重启失效)

sysctl -w vm.swappiness=10
sysctl -w net.ipv4.ip_forward=1

# 验证
sysctl vm.swappiness

11.4.3 永久修改参数

tee /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# 内存管理
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# 网络性能
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30

# 安全加固
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
EOF

# 立即应用
sysctl --system

# 验证
sysctl vm.swappiness
sysctl net.ipv4.conf.all.accept_redirects

配置文件优先级

/etc/sysctl.d/ 下的文件按文件名字母序加载,99-linuxdc.conf 中的 99- 前缀确保在其他默认配置之后加载,能够覆盖默认值。


11.5 GRUB 引导参数管理

某些内核行为需要通过 GRUB 命令行参数在引导时传入,而非通过 sysctl 动态调整。

备份先行

cp /etc/default/grub /etc/default/grub.bak
# 查看当前 GRUB 配置
cat /etc/default/grub

# 编辑 GRUB 配置
vim /etc/default/grub

GRUB_CMDLINE_LINUX 常用参数示例:

GRUB_CMDLINE_LINUX="resume=UUID=xxx rd.lvm.lv=rhel/swap \
  transparent_hugepage=never \
  elevator=mq-deadline \
  quiet"

修改后必须重新生成 grub.cfg

# UEFI 系统(本教程使用 UEFI 模式安装)
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

# 重启后验证参数
reboot
cat /proc/cmdline

11.6 内核性能调优

本节介绍生产环境中针对 CPU、内存、I/O 等子系统的进阶内核参数调优,是服务器上线前性能基线配置的重要环节。

11.6.1 CPU 频率调节(CPU Governor)

CPU governor 控制处理器的频率缩放策略,直接影响服务器的响应速度与功耗。

# 查看当前 CPU governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# 查看所有可用 governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

# 临时切换到 performance 模式(最高性能,不降频)
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance > "$cpu"
done

# 验证
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | sort -u

持久化(通过 tuned 管理,推荐):

dnf install -y tuned

# 服务器生产环境推荐 profile
tuned-adm profile throughput-performance   # 高吞吐,固定最高频率
tuned-adm profile latency-performance      # 低延迟,适合实时业务
tuned-adm profile virtual-guest            # 虚拟机(本实验环境)

tuned-adm active
Governor 策略 适用场景
performance 固定最高频率 生产数据库、高并发服务
powersave 固定最低频率 待机、低负载节能
ondemand 按负载动态调整 通用场景(默认)
schedutil 基于调度器负载 RHEL 9 新内核推荐

11.6.2 透明大页(THP)管理

透明大页(Transparent Huge Pages)可减少页表压力、提升 TLB 命中率,但也会引入延迟抖动,对数据库服务器不友好。

# 查看当前 THP 状态
cat /sys/kernel/mm/transparent_hugepage/enabled

# 临时禁用 THP(数据库服务器必做)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 验证
cat /sys/kernel/mm/transparent_hugepage/enabled
# 输出:always madvise [never]  → [never] 表示已禁用

持久化(通过 GRUB 参数,重启后生效):

vim /etc/default/grub
# 在 GRUB_CMDLINE_LINUX 末尾追加:
# transparent_hugepage=never

grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

THP 决策依据

MySQL、PostgreSQL、MongoDB、Oracle 均官方建议禁用 THP;内存密集型科学计算、大数据批处理可保留 THP 提升吞吐量。根据业务类型决策,不可一概而论。

11.6.3 静态大页(Huge Pages)配置

静态大页预先分配固定数量的 2 MB 或 1 GB 大页,供 Oracle、Java JVM(-XX:+UseLargePages)等应用显式申请,完全消除页表碎片带来的开销。

# 查看当前大页配置
grep -i hugepage /proc/meminfo

# 计算所需大页数量(示例:为 Oracle SGA 8 GB 分配大页)
# 每个大页 2 MB → 8192 MB ÷ 2 = 4096 个大页
echo 4096 > /proc/sys/vm/nr_hugepages

# 验证(HugePages_Total 应等于配置值,HugePages_Free 应接近 Total)
grep -i hugepage /proc/meminfo

持久化:

tee -a /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# 静态大页(按实际应用需求调整数量)
vm.nr_hugepages = 4096
EOF

sysctl --system

挂载 hugetlbfs(应用直接映射大页):

mkdir -p /dev/hugepages
mount -t hugetlbfs nodev /dev/hugepages

# 写入 fstab 永久挂载
echo 'nodev /dev/hugepages hugetlbfs defaults 0 0' >> /etc/fstab

11.6.4 NUMA 感知调优

NUMA(Non-Uniform Memory Access)架构中,CPU 访问本地内存速度远快于远端内存(跨 NUMA 节点)。多路服务器必须关注 NUMA 配置。

# 查看 NUMA 拓扑
dnf install -y numactl
numactl --hardware

# 查看当前 NUMA 策略
numactl --show

# 以 NUMA 感知方式运行进程(绑定到 node 0 的 CPU 和内存)
numactl --cpunodebind=0 --membind=0 <command>

# 查看 NUMA 内存命中/未命中统计
numastat
numastat -m | grep -E "^Node|AnonPages|FilePages"

NUMA 内核参数:

tee -a /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# NUMA 内存策略(0=严格本地,1=尽量本地,2=交错分配)
vm.zone_reclaim_mode = 1
EOF

sysctl --system

NUMA 对数据库的影响

MySQL、PostgreSQL 等数据库进程应绑定到固定 NUMA 节点,避免跨节点内存访问导致延迟不稳定。可通过 systemd 的 NUMAPolicyNUMAMask 指令在 unit 文件中配置。

11.6.5 IRQ 亲和性(中断绑定)

将网卡中断绑定到特定 CPU 核心,避免中断上下文切换影响业务 CPU,显著提升网络吞吐量。

# 查看当前 IRQ 分配
cat /proc/interrupts | head -30

# 查看网卡队列数量(RSS 队列)
ls /sys/class/net/ens33/queues/

# 查看特定 IRQ 的 CPU 亲和性掩码
cat /proc/irq/<IRQ_NUM>/smp_affinity

# 将 IRQ <NUM> 绑定到 CPU 1(掩码 0x2 = 第 2 个 CPU)
echo 2 > /proc/irq/<IRQ_NUM>/smp_affinity

# 使用 irqbalance 自动均衡(大多数场景推荐)
dnf install -y irqbalance
systemctl enable --now irqbalance

11.6.6 文件描述符与进程限制

高并发应用(Web 服务器、数据库)需要提升系统级和进程级的文件描述符上限。

# 查看当前系统级文件描述符上限
sysctl fs.file-max
cat /proc/sys/fs/file-max

# 查看当前进程的限制
ulimit -n           # 软限制
ulimit -Hn          # 硬限制

# 查看特定进程的实际限制
cat /proc/$(pgrep sshd | head -1)/limits | grep "Max open files"

系统级调优:

tee -a /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# 系统级最大文件描述符数
fs.file-max = 1000000

# 系统级最大进程数
kernel.pid_max = 4194304

# inotify 监控上限(用于 IDE、文件监控工具)
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 1024
EOF

sysctl --system

进程级持久化(/etc/security/limits.conf):

tee /etc/security/limits.d/99-linuxdc.conf << 'EOF'
# 所有用户的文件描述符限制
*       soft    nofile      65536
*       hard    nofile      1048576

# ops 用户(运维账户)
ops     soft    nproc       65536
ops     hard    nproc       65536

# 进程数上限
*       soft    nproc       65536
*       hard    nproc       65536
EOF

PAM 配置说明

/etc/security/limits.d/ 下的文件由 PAM 的 pam_limits 模块加载,登录新会话后生效。执行 ulimit -n 验证当前会话限制,或重新登录后验证。

11.6.7 网络栈性能调优

tee -a /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# TCP 缓冲区(适合万兆网络)
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# 增大网卡接收队列
net.core.netdev_max_backlog = 65536

# TIME_WAIT 连接复用
net.ipv4.tcp_tw_reuse = 1

# SYN cookies(防 SYN flood 攻击)
net.ipv4.tcp_syncookies = 1

# 本地端口范围
net.ipv4.ip_local_port_range = 10000 65535
EOF

sysctl --system

11.6.8 I/O 调度器选择

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

# RHEL 9 支持的调度器
# mq-deadline:适合大多数工作负载(默认推荐)
# bfq:公平队列,适合桌面/混合负载
# none:直通模式,NVMe SSD 推荐

# 临时切换
echo mq-deadline > /sys/block/sda/queue/scheduler

# 持久化(通过 udev 规则)
tee /etc/udev/rules.d/60-io-scheduler.rules << 'EOF'
# 旋转磁盘使用 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", \
  ATTR{queue/rotational}=="1", \
  ATTR{queue/scheduler}="mq-deadline"

# NVMe SSD 使用 none(直通模式)
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", \
  ATTR{queue/scheduler}="none"
EOF

udevadm control --reload-rules
udevadm trigger

11.6.9 完整生产调优配置汇总

以下为 linuxdc 生产基线的完整 sysctl 配置,应用于 /etc/sysctl.d/99-linuxdc.conf

tee /etc/sysctl.d/99-linuxdc.conf << 'EOF'
## ============================================================
## linuxdc 生产内核参数基线
## 主机: linuxdc (192.168.1.100)  更新日期: $(date +%F)
## ============================================================

## 内存管理
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.overcommit_memory = 1
vm.overcommit_ratio = 80
vm.zone_reclaim_mode = 1

## 文件系统
fs.file-max = 1000000
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 1024
kernel.pid_max = 4194304

## 网络性能
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_local_port_range = 10000 65535

## 安全加固
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
EOF

sysctl --system

11.7 常见问题与排查

问题现象 排查步骤
内核更新后启动失败 在 GRUB 菜单选择上一版本内核;进入系统后执行 grubby --set-default 回滚
模块加载失败(Module not found modinfo <module> 确认模块名称;find /lib/modules/$(uname -r) -name '*.ko' | grep <name> 搜索
sysctl 参数重启后失效 确认配置文件在 /etc/sysctl.d/;执行 sysctl --system 验证加载顺序
THP 禁用后性能未改善 确认 GRUB 参数已重新生成;重启后 cat /sys/kernel/mm/transparent_hugepage/enabled 验证
文件描述符不足(Too many open files ulimit -n 查看当前限制;检查 /etc/security/limits.d/ 配置是否已生效(需重新登录)
# 检查 /boot 分区使用情况
df -h /boot

# 查看 dmesg 中的模块错误
journalctl -k | grep -i "module\|error\|fail"

# 综合验证调优参数
sysctl vm.swappiness vm.dirty_ratio fs.file-max \
       net.core.somaxconn net.ipv4.tcp_fin_timeout

11.8 实践任务

  1. 查看当前内核版本和已安装内核列表:

    uname -r
    rpm -qa | grep '^kernel-[0-9]' | sort
    
  2. 执行内核更新检查(不实际更新):dnf check-update kernel

  3. 加载 vfat 模块,配置开机自动加载,验证:

    modprobe vfat
    lsmod | grep vfat
    echo "vfat" > /etc/modules-load.d/vfat.conf
    
  4. 创建 /etc/sysctl.d/99-linuxdc.conf,应用并验证关键参数:

    sysctl --system
    sysctl vm.swappiness fs.file-max net.core.somaxconn
    
  5. 禁用透明大页并验证:

    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    cat /sys/kernel/mm/transparent_hugepage/enabled
    
  6. 安装 numactl,查看本机 NUMA 拓扑:numactl --hardware

  7. 配置 I/O 调度器持久化规则,验证 /dev/sda 调度器设置。
  8. 配置进程限制:创建 /etc/security/limits.d/99-linuxdc.conf,重新登录后验证 ulimit -n

11.9 自测问题

Q1:modprobeinsmod 有什么区别?

insmod 直接加载指定的 .ko 文件,不处理依赖关系,需手动指定完整路径;modprobe 会自动解析并加载所有依赖模块,只需提供模块名。生产环境始终使用 modprobe

Q2:为什么数据库服务器推荐禁用 THP,而不是保留默认设置?

THP 的 khugepaged 守护进程在后台持续扫描并合并内存页,合并操作会短暂暂停进程(stop-the-world),引发不可预测的延迟峰值(latency spike)。数据库对 P99/P999 延迟极度敏感,THP 引入的毫秒级抖动会导致超时和性能下降。MySQL、PostgreSQL、MongoDB、Oracle 均官方建议禁用。

Q3:静态大页(Huge Pages)与透明大页(THP)有什么本质区别?

静态大页由管理员预先分配,应用通过 mmap()shmget() 显式申请,内核不会自动回收,适合 Oracle SGA、Java 堆等需要稳定大内存映射的场景;THP 由内核后台守护进程自动管理,应用无感知,理论上通用,但因后台合并操作引入延迟抖动,实际生产中对数据库类负载弊大于利。

Q4:修改 /etc/sysctl.d/ 下的文件后如何立即生效而无需重启?

执行 sysctl --system 重新加载所有 sysctl 配置文件并应用。也可针对单个参数执行 sysctl -w <key>=<value> 临时生效(同时确保配置文件中已写入以保证重启后持久)。


11.10 章节总结

本章介绍了 RHEL 9 内核管理的四个核心维度:内核版本管理(更新与回滚,使用 grubby)、内核模块管理(手动加减载、持久化与安全黑名单)、内核参数调整(sysctl 运行时调整与持久化,GRUB 引导参数),以及面向生产场景的性能调优(CPU governor、THP、静态大页、NUMA、IRQ 亲和性、文件描述符、网络栈、I/O 调度器)。这些操作构成了系统性能基线建立的核心工作,为第 12 章安全加固和第 13 章故障排查提供直接支撑。