Skip to content

jiaqp/one_swap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Linux服务器虚拟内存专业级优化脚本

Version License Platform

使用业界标准测试工具和商业级算法,自动优化Linux服务器虚拟内存配置


🚀 快速开始

一键安装运行

wget -qO- https://raw.githubusercontent.com/jiaqp/one_swap/refs/heads/main/optimize_virtual_memory.sh | sudo bash

或使用curl:

curl -fsSL https://raw.githubusercontent.com/jiaqp/one_swap/refs/heads/main/optimize_virtual_memory.sh | sudo bash

✨ 核心特性

🔬 精准性能测试

  • CPU测试:Sysbench单线程测试(对标 spiritLHLS/ecs 项目)
  • 内存测试:Sysbench读取带宽测试(对标Lemonbench标准)
  • 磁盘测试:FIO专业工具,直接模式绕过缓存,测试真实4K IOPS

🧮 商业级优化算法

  • ✅ 基于 Google SRE、Red Hat Enterprise、Oracle Linux 最佳实践
  • ✅ 智能虚拟化环境检测和针对性优化
  • ✅ 多因子加权模型:磁盘IOPS主导(90%)+ CPU/内存微调(10%)
  • ✅ 自动计算10个关键VM参数

🤖 全自动化

  • ✅ 自动检测并安装依赖工具
  • ✅ 自动运行性能测试(约1分钟)
  • ✅ 自动对比当前配置与推荐配置
  • ✅ 自动应用优化(3秒倒计时)
  • ✅ 自动备份原配置文件

📊 优化的虚拟内存参数

参数 说明 优化依据
vm.swappiness Swap使用倾向 基于RAM大小和磁盘IOPS
Swap大小 交换空间容量 三因子模型(CPU+内存+磁盘)
vm.vfs_cache_pressure 缓存回收策略 基于磁盘IOPS
vm.dirty_ratio 脏页上限 基于RAM大小和写入IOPS
vm.dirty_background_ratio 后台写回阈值 dirty_ratio的1/4
vm.dirty_expire_centisecs 脏页过期时间 基于写入IOPS
vm.dirty_writeback_centisecs 写回间隔 基于磁盘类型
vm.min_free_kbytes 最小空闲内存 基于RAM大小和CPU核心数
vm.page_cluster Swap页面聚簇 基于磁盘类型
vm.overcommit_memory/ratio 内存超额策略 基于RAM大小

🎯 适用场景

✅ 推荐使用

  • Web服务器(Nginx、Apache)
  • 应用服务器(Java、Python、Node.js)
  • 数据库服务器(MySQL、PostgreSQL、MongoDB)
  • 容器主机(Docker、Kubernetes)
  • 虚拟化宿主机(KVM、Xen)
  • VPS/云服务器

⚠️ 特别优化

  • 极小内存环境(<1GB):自动采用激进swap策略,避免OOM
  • 虚拟化环境:自动检测并针对低IOPS优化
  • 低性能磁盘:自动增加swap缓冲,降低swappiness

📋 系统要求

支持的操作系统

  • ✅ Ubuntu 16.04+
  • ✅ Debian 8+
  • ✅ CentOS/RHEL 7+
  • ✅ Rocky Linux 8+
  • ✅ AlmaLinux 8+
  • ✅ 其他主流Linux发行版

依赖工具(自动安装)

  • fio - 专业存储性能测试
  • sysbench - 综合性能基准测试
  • bc - 数学计算
  • sysctl - 系统参数配置

🔍 工作流程

1️⃣  检测root权限和依赖工具
     ↓
2️⃣  执行深度性能测试
     ├─ CPU:Sysbench单线程测试(5秒)
     ├─ 内存:Sysbench读取带宽测试(5秒)
     └─ 磁盘:FIO 4K IOPS测试(30秒)
     ↓
3️⃣  商业级算法计算最优参数
     ├─ Swap大小(三因子加权模型)
     ├─ Swappiness值
     └─ 8个高级VM参数
     ↓
4️⃣  对比当前配置与推荐配置
     └─ 显示差异,标注需要变更的参数
     ↓
5️⃣  自动应用优化
     ├─ 备份原配置到 /etc/sysctl.conf.backup.*
     ├─ 实时应用参数(立即生效)
     ├─ 写入 /etc/sysctl.conf(永久生效)
     └─ 管理Swap空间

📖 使用示例

基础使用(自动模式)

# 下载并执行(自动应用所有优化)
wget -qO- https://raw.githubusercontent.com/jiaqp/one_swap/refs/heads/main/optimize_virtual_memory.sh | sudo bash

手动下载后执行

# 下载脚本
wget https://raw.githubusercontent.com/jiaqp/one_swap/refs/heads/main/optimize_virtual_memory.sh

# 添加执行权限
chmod +x optimize_virtual_memory.sh

# 运行脚本
sudo ./optimize_virtual_memory.sh

禁用颜色输出

wget https://raw.githubusercontent.com/jiaqp/one_swap/refs/heads/main/optimize_virtual_memory.sh
sudo bash optimize_virtual_memory.sh --no-color

📈 示例输出

