如何用SWAP缓解内存压力-满久琦的个人网站

如何用SWAP缓解内存压力

3 人参与

哈喽各位,我是你们的老朋友,一个在服务器运维坑里摸爬滚打,时不时被“内存不足”这个老六背刺的博主。今天不聊虚的,就掰扯掰扯那个听起来有点古老,但关键时刻能救你服务器狗命的东西——SWAP。我敢打赌,很多玩VPS、小主机的朋友,都经历过那种“程序跑着跑着突然就没了”的诡异时刻,对吧?

内存告急时,系统在偷偷干什么?

先别急着上命令。我们得搞清楚,为啥物理内存不够了,系统就会发疯。想象一下,你的服务器内存是个小厨房的操作台,上面摆满了你正在处理的食材(进程数据)。台子满了,但你还想再切个菜,怎么办?

Linux内核这个“大厨”有个保底绝招:OOM Killer(内存溢出杀手)。它一看台面摆不下了,二话不说,就开始把你认为“不重要”的进程(比如你的博客网站、数据库)给强行关掉,把地方腾出来。结果就是,你的服务莫名其妙“假死”或者直接“消失”,连个错误日志都不一定留得全。我之前一个精心维护的小站,就这么猝死过好几回,那感觉,简直想砸键盘。

SWAP就是你的“备用厨房”

这时候,SWAP的价值就体现出来了。你可以把它理解成你家冰箱的冷藏区。当操作台(物理内存)满了,大厨会把一些暂时不用的、或者用得不那么频繁的食材(内存页),先挪到冰箱(SWAP分区/文件)里放着。等需要的时候,再拿出来。

虽然从冰箱拿东西比从台面上拿要慢得多(因为硬盘速度远低于内存),但好处是,它给了系统一个缓冲的机会,避免了OOM Killer这个“暴躁老哥”直接掀桌子。你的关键服务至少还能苟住,只是可能会感觉有点“卡顿”。用一点性能损失,换服务不崩溃,这笔买卖在内存紧张的小鸡上,简直不要太划算。

动手搞一个SWAP,没那么玄乎

我知道,一看到命令行有人就头大。别怕,跟着我做,一步步来,稳得很。我们就用最常见的创建SWAP文件的方式,这比分区灵活多了。

# 1. 创建一个4GB的空文件(大小自己定,一般建议是物理内存的1-2倍)
sudo fallocate -l 4G /swapfile
# 如果上面命令不行,可以用这个老方法
# sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

# 2. 设置正确的权限,谁都能读写SWAP文件可太危险了
sudo chmod 600 /swapfile

# 3. 把这个文件格式化成SWAP空间
sudo mkswap /swapfile

# 4. 立即启用它
sudo swapon /swapfile

# 5. 看一眼,确认SWAP已经生效了
free -h

看到输出里SWAP那一行有数字了没?有就对了!但先别高兴太早,这步做完只是临时生效,服务器一重启就打回原形。所以最关键的一步来了:

# 6. 让系统开机自动挂载SWAP文件
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

敲黑板! 执行上面这行命令前,我求你,一定要用 `cat /etc/fstab` 先看一眼文件最后是不是正确添加了那一行。 要是手抖输错了,下次开机系统可能就起不来了,别问我怎么知道的,都是血泪教训。

调教一下SWAP的“积极性”

SWAP有个叫 `swappiness` 的参数,范围是0-100。它决定了系统有多“积极”把内存数据往SWAP里挪。

默认值通常是60,意味着内存使用率达到差不多40%时,它就开始考虑往SWAP里塞东西了。对于我们这些内存捉襟见肘的小服务器来说,这个积极性有点太高了,会过早引发卡顿。

我的经验是,把它调低一点,比如设成10或20。意思是:“不到万不得已(内存快用光了),别轻易动用慢吞吞的SWAP”。

# 临时调整,马上生效
sudo sysctl vm.swappiness=20

# 永久生效,写入配置
echo 'vm.swappiness=20' | sudo tee -a /etc/sysctl.conf

改完再跑一下 `free -h` 和 `sudo swapon –show`,看着你的SWAP空间安安静静地待命,是不是心里踏实多了?

说白了,SWAP就是个保险丝。你当然不希望它经常起作用(因为那意味着慢),但家里没有保险丝,你敢放心用电吗?尤其是对于我们这些折腾党,指不定哪天就跑个什么吃内存的玩意儿。给它配上,图个心安,也给自己留条后路。下次再遇到内存报警,至少你知道,你的服务器还在努力地“挣扎”,而不是直接“躺平”给你看。

参与讨论

3 条评论

延伸阅读