内核参数配置

核心知识点

1. 内核参数概述

1.1 内核参数的定义与作用

内核参数是 Linux 内核在运行时可以调整的配置选项,用于控制内核的行为和性能。这些参数可以在系统启动时设置,也可以在运行时动态修改,无需重启系统。

内核参数的主要作用包括:

  • 性能优化:调整内核参数以提高系统性能
  • 资源管理:控制系统资源的分配和使用
  • 功能启用/禁用:启用或禁用特定的内核功能
  • 故障排查:修改参数以解决特定的系统问题
  • 安全加固:调整安全相关的参数以增强系统安全性

1.2 内核参数的分类

内核参数可以按照不同的方式分类:

  • 按作用域分类

    • 全局参数:影响整个系统
    • 局部参数:仅影响特定的子系统或设备
  • 按修改方式分类

    • 运行时可修改参数:可以在系统运行时动态修改
    • 启动时参数:只能在系统启动时通过内核命令行设置
  • 按子系统分类

    • 内存管理参数:控制内存分配和使用
    • 进程管理参数:控制进程调度和管理
    • 网络参数:控制网络协议和设备
    • 文件系统参数:控制文件系统行为
    • 安全参数:控制安全相关功能
    • 电源管理参数:控制电源管理行为

2. 内核参数的查看与修改

2.1 查看内核参数

使用 sysctl 命令

# 查看所有内核参数
sysctl -a

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

# 按子系统查看参数
sysctl -a | grep net.ipv4
sysctl -a | grep vm
sysctl -a | grep fs

查看 /proc/sys 目录

内核参数也可以通过 /proc/sys 虚拟文件系统查看和修改,每个参数对应一个文件:

# 查看网络参数
cat /proc/sys/net/ipv4/ip_forward

# 查看内存参数
cat /proc/sys/vm/swappiness

# 查看文件系统参数
cat /proc/sys/fs/file-max

# 浏览所有参数目录
ls -la /proc/sys/
ls -la /proc/sys/net/ipv4/

2.2 修改内核参数

使用 sysctl 命令

# 临时修改内核参数(重启后失效)
sysctl -w net.ipv4.ip_forward=1
sysctl -w vm.swappiness=10
sysctl -w fs.file-max=65536

# 立即应用所有配置文件中的参数
sysctl -p

# 应用特定的配置文件
sysctl -p /etc/sysctl.d/my.conf

修改 /proc/sys 目录中的文件

# 临时修改内核参数(重启后失效)
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 10 > /proc/sys/vm/swappiness
echo 65536 > /proc/sys/fs/file-max

通过内核命令行修改

在系统启动时,通过 GRUB 菜单修改内核命令行参数:

# 编辑 GRUB 配置文件
sudo nano /etc/default/grub

# 修改 GRUB_CMDLINE_LINUX 行
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 elevator=deadline"

# 更新 GRUB 配置
# Ubuntu/Debian
sudo update-grub

# RHEL/CentOS 7
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# RHEL/CentOS 8+
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

3. 内核参数的持久化配置

3.1 配置文件

