侧边栏壁纸
  • 累计撰写 11 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

给VPS增加虚拟内存Swap

Joe
Joe
2025-01-29 / 0 评论 / 3 点赞 / 117 阅读 / 0 字

有时候VPS内存不够,跑点东西容易卡或者被杀进程,这时候要么加钱加内存要么换机,免费的方法就是给Swap,将硬盘的空间用来当作Swap,确保我们有足够的内存。

查看swap分区

首先,先查看现有的Swap分区

free -h     #查看Swap分区

这里一般会出现两种情况

  • 没有设置过Swap

               total        used        free      shared  buff/cache   available
Mem:           173Mi       138Mi       6.0Mi       0.0Ki        28Mi        28Mi
Swap:             0B          0B          0B
  • 设置过Swap

               total        used        free      shared  buff/cache   available
Mem:           173Mi       133Mi       6.0Mi       0.0Ki        33Mi        33Mi
Swap:          511Mi       9.0Mi       502Mi

设置过Swap,如果要新增Swap,那么就要先删除原有Swap交换分区。

swapoff -a     #删除swap交换分区

删除后再执行free -h ,如果为0,说明删除成功。此处不是删除Swap,如果要删除Swap请往下看。

手动添加 Swap

  • 创建 Swap 文件

假设你想创建一个 512MB 的 Swap 文件,命令如下

sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=512 status=progress

/mnt/swapfile 是 Swap 文件的路径,512 是文件大小(单位是 MB),可以根据需要调整。status=progressdd 命令的一个选项,用于在数据复制过程中显示实时的进度信息。它显示了复制的数据量和速度,可以帮助用户了解命令执行的进展情况。不想要看可以自行删除。

  • 设置文件的权限为 600,确保只有 root 用户可以访问

sudo chmod 600 /mnt/swapfile
  • 将文件格式化为 Swap

使用 mkswap 命令将文件格式化为 Swap

sudo mkswap /mnt/swapfile
  • 启用 Swap

sudo swapon /mnt/swapfile
  • 永久生效(可选)

为了确保 Swap 文件在系统重启后仍然生效,需要将其添加到 /etc/fstab 文件中。执行以下命令

echo '/mnt/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

或者手动添加(其实不想写这点,但我比较喜欢这种方式)

nano /etc/fstab

/mnt/swapfile none swap sw 0 0

输入free -h查看分区,可以看到Swap显示512M。

手动删除 Swap

  • 禁用 Swap

如果想删除现有的 Swap 文件,首先需要禁用它。假设要删除的文件是 /mnt/swapfile,执行以下命令禁用 Swap

sudo swapoff /mnt/swapfile
  • 删除 Swap 文件

禁用后,删除 Swap 文件

sudo rm /mnt/swapfile
  • /etc/fstab 中移除 Swap 配置(可选)

如果你在 /etc/fstab 中添加了 Swap 文件配置,需要将其删除。可以使用 sed 命令

sudo sed -i '/\/mnt\/swapfile/d' /etc/fstab

输入free -h查看分区,可以看到Swap显示0。

自助添加或者删除Swap脚本

如果觉得手动麻烦,可以用脚本添加或者删除Swap。脚本可以用于在VPS中按指定大小(以MB为单位)增加或删除Swap分区。脚本会根据用户输入创建或删除Swap文件,并更新系统配置。

#!/bin/bash

SWAPFILE="/swapfile"

# 颜色输出
GREEN="\033[32m"
RED="\033[31m"
YELLOW="\033[33m"
NC="\033[0m" # No Color

# 错误退出函数
error_exit() {
    echo -e "${RED}错误:${NC} $1"
    exit 1
}

# 检查是否是 root 用户
if [ "$(id -u)" != "0" ]; then
    error_exit "请使用 root 权限执行本脚本"
fi

# 检查当前 Swap 是否存在
swap_exists() {
    swapon --show | grep -q "$SWAPFILE"
}

# 添加或扩展 Swap
add_swap() {
    read -p "请输入 Swap 总大小(MB): " size

    # 确保输入是正整数
    if ! [[ "$size" =~ ^[0-9]+$ ]]; then
        error_exit "请输入有效的 Swap 大小(单位:MB)"
    fi

    # 检查磁盘空间
    local free_space=$(df -m / | awk 'NR==2 {print $4}')
    if [ "$free_space" -lt "$size" ]; then
        error_exit "磁盘空间不足,可用空间:${free_space}MB,需求:${size}MB"
    fi

    # 如果 Swap 已存在,则扩展 Swap
    if swap_exists; then
        current_size=$(free -m | awk '/Swap:/ {print $2}')
        if [ "$size" -le "$current_size" ]; then
            echo -e "${YELLOW}当前 Swap 已为 ${current_size}MB,无需扩展${NC}"
            return
        fi

        echo -e "${YELLOW}正在扩展 Swap,从 ${current_size}MB 扩展到 ${size}MB${NC}"
        swapoff "$SWAPFILE"
        dd if=/dev/zero of="$SWAPFILE" bs=1M count="$size" status=progress
        chmod 600 "$SWAPFILE"
        mkswap "$SWAPFILE"
        swapon "$SWAPFILE"

        echo -e "${GREEN}Swap 已成功扩展至 ${size}MB${NC}"
    else
        echo -e "${GREEN}正在创建 ${size}MB Swap 文件...${NC}"
        if command -v fallocate &>/dev/null; then
            fallocate -l "${size}M" "$SWAPFILE" || { echo "fallocate 失败,回退到 dd"; dd if=/dev/zero of="$SWAPFILE" bs=1M count="$size" status=progress; }
        else
            dd if=/dev/zero of="$SWAPFILE" bs=1M count="$size" status=progress
        fi

        chmod 600 "$SWAPFILE"
        mkswap "$SWAPFILE"
        swapon "$SWAPFILE"

        # 持久化 Swap
        if ! grep -q "^$SWAPFILE" /etc/fstab; then
            echo "$SWAPFILE none swap sw 0 0" >> /etc/fstab
            echo -e "${GREEN}Swap 持久化成功!${NC} 已自动添加到 /etc/fstab"
        fi

        echo -e "${GREEN}Swap 已成功增加至 ${size}MB${NC}"
    fi

    show_status
}

