以下是一个用于自动优化Linux内核参数的Shell脚本,结合系统检测、参数备份和智能调整功能,适用于生产环境:
#!/bin/bash
# Linux内核参数自动优化脚本
# 功能:根据系统配置自动调整内核参数,提升性能与安全性
# 配置参数
SYSCTL_CONF="/etc/sysctl.conf"
BACKUP_DIR="/etc/sysctl.d/backup-$(date +%Y%m%d)"
CURRENT_PROFILE="/etc/profile"
NEED_REBOOT=0
# 颜色定义
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'
# 检测是否为root用户
check_root() {
if [ "$(id -u)" != "0" ]; then
echo -e "${RED}错误:此脚本必须使用root权限运行!${RESET}"
exit 1
fi
}
# 备份原始配置
backup_config() {
mkdir -p "$BACKUP_DIR"
cp "$SYSCTL_CONF" "${BACKUP_DIR}/sysctl.conf.bak"
echo -e "${GREEN}已备份原始配置到:${BACKUP_DIR}${RESET}"
}
# 应用新配置
apply_settings() {
sysctl -p >/dev/null 2>&1
sysctl --system >/dev/null 2>&1
}
# 内存相关优化
optimize_memory() {
local total_mem=$(grep MemTotal /proc/meminfo | awk '{print $2}')
cat << EOF >> "$SYSCTL_CONF"
# Memory Optimization
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.overcommit_ratio = $(( total_mem > 16000000 ? 95 : 80 ))
EOF
}
# 网络相关优化
optimize_network() {
local max_conn=$(( $(nproc) * 5000 ))
cat << EOF >> "$SYSCTL_CONF"
# Network Optimization
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 1024 65535
EOF
}
# 文件系统优化
optimize_fs() {
cat << EOF >> "$SYSCTL_CONF"
# Filesystem Optimization
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
fs.aio-max-nr = 1048576
EOF
}
# 安全增强设置
security_settings() {
cat << EOF >> "$SYSCTL_CONF"
# Security Enhancement
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
kernel.kptr_restrict = 2
kernel.perf_event_paranoid = 2
EOF
}
# 硬件相关优化
hardware_optimize() {
local disk_type=$(lsblk -d -o rota | awk 'NR==2{print $1}')
if [ "$disk_type" == "0" ]; then
echo "# SSD Optimization" >> "$SYSCTL_CONF"
echo "vm.dirty_writeback_centisecs = 6000" >> "$SYSCTL_CONF"
fi
}
# 应用全局配置
apply_global() {
echo "# Global Settings" >> "$SYSCTL_CONF"
echo "kernel.sysrq = 0" >> "$SYSCTL_CONF"
echo "net.ipv4.tcp_syncookies = 1" >> "$SYSCTL_CONF"
}
# 生成配置
generate_config() {
{
echo "# Generated by AutoTune Script $(date)"
optimize_memory
optimize_network
optimize_fs
security_settings
hardware_optimize
apply_global
} >> "$SYSCTL_CONF"
}
# 检查变更是否生效
verify_changes() {
local key=$1
local expected=$2
local current=$(sysctl -n $key)
if [ "$current" != "$expected" ]; then
echo -e "${RED}错误:参数 $key 未生效 (当前值:$current)${RESET}"
return 1
fi
return 0
}
# 系统服务重启提示
check_services() {
if sysctl -p | grep -q "vm.swappiness = 10"; then
echo -e "${GREEN}内存参数已生效${RESET}"
else
NEED_REBOOT=1
echo -e "${YELLOW}部分参数需要重启系统才能生效${RESET}"
fi
}
# 主执行流程
main() {
check_root
backup_config
generate_config
apply_settings
# 验证关键参数
verify_changes "vm.swappiness" "10"
verify_changes "net.core.somaxconn" "65535"
verify_changes "fs.file-max" "2097152"
check_services
if [ "$NEED_REBOOT" -eq 1 ]; then
echo -e "\n${YELLOW}建议执行重启以应用所有参数变更${RESET}"
fi
echo -e "\n${GREEN}内核优化完成,详细变更:"
diff "${BACKUP_DIR}/sysctl.conf.bak" "$SYSCTL_CONF"
}
# 执行主函数
main
脚本功能说明
1、智能参数调整
根据内存大小自动计算vm.overcommit_ratio
检测磁盘类型(SSD/HDD)应用不同优化
根据CPU核心数计算最大连接数
2、安全增强措施
禁用内核sysrq功能
限制内核性能监控
启用TCP SYN Cookie防护
3、验证机制
关键参数生效检查
变更差异对比显示
重启必要性提示
使用说明
1、保存脚本
sudo nano /usr/local/bin/kernel_tuner.sh
2、设置执行权限
sudo chmod +x /usr/local/bin/kernel_tuner.sh
3、执行优化
sudo /usr/local/bin/kernel_tuner.sh
4、查看变更记录
ls -l /etc/sysctl.d/backup-*
优化参数说明
参数类别 | 关键参数 | 优化效果 |
---|
内存优化 | vm.swappiness=10 | 减少Swap使用,优先使用物理内存 |
网络优化 | net.core.somaxconn=65535 | 提升并发连接处理能力 |
文件系统优化 | fs.file-max=2097152 | 增加系统最大文件打开数 |
安全增强 | kernel.kptr_restrict=2 | 防止内核地址泄露 |
SSD专项优化 | vm.dirty_writeback_centisecs=6000 | 优化SSD写入策略 |
恢复方法
# 恢复原始配置
sudo cp /etc/sysctl.d/backup-*/sysctl.conf.bak /etc/sysctl.conf
sudo sysctl -p
注意事项
1、硬件差异
生产环境需根据实际硬件配置调整参数
虚拟机环境需要额外考虑虚拟化驱动优化
2、内核版本兼容
部分参数在旧内核中不可用(建议内核≥3.10)
3、监控验证
# 验证网络参数
ss -ltn | grep 'LISTEN'
# 查看内存设置
sysctl -a | grep vm.swappiness
通过此脚本可以快速完成内核级调优,建议在变更前后进行性能基准测试(如使用sysbench),并根据业务负载进行参数微调。