有时候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=progress
是 dd
命令的一个选项,用于在数据复制过程中显示实时的进度信息。它显示了复制的数据量和速度,可以帮助用户了解命令执行的进展情况。不想要看可以自行删除。
设置文件的权限为 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
使用说明
保存脚本: 将脚本保存为
swap.sh
。赋予执行权限
chmod +x swap.sh
运行脚本
sudo ./swap.sh
功能说明
增加Swap:
用户输入增加的大小(以MB为单位)。
脚本会创建指定大小的Swap文件,启用并添加到
/etc/fstab
。
删除Swap:
脚本会禁用并删除该Swap文件,同时从
/etc/fstab
中移除。
运行完成后,可以通过以下命令查看当前Swap信息
free -h #查看Swap分区
为什么添加 Swap
缓解内存压力:
当系统物理内存(RAM)不足时,Swap 会作为临时的“溢出空间”,让系统在内存不足的情况下继续运行。即使实际的物理内存被用完,系统依然可以通过 Swap 文件或 Swap 分区来存储不常用的内存数据,避免应用程序因内存不足而崩溃或停止响应。提高系统稳定性:
Swap 作为一种“保险”机制,可以避免因内存耗尽导致的系统崩溃或死机,尤其在同时运行多个程序或处理大量数据时,Swap 能确保系统在内存压力大时依然能够正常运行。优化多任务处理:
在同时运行多个应用程序或大量进程时,Swap 可以帮助管理内存,尤其是在物理内存有限的情况下,允许更多任务同时运行。虽然从性能上来说,Swap 比物理内存要慢,但在内存需求过大的情况下,它能有效保障系统的多任务处理能力。支持 hibernation(休眠):
如果你希望在 Linux 系统上使用休眠功能(hibernation),那么 Swap 分区或 Swap 文件必须大于或等于系统内存的大小。这是因为休眠时,系统会将内存中的所有数据保存到 Swap 中,因此需要足够的 Swap 空间来存储数据。提升低内存机器的性能:
对于一些内存较小的 VPS 或虚拟机,添加 Swap 空间可以显著提升系统在高负载下的表现。通过提供额外的虚拟内存,Swap 能让系统在内存资源较少时依然能够运行大多数应用程序。
总结
添加 Swap 是确保系统在内存资源紧张时保持稳定运行的一种有效手段。虽然 Swap 的访问速度比物理内存慢,但它提供了一种在内存不足时“补充”的方式,避免了系统崩溃的风险,尤其在处理多任务或高负载时,具有不可忽视的作用。
评论区