╔═══════════════════════════════════════════════════════════════════╗
║                     系统硬件配置信息                              ║
╚═══════════════════════════════════════════════════════════════════╝

CPU:
  Intel(R) Xeon(R) CPU E5-2683 v4 @ 2.10GHz
  核心数: 1, 频率: 2099 MHz
  性能: 802 events/sec ⭐优化关键指标

内存:
  容量: 0.45 GB
  类型: DDR4-2400 ECC
  读取带宽: 17999 MB/s ⭐优化关键指标

磁盘:
  设备: /dev/vda (HDD)
  类型: 7200 RPM SATA HDD
  虚拟化: 是(宿主机SSD,虚拟盘IOPS受限)
  顺序读取: 3190 MB/s
  4K随机IOPS: 读100 / 写80 ⭐优化关键指标

╔═══════════════════════════════════════════════════════════════════╗
║                   商业级优化参数推荐                              ║
╚═══════════════════════════════════════════════════════════════════╝

核心参数:
  vm.swappiness                = 45
  推荐Swap大小                 = 940 MB (.91 GB)

脏页管理参数:
  vm.dirty_ratio               = 5
  vm.dirty_background_ratio    = 3
  vm.dirty_expire_centisecs    = 3000
  vm.dirty_writeback_centisecs = 500

内存管理参数:
  vm.vfs_cache_pressure        = 50
  vm.min_free_kbytes           = 16384 KB
  vm.page_cluster              = 3
  vm.overcommit_memory         = 2
  vm.overcommit_ratio          = 50

🛡️ 安全特性(v3.1 增强)

  • 自动备份:修改前自动备份 /etc/sysctl.conf
  • 磁盘空间检测:空间不足时跳过备份但仍应用配置
  • 参数验证:所有参数都有合理范围限制
  • 分阶段应用:先应用安全参数 → 创建swap → 再应用overcommit
  • 安全检查:应用前检查可用内存、磁盘空间、系统状态
  • 自动回滚:检测到内存分配失败时自动恢复安全设置
  • 永不使用overcommit_memory=2:避免严格限制导致无法分配内存
  • 小内存保护:极小内存系统不降低min_free_kbytes
  • 可回滚:保留原配置备份,可随时恢复

🆘 紧急情况处理

如果遇到 "Cannot allocate memory" 错误,请查看 紧急恢复指南


🔧 高级选项

手动回滚配置

# 查找备份文件
ls -lt /etc/sysctl.conf.backup.*

# 恢复原配置
sudo cp /etc/sysctl.conf.backup.YYYYMMDD_HHMMSS /etc/sysctl.conf
sudo sysctl -p

禁用颜色输出

sudo bash optimize_virtual_memory.sh --no-color

📚 技术文档

算法原理

Swap大小计算

optimal_swap = base_swap × cpu_factor × mem_speed_factor × disk_factor

其中:
- base_swap: 基于RAM大小(<1GB为RAM×1.4)
- cpu_factor: 0.97-1.03(基于CPU性能)
- mem_speed_factor: 0.98-1.02(基于内存带宽)
- disk_factor: 0.70-1.45(基于磁盘IOPS,主导因素)

Swappiness计算

swappiness = base_swappiness + disk_adjustment

其中:
- base_swappiness: 60→40→30→20→10→5→1(基于RAM大小)
- disk_adjustment: -20到+2(基于磁盘IOPS)

性能测试标准

参考项目:spiritLHLS/ecs - 业界知名的VPS测评标准

  • CPU: Sysbench CPU测试(素数10000,5秒)
  • 内存: Sysbench Memory读取测试
  • 磁盘: FIO 4K随机IOPS测试(Direct模式)

⚠️ 注意事项

  1. 需要root权限:脚本需要修改系统配置
  2. 测试时间:完整测试约需1分钟
  3. 磁盘IO:测试期间会产生磁盘IO负载
  4. 自动应用:脚本会自动应用优化,3秒倒计时
  5. 重启建议:优化后建议重启系统以确保所有设置完全生效

🔧 版本历史

v3.1 (2024-12-13) - 安全性增强

  • 🛡️ 修复关键bug:永不使用 overcommit_memory=2,避免内存分配失败
  • 🔄 优化应用顺序:分阶段应用参数(安全参数 → 创建swap → overcommit)
  • 🛡️ 小内存保护:极小内存系统(<512MB)不降低 min_free_kbytes
  • 安全检查机制:应用前检查内存、磁盘、系统状态
  • 🔙 自动回滚:检测到问题时自动恢复安全设置
  • 📚 紧急恢复指南:提供详细的故障恢复步骤

v3.0 (2024-12-10)

  • 初始发布,业界标准测试+商业级算法

🤝 贡献

欢迎提交Issue和Pull Request!


📄 许可证

MIT License


🙏 致谢

  • spiritLHLS/ecs - CPU测试标准参考
  • LemonBench - 内存测试标准参考
  • Google SRE、Red Hat、Oracle - 优化算法参考

📞 联系方式

如有问题或建议,请提交Issue。


⭐ 如果这个项目对您有帮助,请给一个Star!⭐

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages