开发工具

以下是一个用于自动优化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),并根据业务负载进行参数微调。