为了使内核参数在系统重启后仍然生效,需要将其写入配置文件:

  • **/etc/sysctl.conf**:传统的内核参数配置文件
  • **/etc/sysctl.d/**:现代的内核参数配置目录,存放多个配置文件

使用 /etc/sysctl.conf

# 编辑 sysctl.conf 文件
sudo nano /etc/sysctl.conf

# 添加或修改参数
net.ipv4.ip_forward = 1
vm.swappiness = 10
fs.file-max = 65536

# 保存文件并退出

# 应用配置
sudo sysctl -p

使用 /etc/sysctl.d/ 目录

# 创建配置文件
sudo nano /etc/sysctl.d/99-custom.conf

# 添加参数
# 网络参数
net.ipv4.ip_forward = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30

# 内存参数
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10

# 文件系统参数
fs.file-max = 65536

# 保存文件并退出

# 应用配置
sudo sysctl -p /etc/sysctl.d/99-custom.conf

# 查看所有配置文件
ls -la /etc/sysctl.d/

3.2 配置文件的加载顺序

sysctl 会按照以下顺序加载配置文件:

  1. /etc/sysctl.conf(传统配置文件)
  2. /etc/sysctl.d/*.conf(按文件名字母顺序加载)

注意:如果不同配置文件中设置了相同的参数,后面加载的配置文件会覆盖前面的设置。因此,建议在 /etc/sysctl.d/ 目录中使用数字前缀命名配置文件,以控制加载顺序,例如 00-base.conf50-network.conf99-custom.conf 等。

4. 常见内核参数的调优

4.1 内存管理参数

常见的内存管理参数

参数 描述 默认值 推荐值 适用场景
vm.swappiness 控制内存交换的倾向 60 10-30 内存充足的系统
vm.dirty_ratio 脏页占总内存的百分比,超过此值会触发同步写盘 40 20 服务器系统
vm.dirty_background_ratio 脏页占总内存的百分比,超过此值会触发后台写盘 10 5-10 服务器系统
vm.max_map_count 进程可创建的内存映射区域数量 65530 262144 运行 Java 等应用的系统
vm.overcommit_memory 内存过度分配策略 0 1 运行数据库等需要大量内存的应用
vm.overcommit_ratio 内存过度分配的百分比 50 90 运行内存密集型应用
vm.min_free_kbytes 系统保留的最小空闲内存 自动计算 根据系统内存调整 保证系统稳定性
vm.drop_caches 手动释放页缓存、dentry 和 inode 缓存 0 1(临时使用) 手动清理缓存

内存参数调优示例

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

# 添加内存参数
# 减少交换使用
vm.swappiness = 10

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

# 增加内存映射区域数量
vm.max_map_count = 262144

# 启用内存过度分配
vm.overcommit_memory = 1
vm.overcommit_ratio = 90

# 保存文件并退出

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

4.2 网络参数

常见的网络参数

参数 描述 默认值 推荐值 适用场景
net.ipv4.ip_forward 启用 IP 转发 0 1 路由器或 NAT 服务器
net.ipv4.tcp_syncookies 启用 TCP SYN cookies 防止 SYN 洪水攻击 1 1 所有系统
net.ipv4.tcp_fin_timeout TCP FIN 状态的超时时间 60 30 高并发服务器
net.ipv4.tcp_keepalive_time TCP 保活时间 7200 1800 网络应用服务器
net.ipv4.tcp_keepalive_probes TCP 保活探测次数 9 3 网络应用服务器
net.ipv4.tcp_keepalive_intvl TCP 保活探测间隔 75 30 网络应用服务器
net.ipv4.tcp_max_syn_backlog TCP SYN 队列长度 128 4096 高并发服务器
net.core.somaxconn 套接字最大连接数 128 4096 高并发服务器
net.core.netdev_max_backlog 网络设备接收队列长度 1000 4096 高流量服务器
net.ipv4.tcp_max_tw_buckets TIME_WAIT 状态的最大数量 180000 50000 高并发服务器
net.ipv4.ip_local_port_range 本地端口范围 32768 60999 1024 65535 需要大量本地端口的应用

网络参数调优示例

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

# 添加网络参数
# 启用 IP 转发
net.ipv4.ip_forward = 1

# 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.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096

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

# 保存文件并退出

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

4.3 文件系统参数

常见的文件系统参数

参数 描述 默认值 推荐值 适用场景
fs.file-max 系统最大文件句柄数 自动计算 65536 或更高 高并发服务器
fs.inotify.max_user_watches inotify 监视的最大文件数 8192 524288 运行需要监视大量文件的应用
fs.inotify.max_user_instances 每个用户的最大 inotify 实例数 128 512 运行需要多个 inotify 实例的应用
fs.suid_dumpable 控制是否允许 setuid 进程转储核心 0 0 增强安全性
fs.protected_hardlinks 保护硬链接,防止权限提升 1 1 增强安全性
fs.protected_symlinks 保护符号链接,防止权限提升 1 1 增强安全性

文件系统参数调优示例

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

# 添加文件系统参数
# 增加文件句柄数
fs.file-max = 655360

# 增加 inotify 限制
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512

# 增强安全性
fs.suid_dumpable = 0
fs.protected_hardlinks = 1
fs.protected_symlinks = 1

# 保存文件并退出

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

# 同时修改系统的文件描述符限制
sudo nano /etc/security/limits.conf

# 添加以下行
* soft nofile 65536
* hard nofile 655360
root soft nofile 65536
root hard nofile 655360

# 保存文件并退出

4.4 安全参数

常见的安全参数

参数 描述 默认值 推荐值 适用场景
kernel.randomize_va_space 地址空间布局随机化 (ASLR) 2 2 所有系统
kernel.exec-shield 执行保护 1 1 所有系统
kernel.core_uses_pid 核心转储文件包含 PID 1 1 所有系统
kernel.sysrq SysRq 键功能 16 0 生产系统
net.ipv4.conf.all.rp_filter 反向路径过滤 0 1 增强安全性
net.ipv4.conf.all.accept_source_route 接受源路由 0 0 增强安全性
net.ipv4.conf.all.accept_redirects 接受 ICMP 重定向 0 0 增强安全性
net.ipv4.conf.all.send_redirects 发送 ICMP 重定向 1 0 增强安全性
net.ipv6.conf.all.disable_ipv6 禁用 IPv6 0 根据需要 不需要 IPv6 的系统

安全参数调优示例

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

# 添加安全参数
# 地址空间布局随机化
kernel.randomize_va_space = 2

# 执行保护
kernel.exec-shield = 1

# 核心转储文件包含 PID
kernel.core_uses_pid = 1

# 禁用 SysRq 键
kernel.sysrq = 0

# 网络安全
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# 禁用 IPv6(如果不需要)
# net.ipv6.conf.all.disable_ipv6 = 1

# 保存文件并退出

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

5. 内核命令行参数

5.1 内核命令行参数的概念

内核命令行参数是在系统启动时传递给内核的参数,用于控制内核的启动行为和初始配置。这些参数通常在 GRUB 配置文件中设置,系统启动时由引导加载程序传递给内核。

5.2 常用的内核命令行参数

常见的内核命令行参数

参数 描述 适用场景
quiet 减少启动时的输出信息 生产系统
splash 显示启动 splash 屏幕 桌面系统
nomodeset 禁用内核模式设置 显卡驱动问题
acpi=off 禁用 ACPI ACPI 相关问题
noapic 禁用 APIC APIC 相关问题
nolapic 禁用本地 APIC 本地 APIC 相关问题
edd=off 禁用 EDD EDD 相关问题
resume=/dev/sda1 指定休眠分区 支持休眠功能
root=/dev/sda2 指定根分区 系统启动
ro 以只读方式挂载根分区 系统启动
rw 以读写方式挂载根分区 系统启动
init=/sbin/init 指定初始进程 系统启动
console=ttyS0,115200 设置串口控制台 服务器远程管理
elevator=deadline 设置 I/O 调度器 存储性能优化
transparent_hugepage=never 禁用透明大页 数据库服务器

5.3 修改内核命令行参数

修改 GRUB 配置

# 编辑 GRUB 配置文件
# Ubuntu/Debian
sudo nano /etc/default/grub

# RHEL/CentOS
sudo nano /etc/default/grub

# 修改 GRUB_CMDLINE_LINUX 行
# 示例:
GRUB_CMDLINE_LINUX="quiet splash elevator=deadline transparent_hugepage=never"

# 保存文件并退出

# 更新 GRUB 配置
# Ubuntu/Debian
sudo update-grub

# RHEL/CentOS 7
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# RHEL/CentOS 8+
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

# 重启系统以应用更改
sudo reboot

# 验证内核命令行参数
cat /proc/cmdline

6. 内核参数的验证与测试

6.1 验证内核参数的有效性

验证修改的参数

# 使用 sysctl 命令验证
sysctl net.ipv4.ip_forward
sysctl vm.swappiness

# 通过 /proc/sys 验证
cat /proc/sys/net/ipv4/ip_forward
cat /proc/sys/vm/swappiness

# 验证内核命令行参数
cat /proc/cmdline

# 检查系统日志中的参数相关信息
dmesg | grep "command line"
dmesg | grep "Kernel command line"

6.2 测试内核参数的效果

测试内存参数

# 测试内存使用情况
free -h

# 测试交换使用情况
vmstat 1 10

# 测试内存压力
sysbench memory --memory-block-size=1K --memory-total-size=100G --memory-access-mode=rnd run

测试网络参数

# 测试网络连接数
netstat -ant | wc -l
netstat -ant | grep ESTABLISHED | wc -l

# 测试网络性能
iperf3 -s &
iperf3 -c localhost -t 60 -P 8

# 测试网络延迟
ping -c 10 localhost

# 测试 TCP 连接建立速度
sysbench network --network-protocol=tcp --network-port=8080 --network-peer=localhost prepare
sysbench network --network-protocol=tcp --network-port=8080 --network-peer=localhost run
sysbench network --network-protocol=tcp --network-port=8080 --network-peer=localhost cleanup

测试文件系统参数

# 测试文件句柄使用情况
cat /proc/sys/fs/file-nr

# 测试文件系统性能
sysbench fileio --file-total-size=10G --file-test-mode=rndrw --file-num=64 --file-extra-flags=direct --file-fsync-freq=0 --time=300 --threads=16 prepare
sysbench fileio --file-total-size=10G --file-test-mode=rndrw --file-num=64 --file-extra-flags=direct --file-fsync-freq=0 --time=300 --threads=16 run
sysbench fileio --file-total-size=10G --file-test-mode=rndrw --file-num=64 --file-extra-flags=direct --file-fsync-freq=0 --time=300 --threads=16 cleanup

7. 内核参数的故障排查

7.1 常见的参数配置问题

参数配置错误及解决方案

问题 可能原因 解决方案
参数值无效 参数值超出允许范围 查看参数的有效范围,设置正确的值
参数不存在 参数名称错误或内核版本不支持 检查参数名称是否正确,确认内核版本是否支持
参数无法修改 参数是只读的或需要特定权限 检查参数的属性,使用正确的权限修改
系统性能下降 参数配置不合理 恢复默认值,重新调优参数
系统不稳定 参数配置错误导致系统不稳定 恢复默认配置,重启系统

7.2 内核参数的恢复

恢复默认参数

# 临时恢复单个参数
sysctl -w net.ipv4.ip_forward=0

# 恢复所有参数到默认值
# 重启系统

# 恢复配置文件中的参数
# 编辑配置文件,删除或注释掉修改的参数
sudo nano /etc/sysctl.d/99-custom.conf

# 应用配置
sudo sysctl -p

安全模式启动

如果内核参数配置错误导致系统无法正常启动,可以使用安全模式启动:

  1. 系统启动时,在 GRUB 菜单中选择 "Advanced options for Ubuntu"(或类似选项)
  2. 选择 "Recovery mode" 选项
  3. 在恢复菜单中选择 "root" 进入 root shell
  4. 修复配置文件中的错误
  5. 重启系统

8. 内核参数的监控与管理

8.1 内核参数的监控

监控内核参数的变化

# 监控特定参数的变化
watch -n 1 "sysctl vm.swappiness"

# 监控网络参数
watch -n 1 "netstat -s | grep -E 'retransmit|drop'"

# 监控内存参数
watch -n 1 "free -h"

# 监控文件系统参数
watch -n 1 "cat /proc/sys/fs/file-nr"

使用系统监控工具

  • top/htop:监控系统整体状态
  • vmstat:监控虚拟内存状态
  • iostat:监控 I/O 状态
  • netstat/ss:监控网络状态
  • sar:收集系统性能数据
  • prometheus + grafana:监控系统参数并可视化

8.2 内核参数的自动化管理

使用配置管理工具

  • Ansible:使用 Ansible 管理内核参数
# ansible playbook 示例
---
- hosts: all
  become: yes
  tasks:
    - name: 配置内核参数
      sysctl:
        name: "{{ item.name }}"
        value: "{{ item.value }}"
        state: present
        reload: yes
      with_items:
        - { name: "net.ipv4.ip_forward", value: "1" }
        - { name: "vm.swappiness", value: "10" }
        - { name: "fs.file-max", value: "65536" }
  • Puppet:使用 Puppet 管理内核参数
# puppet 配置示例
class sysctl {
  sysctl::value {
    'net.ipv4.ip_forward':
      value => '1';
    'vm.swappiness':
      value => '10';
    'fs.file-max':
      value => '65536';
  }
}
  • Chef:使用 Chef 管理内核参数
# chef recipe 示例
sysctl 'net.ipv4.ip_forward' do
  value '1'
end

sysctl 'vm.swappiness' do
  value '10'
end

sysctl 'fs.file-max' do
  value '65536'
end

9. 内核参数的版本兼容性

9.1 内核参数的版本差异

不同版本的 Linux 内核可能会有不同的内核参数:

  • 新增参数:新版本内核可能会添加新的参数
  • 废弃参数:旧版本内核中的参数可能会被废弃
  • 修改参数:参数的默认值或行为可能会被修改

9.2 检查参数的版本兼容性

检查参数是否存在

# 使用 sysctl 命令检查
sysctl -a | grep parameter_name

# 检查 /proc/sys 目录
exists /proc/sys/path/to/parameter

# 查看内核文档
# 内核文档通常位于 /usr/share/doc/linux-doc-*/Documentation/ 目录
# 或在线查看:https://www.kernel.org/doc/Documentation/

检查内核版本

# 查看当前内核版本
uname -r

# 查看内核配置
cat /boot/config-$(uname -r) | grep CONFIG_

# 查看内核特性
cat /proc/version
cat /proc/sys/kernel/version

实用案例分析

案例 1:Web 服务器内核参数调优

场景描述

搭建一个高并发的 Web 服务器,需要优化内核参数以提高性能和稳定性。

解决方案

步骤 1:分析服务器硬件和工作负载

# 查看服务器硬件信息
lscpu
free -h
hdparm -I /dev/sda

# 查看当前系统负载
top -b -n 1
vmstat 1 5

步骤 2:优化网络参数

# 创建网络参数配置文件
sudo nano /etc/sysctl.d/50-web-server.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.ipv4.ip_local_port_range = 1024 65535

# 网络缓冲区
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216

# 保存文件并退出

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

步骤 3:优化内存参数

# 添加内存参数到配置文件
sudo nano /etc/sysctl.d/50-web-server.conf

# 内存参数
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
vm.min_free_kbytes = 65536

# 保存文件并退出

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

步骤 4:优化文件系统参数

# 添加文件系统参数到配置文件
sudo nano /etc/sysctl.d/50-web-server.conf

# 文件系统参数
fs.file-max = 655360
fs.inotify.max_user_watches = 524288

