# ---------------------------- # 根据内存大小决定 swap 大小 if [ "$mem_total" -lt 2048 ]; then swap_target=2048 elif [ "$mem_total" -lt 8192 ]; then swap_target=$mem_total else swap_target=4096 fi echo"Initial calculated swap target: ${swap_target} MB"
# ---------------------------- # 检查根挂载点剩余空间 root_avail=$(df --output=avail / | tail -1 | awk '{print int($1/1024)}') echo"Available disk space on / : ${root_avail} MB"
# 如果 swap 大于剩余空间的80%,调整 max_swap=$((root_avail * 80 / 100)) if [ "$swap_target" -gt "$max_swap" ]; then swap_target=$max_swap echo"Adjusted swap to ${swap_target} MB to fit disk capacity (80%)." fi
# ---------------------------- # 如果还有老 swapfile,先移除 if swapon --summary | grep -q '/swapfile'; then echo"Existing /swapfile found, turning off swap." sudo swapoff /swapfile sudo rm -f /swapfile fi # 删除多 swap 文件 for i in {1..4}; do if [ -f "/swapfile$i" ]; then sudo swapoff "/swapfile$i" sudo rm -f "/swapfile$i" fi done
# ---------------------------- # 多 swap 文件分摊 IO # 比如 如果 swap_target > 2GB,则分 2 个 swap 文件 files=1 if [ "$swap_target" -gt 2048 ]; then files=2 fi per_file=$((swap_target / files))
echo"Will create $files swap files, each ~${per_file} MB"
for i in $(seq 1 $files); do swapfile="/swapfile$i" echo"Creating $swapfile of size ${per_file} MB" sudo fallocate -l ${per_file}M "$swapfile" || sudo ddif=/dev/zero of="$swapfile" bs=1M count=$per_file sudo chmod 600 "$swapfile" sudo mkswap "$swapfile" sudo swapon "$swapfile" if ! grep -q "$swapfile" /etc/fstab; then echo"$swapfile swap swap defaults 0 0" | sudo tee -a /etc/fstab fi done
# 如果只有 1 个文件,命名为 /swapfile if [ "$files" -eq 1 ]; then mv"/swapfile1""/swapfile" sed -i 's|/swapfile1|/swapfile|g' /etc/fstab fi
# ---------------------------- # 调整 swappiness 和 cache pressure sudo sysctl vm.swappiness=10 sudo sysctl vm.vfs_cache_pressure=50 grep -q 'vm.swappiness' /etc/sysctl.conf || echo'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf grep -q 'vm.vfs_cache_pressure' /etc/sysctl.conf || echo'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
if [ -z "$speed" ]; then echo"IO speed detection failed, defaulting to 1 swap file." swap_files=1 elif [ "$speed" -lt 50 ]; then swap_files=1 elif [ "$speed" -lt 150 ]; then swap_files=2 else swap_files=3 fi echo"Measured disk speed: ${speed:-N/A} MB/s" echo"Will create ${swap_files} swap file(s)."
# ---------------------------- # 根据内存决定 swap 总大小 if [ "$mem_total" -lt 2048 ]; then swap_target=2048 elif [ "$mem_total" -lt 8192 ]; then swap_target=$mem_total else swap_target=4096 fi echo"Total swap target: ${swap_target} MB"
# ---------------------------- # 清理旧 swap echo"Cleaning old swap configurations..." sudo swapoff -a sudo sed -i '/swapfile/d' /etc/fstab for i in {1..5}; do [ -f "/swapfile$i" ] && sudo rm -f "/swapfile$i" done
# ---------------------------- # 分配 swap 文件 per_swap=$((swap_target / swap_files)) for i in $(seq 1 $swap_files); do file="/swapfile$i" echo"Creating $file of size ${per_swap} MB" sudo fallocate -l ${per_swap}M "$file" || sudo ddif=/dev/zero of="$file" bs=1M count=$per_swap sudo chmod 600 "$file" sudo mkswap "$file" sudo swapon "$file" echo"$file swap swap defaults 0 0" | sudo tee -a /etc/fstab done
# ---------------------------- # 启用 zram 并检测设备数量 echo"Installing zram (if needed)..." if ! command -v zramctl >/dev/null 2>&1; then sudo apt install -y zram-tools || sudo yum install -y zram fi