内核参数配置
核心知识点
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.cfg3. 内核参数的持久化配置
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 会按照以下顺序加载配置文件:
/etc/sysctl.conf(传统配置文件)/etc/sysctl.d/*.conf(按文件名字母顺序加载)
注意:如果不同配置文件中设置了相同的参数,后面加载的配置文件会覆盖前面的设置。因此,建议在 /etc/sysctl.d/ 目录中使用数字前缀命名配置文件,以控制加载顺序,例如 00-base.conf、50-network.conf、99-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.conf4.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.conf4.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.conf5. 内核命令行参数
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/cmdline6. 内核参数的验证与测试
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 cleanup7. 内核参数的故障排查
7.1 常见的参数配置问题
参数配置错误及解决方案:
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 参数值无效 | 参数值超出允许范围 | 查看参数的有效范围,设置正确的值 |
| 参数不存在 | 参数名称错误或内核版本不支持 | 检查参数名称是否正确,确认内核版本是否支持 |
| 参数无法修改 | 参数是只读的或需要特定权限 | 检查参数的属性,使用正确的权限修改 |
| 系统性能下降 | 参数配置不合理 | 恢复默认值,重新调优参数 |
| 系统不稳定 | 参数配置错误导致系统不稳定 | 恢复默认配置,重启系统 |
7.2 内核参数的恢复
恢复默认参数:
# 临时恢复单个参数
sysctl -w net.ipv4.ip_forward=0
# 恢复所有参数到默认值
# 重启系统
# 恢复配置文件中的参数
# 编辑配置文件,删除或注释掉修改的参数
sudo nano /etc/sysctl.d/99-custom.conf
# 应用配置
sudo sysctl -p安全模式启动:
如果内核参数配置错误导致系统无法正常启动,可以使用安全模式启动:
- 系统启动时,在 GRUB 菜单中选择 "Advanced options for Ubuntu"(或类似选项)
- 选择 "Recovery mode" 选项
- 在恢复菜单中选择 "root" 进入 root shell
- 修复配置文件中的错误
- 重启系统
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'
end9. 内核参数的版本兼容性
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最佳实践
了解参数含义:在修改内核参数之前,一定要了解参数的含义和影响
循序渐进:不要一次性修改太多参数,应该逐步修改并测试效果
备份配置:修改配置文件之前,备份原始配置文件
测试验证:修改参数后,一定要测试验证效果
持久化配置:将修改的参数写入配置文件,确保系统重启后仍然生效
监控效果:使用监控工具监控参数修改后的效果
文档记录:记录修改的参数、修改原因和测试结果
版本兼容:注意不同内核版本之间参数的差异
安全优先:在性能优化的同时,不要牺牲系统的安全性
参考官方文档:参考 Linux 内核官方文档和应用程序的推荐配置
总结
本教程详细介绍了 Linux 内核参数的配置方法,包括参数的分类、修改方式、持久化配置以及常见参数的调优。通过学习,读者可以掌握内核参数的管理和优化技能,提高系统的性能和稳定性。
内核参数配置是 Linux 系统管理的重要组成部分,合理的参数配置可以显著提高系统的性能和稳定性,而不当的配置则可能导致系统问题甚至崩溃。因此,在修改内核参数时,应该谨慎行事,充分了解参数的含义和影响,逐步修改并测试效果。
同时,内核参数的配置应该根据系统的具体需求和硬件环境进行调整,不同类型的系统(如 Web 服务器、数据库服务器、网络服务器)需要不同的参数配置。通过不断学习和实践,读者可以逐步掌握内核参数的调优技巧,成为 Linux 系统管理的专家。