小内存VPS生存指南:512M"小鸡"也能跑得飞起的系统优化全攻略


很多朋友因为预算有限,入手了512M甚至256M内存的VPS,也就是圈内俗称的"小鸡"。装完系统一看,还没跑任何业务,内存就被吃掉一大半,开个MySQL直接OOM(Out Of Memory)被杀进程,气得想砸键盘。其实小内存机器不是不能用,而是你没用对方法。这篇文章分享一套我用了多年、亲测有效的低配VPS系统级优化方案,全部基于Ubuntu/Debian演示,照着敲命令就能完成,让你的小鸡稳定跑起博客、API服务甚至轻量面板。

一、先搞清楚:内存都被谁吃掉了

拿到机器第一件事,不是急着优化,而是先摸清家底。用下面两条命令看看现状:

free -h
ps aux --sort=-%mem | head -15

第一条命令查看整体内存使用情况,第二条列出吃内存最多的前15个进程。通常你会发现几个"内存大户":

  • systemd-journald:系统日志服务,默认配置下能吃几十MB
  • rsyslogd:日志守护进程,与journald功能重复
  • snapd:Ubuntu的Snap包管理器,不用Snap的话纯浪费
  • unattended-upgrades:自动更新服务,后台默默占用资源
  • 各种云厂商的监控Agent:有些能吃50-100MB

注意看free输出里的buff/cache那一列,这部分是Linux自动用空闲内存做的磁盘缓存,它会在应用需要时自动释放,不算真正的占用。真正要警惕的是used部分持续超过80%并且swap开始被大量使用的情况。

二、第一步:创建合适的SWAP交换分区

很多VPS商家默认不给你SWAP,一旦物理内存耗尽,内核的OOM Killer就会开始"猎杀"占用内存最多的进程——往往是你的MySQL或Nginx。给小鸡配一个SWAP,等于给了系统一个缓冲垫,避免突发流量直接把服务打崩。

创建1GB SWAP的完整命令:

# 创建1GB的swap文件
sudo fallocate -l 1G /swapfile
# 如果fallocate不支持,改用dd
# sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 写入fstab让重启后依然生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

建议SWAP大小设为物理内存的1到2倍:512M内存配1G SWAP,1G内存配2G SWAP。别贪大,SWAP毕竟走磁盘IO,性能远低于物理内存,它只是保命用的,不是用来常态化的。

一个常见误区:有人觉得SWAP在KVM架构下伤磁盘,索性不开。实际上现代SSD写入寿命以TBW计算,个人博客级别的swap换入换出量根本不值一提。真正伤性能的是不开SWAP导致频繁OOM,服务反复重启比啥都伤。

三、第二步:启用ZRAM,让压缩内存替你扛压

如果说SWAP是保命垫,那ZRAM就是小内存机器的性能外挂。ZRAM在内存中开辟一块区域,数据写入前先压缩,读出时再解压。以3:1的压缩比计算,300MB的ZRAM能当900MB用,而读写速度远快于磁盘SWAP。

启用ZRAM(Ubuntu有现成的软件包):

sudo apt install zram-tools -y
sudo nano /etc/default/zramswap

编辑配置文件,设置大小:

# ALGO=lz4 建议使用lz4算法,速度最快
ALGO=lz4
# PERCENT表示使用物理内存的百分比,50即一半
PERCENT=50

重启服务并验证:

sudo systemctl restart zramswap
zramctl
# 输出里能看到磁盘大小、压缩算法和数据量

ZRAM优先级默认较高,内核会先用它,写满了才会落到磁盘SWAP。这个组合拳下来,512M的小鸡实际可用内存相当于1.2G以上,跑个博客绰绰有余。

四、第三步:内核参数调优,小内存专属配置

编辑sysctl配置:

sudo nano /etc/sysctl.d/99-lowmem.conf

加入以下内容:

# SWAP使用倾向:小内存机器建议10-20,默认60太激进
vm.swappiness = 15
# 内存紧张时回收缓存的倾向,调高有利于释放内存
vm.vfs_cache_pressure = 150
# 减少TCP连接缓冲区默认值,节省内存
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
# 开启TCP BBR拥塞控制(内核4.9+)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

生效并验证:

sudo sysctl --system
sysctl net.ipv4.tcp_congestion_control
# 输出 bbr 即成功

重点说说vm.swappiness:这个值范围0-100,代表内核使用SWAP的积极程度。默认60意味着内核比较乐意把不活跃页换出去。小内存机器建议调低到10-15,让系统尽量用物理内存和ZRAM,只在真正吃紧时才碰磁盘SWAP,避免"内存没满但服务变卡"的怪象。