# 保存文件并退出

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

# 修改文件描述符限制
sudo nano /etc/security/limits.conf

# 添加以下行
* soft nofile 65536
* hard nofile 655360
root soft nofile 65536
root hard nofile 655360

# 保存文件并退出

步骤 5:优化内核命令行参数

# 编辑 GRUB 配置文件
sudo nano /etc/default/grub

# 修改 GRUB_CMDLINE_LINUX 行
GRUB_CMDLINE_LINUX="quiet splash elevator=deadline transparent_hugepage=never"

# 保存文件并退出

# 更新 GRUB 配置
sudo update-grub

# 重启系统
sudo reboot

步骤 6:测试优化效果

# 测试网络性能
iperf3 -s &
iperf3 -c localhost -t 60 -P 8

# 测试 Web 服务器性能
# 使用 ab (Apache Benchmark) 测试
ab -n 10000 -c 100 http://localhost/

# 监控系统状态
top
iostat -x 1
vmstat 1

案例 2:数据库服务器内核参数调优

场景描述

搭建一个数据库服务器(如 MySQL、PostgreSQL),需要优化内核参数以提高数据库性能和稳定性。

解决方案

步骤 1:分析数据库服务器的需求

数据库服务器通常需要:

  • 大量的内存
  • 快速的 I/O 性能
  • 稳定的网络连接
  • 低延迟的响应时间

步骤 2:优化内存参数

# 创建数据库服务器配置文件
sudo nano /etc/sysctl.d/50-database.conf

# 内存参数
# 减少交换使用
vm.swappiness = 1

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

# 增加内存映射区域数量
vm.max_map_count = 262144

# 启用内存过度分配
vm.overcommit_memory = 1
vm.overcommit_ratio = 90

# 禁用透明大页(对数据库性能有负面影响)
# 在 GRUB 配置中设置:transparent_hugepage=never

# 保存文件并退出

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

步骤 3:优化 I/O 参数

# 添加 I/O 参数到配置文件
sudo nano /etc/sysctl.d/50-database.conf

# I/O 调度器
# 在 GRUB 配置中设置:elevator=deadline 或 elevator=cfq

# 块设备参数
# 对于 SSD,启用 NCQ
# echo 1 > /sys/block/sda/queue/scheduler

# 保存文件并退出

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

步骤 4:优化网络参数

# 添加网络参数到配置文件
sudo nano /etc/sysctl.d/50-database.conf

# 网络参数
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.core.somaxconn = 4096

# 保存文件并退出

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

步骤 5:优化文件系统参数

# 添加文件系统参数到配置文件
sudo nano /etc/sysctl.d/50-database.conf

# 文件系统参数
fs.file-max = 655360

# 保存文件并退出

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

# 修改文件描述符限制
sudo nano /etc/security/limits.conf

# 添加以下行
* soft nofile 65536
* hard nofile 655360
mysql soft nofile 65536
mysql hard nofile 655360

# 保存文件并退出

步骤 6:优化内核命令行参数

# 编辑 GRUB 配置文件
sudo nano /etc/default/grub

# 修改 GRUB_CMDLINE_LINUX 行
GRUB_CMDLINE_LINUX="quiet splash elevator=deadline transparent_hugepage=never"

