很多朋友因为预算有限,入手了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——该升级配置就升级,时间成本比那点差价贵得多。优化的意义在于让每一分钱花得值,而不是死撑。
祝各位的小鸡都能吃得少、跑得快。有其他优化技巧欢迎评论区交流。