五、第四步:开启BBR,白嫖的网络加速

上面sysctl里其实已经带上了BBR,这里单独强调是因为它对小内存机器有特殊意义:BBR不依赖丢包判断拥塞,而是主动测算带宽和RTT,能在高延迟、有丢包的跨境线路上显著提升吞吐。你的小鸡如果是海外线路,不开BBR等于白白浪费一半带宽。

检查内核版本(需4.9以上,Ubuntu 20.04+都满足):

uname -r
# 5.15.0-xx-generic 之类的输出都没问题

关于BBR变种的选择说两句:原版BBR最稳;魔改版BBR Plus、暴力BBR声称更激进,但来源混杂,不推荐在陌生脚本里一键开启——很多"一键脚本"会顺手替换你的内核,出问题只能重装。手动改三个参数,清清楚楚,心里踏实。

六、第五步:砍掉不必要的系统服务

这是见效最快的一步,能立刻省出100-200MB内存。逐个处理:

# 卸载snapd(不用snap的话)
sudo apt purge snapd -y
# 停用不需要的服务
sudo systemctl disable --now rsyslog
sudo systemctl disable --now snapd 2>/dev/null
sudo systemctl disable --now unattended-upgrades

再限制一下journald日志占用的内存:

sudo mkdir -p /etc/systemd/journald.conf.d
echo -e "[Journal]\nRuntimeMaxUse=32M\nStorage=volatile" | \
  sudo tee /etc/systemd/journald.conf.d/size.conf
sudo systemctl restart systemd-journald

其中Storage=volatile让日志只存内存不落盘,重启即清空。个人博客服务器不必保留太久的系统日志,这条能同时省内存和磁盘IO。

查看还有哪些服务在跑:

systemctl list-units --type=service --state=running

原则:不认识的先搜索再决定,不确定的不动。别学某些教程上来一把梭全禁了,结果SSH都连不上。

七、第六步:软件选型,选对了内存省一半

优化系统只是节流,软件选型才是大头。同样跑一个博客,不同组合的内存差距能有10倍:

  • Web服务器:Caddy比Nginx更省心(自动HTTPS),内存占用相当;Apache传统MPM模式吃内存,小机器上不建议
  • 数据库:SQLite零内存开销,个人博客首选;必须用MySQL的话,把innodb_buffer_pool_size限制在64M-128M;MariaDB同理
  • PHP:PHP 8.x + OPcache,把opcache.memory_consumption设为64M就够,pm.max_children控制在2-4个
  • 博客程序:Typecho比WordPress轻一个量级,详见我另一篇轻量建站程序对比

给个直观参考:WordPress + MySQL的经典组合空载约500M,而Typecho + SQLite空载不到80M。512M的小鸡跑后者毫无压力,跑前者就得精打细算了。

八、第七步:建立监控,防患于未然

优化做完不是结束,得持续盯着。轻量方案推荐两个:

方案一:免费的多服务器监控面板(如哪吒探针、Uptime Kuma自建),带Web界面,内存占用极低,掉线有通知。

方案二:纯命令行的定时检查。写一个简单的内存告警脚本:

#!/bin/bash
# /opt/scripts/mem-alert.sh
FREE_MB=$(free -m | awk '/Mem:/{print $4+$6}')
if [ "$FREE_MB" -lt 100 ]; then
  # 这里换成你的通知方式,比如Telegram Bot或邮件
  curl -s "https://api.telegram.org/bot你的token/sendMessage" \
    -d "chat_id=你的id" \
    -d "text=警告:可用内存仅${FREE_MB}MB"
fi

加到crontab,每5分钟检查一次:

*/5 * * * * /opt/scripts/mem-alert.sh

九、写在最后

这套组合拳总结下来就是:SWAP保命、ZRAM扩容、内核调优、BBR提速、砍掉冗余服务、选对软件栈、建立监控闭环。全部做完大概只需要半小时,512M小鸡的体验会有质的提升。

最后说句实在话:优化能让小鸡发挥200%的实力,但不能把它变成大鸡。如果你的业务真的长大了——日IP过万、数据库膨胀到几百MB——该升级配置就升级,时间成本比那点差价贵得多。优化的意义在于让每一分钱花得值,而不是死撑。

祝各位的小鸡都能吃得少、跑得快。有其他优化技巧欢迎评论区交流。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

零基础Docker建站实战:用容器在VPS上部署网站的保姆级教程

CN2、BGP、IEPL到底啥区别?国内访问海外VPS的线路选择指南

评 论