# 保存文件并退出

# 更新 GRUB 配置
sudo update-grub

# 重启系统
sudo reboot

步骤 7:测试数据库性能

# 测试数据库性能
# MySQL 示例
mysql -u root -p -e "CREATE DATABASE test_db; USE test_db; CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(255));"

# 使用 sysbench 测试 MySQL 性能
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
mysqladmin extended-status -u root -p | grep -E 'Innodb_buffer_pool|Queries|Threads'

案例 3:高流量网络服务器内核参数调优

场景描述

搭建一个高流量的网络服务器(如反向代理、负载均衡器),需要优化内核参数以处理大量的网络连接和流量。

解决方案

步骤 1:分析网络服务器的需求

高流量网络服务器通常需要:

  • 处理大量的并发连接
  • 快速的网络数据包处理
  • 高效的 TCP 连接管理
  • 稳定的网络性能

步骤 2:优化网络参数

# 创建网络服务器配置文件
sudo nano /etc/sysctl.d/50-network-server.conf

# 网络参数
# TCP 相关参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0  # 注意:在 NAT 环境中应禁用
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_max_orphans = 32768
net.ipv4.tcp_fastopen = 3

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

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

# 网络缓冲区
net.core.wmem_default = 16777216
net.core.rmem_default = 16777216
net.core.wmem_max = 33554432
net.core.rmem_max = 33554432
net.ipv4.tcp_wmem = 4096 12582912 33554432
net.ipv4.tcp_rmem = 4096 12582912 33554432

# 保存文件并退出

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

步骤 3:优化内存和文件系统参数

# 添加内存和文件系统参数
sudo nano /etc/sysctl.d/50-network-server.conf

# 内存参数
vm.swappiness = 10

# 文件系统参数
fs.file-max = 1048576
fs.inotify.max_user_watches = 524288

# 保存文件并退出

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

# 修改文件描述符限制
sudo nano /etc/security/limits.conf

# 添加以下行
* soft nofile 65536
* hard nofile 1048576
root soft nofile 65536
root hard nofile 1048576

# 保存文件并退出

步骤 4:优化内核命令行参数

# 编辑 GRUB 配置文件
sudo nano /etc/default/grub

# 修改 GRUB_CMDLINE_LINUX 行
GRUB_CMDLINE_LINUX="quiet splash elevator=deadline net.core.somaxconn=8192"

# 保存文件并退出

# 更新 GRUB 配置
sudo update-grub

# 重启系统
sudo reboot

步骤 5:测试网络服务器性能

# 测试网络连接数
netstat -ant | wc -l
netstat -ant | grep ESTABLISHED | wc -l

# 测试网络性能
iperf3 -s &
iperf3 -c localhost -t 60 -P 16

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

# 监控网络状态
ss -s
netstat -s
iftop

最佳实践

  1. 了解参数含义:在修改内核参数之前,一定要了解参数的含义和影响

  2. 循序渐进:不要一次性修改太多参数,应该逐步修改并测试效果

  3. 备份配置:修改配置文件之前,备份原始配置文件

  4. 测试验证:修改参数后,一定要测试验证效果

  5. 持久化配置:将修改的参数写入配置文件,确保系统重启后仍然生效

  6. 监控效果:使用监控工具监控参数修改后的效果

  7. 文档记录:记录修改的参数、修改原因和测试结果

  8. 版本兼容:注意不同内核版本之间参数的差异

  9. 安全优先:在性能优化的同时,不要牺牲系统的安全性

  10. 参考官方文档:参考 Linux 内核官方文档和应用程序的推荐配置

总结

本教程详细介绍了 Linux 内核参数的配置方法,包括参数的分类、修改方式、持久化配置以及常见参数的调优。通过学习,读者可以掌握内核参数的管理和优化技能,提高系统的性能和稳定性。

内核参数配置是 Linux 系统管理的重要组成部分,合理的参数配置可以显著提高系统的性能和稳定性,而不当的配置则可能导致系统问题甚至崩溃。因此,在修改内核参数时,应该谨慎行事,充分了解参数的含义和影响,逐步修改并测试效果。

同时,内核参数的配置应该根据系统的具体需求和硬件环境进行调整,不同类型的系统(如 Web 服务器、数据库服务器、网络服务器)需要不同的参数配置。通过不断学习和实践,读者可以逐步掌握内核参数的调优技巧,成为 Linux 系统管理的专家。

« 上一篇 内核编译与安装 下一篇 » 内核调试技术