# 删除 Swap
remove_swap() {
    if swap_exists; then
        echo -e "${YELLOW}正在关闭 Swap...${NC}"
        swapoff "$SWAPFILE" || error_exit "swapoff 失败"
    fi

    if [ -f "$SWAPFILE" ]; then
        rm -f "$SWAPFILE" || error_exit "删除 Swap 文件失败"
        echo -e "${GREEN}Swap 文件已删除${NC}"
        
        # 清理 fstab
        if grep -q "^$SWAPFILE" /etc/fstab; then
            sed -i "\|^$SWAPFILE|d" /etc/fstab
            echo -e "${GREEN}已从 /etc/fstab 中移除 Swap 条目${NC}"
        fi
    else
        echo -e "${YELLOW}未找到 Swap 文件${NC}"
    fi

    show_status
}

# 显示 Swap 状态
show_status() {
    echo -e "\n${GREEN}当前内存和 Swap 使用情况:${NC}"
    free -h
    swapon --show
}

# 交互式菜单
main_menu() {
    while true; do
        echo -e "\n${GREEN}===== Swap 管理菜单 =====${NC}"
        echo -e "1) 添加或扩展 Swap"
        echo -e "2) 删除 Swap"
        echo -e "3) 查看 Swap 状态"
        echo -e "0) 退出"
        read -p "请选择操作 [0-3]: " choice

        case "$choice" in
            1) add_swap ;;
            2) remove_swap ;;
            3) show_status ;;
            0) echo -e "${YELLOW}退出程序...${NC}"; exit 0 ;;
            *) echo -e "${RED}无效输入,请输入 0-3${NC}" ;;
        esac
    done
}

# 运行交互式菜单
main_menu

使用说明

  1. 保存脚本: 将脚本保存为 swap.sh

  2. 赋予执行权限

    chmod +x swap.sh
  3. 运行脚本

    sudo ./swap.sh

功能说明

  1. 增加Swap:

    • 用户输入增加的大小(以MB为单位)。

    • 脚本会创建指定大小的Swap文件,启用并添加到 /etc/fstab

  2. 删除Swap:

    • 脚本会禁用并删除该Swap文件,同时从 /etc/fstab 中移除。

运行完成后,可以通过以下命令查看当前Swap信息

free -h     #查看Swap分区

为什么添加 Swap

  1. 缓解内存压力:
    当系统物理内存(RAM)不足时,Swap 会作为临时的“溢出空间”,让系统在内存不足的情况下继续运行。即使实际的物理内存被用完,系统依然可以通过 Swap 文件或 Swap 分区来存储不常用的内存数据,避免应用程序因内存不足而崩溃或停止响应。

  2. 提高系统稳定性:
    Swap 作为一种“保险”机制,可以避免因内存耗尽导致的系统崩溃或死机,尤其在同时运行多个程序或处理大量数据时,Swap 能确保系统在内存压力大时依然能够正常运行。

  3. 优化多任务处理:
    在同时运行多个应用程序或大量进程时,Swap 可以帮助管理内存,尤其是在物理内存有限的情况下,允许更多任务同时运行。虽然从性能上来说,Swap 比物理内存要慢,但在内存需求过大的情况下,它能有效保障系统的多任务处理能力。

  4. 支持 hibernation(休眠):
    如果你希望在 Linux 系统上使用休眠功能(hibernation),那么 Swap 分区或 Swap 文件必须大于或等于系统内存的大小。这是因为休眠时,系统会将内存中的所有数据保存到 Swap 中,因此需要足够的 Swap 空间来存储数据。

  5. 提升低内存机器的性能:
    对于一些内存较小的 VPS 或虚拟机,添加 Swap 空间可以显著提升系统在高负载下的表现。通过提供额外的虚拟内存,Swap 能让系统在内存资源较少时依然能够运行大多数应用程序。

总结

添加 Swap 是确保系统在内存资源紧张时保持稳定运行的一种有效手段。虽然 Swap 的访问速度比物理内存慢,但它提供了一种在内存不足时“补充”的方式,避免了系统崩溃的风险,尤其在处理多任务或高负载时,具有不可忽视的作用。

3

评论区