1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 1. 创建一个 2G 的空文件 (2048MB)
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

# 2. 设置权限 (安全起见,只有 root 能读写)
chmod 600 /swapfile

# 3. 把它格式化为 Swap
mkswap /swapfile

# 4. 启用 Swap
swapon /swapfile

# 5. 永久生效 (写入 fstab,防止重启后丢失)
echo '/swapfile none swap sw 0 0' >> /etc/fstab

# 6. 调整 Swap 积极性 (Swappiness)
# 默认是 60,建议改为 10,让系统尽量先用物理内存,别动不动就用硬盘
sysctl vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.conf

关于swap积极性,建议为什么是10?默认的60的弊端是什么?

简单来说:vm.swappiness 这个参数决定了你的 Linux 系统有多“喜欢”使用 Swap。

  • 范围是 0100

  • 值越高 = 越积极地使用 Swap(越早把内存里的东西搬到硬盘)。

  • 值越低 = 越消极地使用 Swap(死赖在内存里,不到万不得已不用硬盘)。

我建议设置为 10 而不是默认 60 的核心原因,是因为 VPS 的硬盘 IO 通常是性能瓶颈


1. 默认值 60 的弊端是什么?

默认值 60 是一个为桌面电脑设计的折中方案,它的逻辑是:

“内存空着也是空着,不如把那些暂时不用的程序内存(比如你最小化的浏览器)搬到 Swap 里去,腾出物理内存来做文件缓存 (Page Cache),这样以后读取文件会更快。”

但在 VPS 服务器上,这会导致两个问题:

  1. “假”内存不足(过早 Swap): 即使你的 2.5G 内存还有 1G 空闲,只要系统进行了一些文件读写(比如日志切割、备份、或者简单的 apt update),Linux 可能会为了腾出空间存这些文件的缓存,而把你的 MySQL 或 Nginx 的一部分“闲置数据”挤到 Swap 去。

  2. IO 抖动(卡顿): 当有用户突然请求那部分被挤到 Swap 里的数据时,系统必须从慢速的硬盘把它读回内存(Swap In)。这会导致服务器响应突然变慢几秒钟。对于 Web 服务来说,这种延迟是不可接受的。

通俗的比喻(办公桌):

  • 内存 = 你的办公桌(拿取极快)。

  • Swap = 旁边的档案柜(拿取很慢)。

  • Swappiness = 60: 只要桌子用了 40%,管理员就开始把你暂时不看的文件收进档案柜,为了在桌上腾出空地放“可能以后会看的杂志”(缓存)。当你突然要看那个文件时,还得去柜子里翻,很慢。


2. 为什么建议是 10?

设置为 10,是告诉内核:

“哪怕此时文件缓存的空间很少了,也千万别动我应用程序占用的内存。除非物理内存真的真的快被撑爆了(通常是占用达到 90% 以上),再开始用 Swap。”

带来的好处:

  1. 最大化利用物理内存: 你的 MySQL、PHP、Java 进程会牢牢地呆在速度最快的物理内存里。

  2. 减少硬盘 IO: VPS 的硬盘(尤其是共享硬盘)读写通常不快。减少 Swap 的读写能显著降低系统的负载(Load Average)。

  3. 响应更稳: 避免了因为“Swap 换入换出”造成的莫名其妙的卡顿。

通俗的比喻(Swappiness = 10): 管理员非常懒,只要桌子上还能塞下一张纸,他就绝不把文件收进档案柜。这样你伸手就能拿到所有正在用的文件,工作效率最高。


3. 为什么不设置为 0?

虽然设置为 0 可以最大限度禁止 Swap,但在现代 Linux 内核中,0 可能会导致一种极端情况:当内存真的耗尽时,系统可能会直接触发 OOM Killer (内存溢出杀手),暴力杀掉你的 MySQL 或 Nginx 进程,而不是尝试用 Swap 救急。

所以,10 是一个黄金平衡点

  • 平时几乎不用 Swap,保证速度。

  • 真遇到突发流量把内存撑爆时,还有 Swap 兜底,防止服务直接崩溃。