13 10 月 2026

内存不足是小配云服务器最常遇到的问题:2G、4G 的机器,跑个游戏服加个网站,内存就红了。要么升级配置,要么把内存用到极致。

这篇讲清楚三件事:Swap 怎么建怎么调、内存到底被谁吃了、不升级配置怎么挤出内存。

需要云服务器可以看看财富云计算:NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,一键开服面板,主流游戏快速部署。

一、Swap 是什么:硬盘伪装的内存

Swap(交换分区)是把一部分磁盘空间当内存用。物理内存不够时,内核把不活跃的页面挪到磁盘上,腾出内存给当前任务。

三个关键认知:

  1. Swap 比内存慢几千倍,因为磁盘 IO 和内存 IO 差着数量级
  2. 但有 Swap 比没有强——没有 Swap,内存一满系统直接 OOM Killer 杀进程,游戏服说没就没
  3. Swap 是兜底,不是常态。Swap 长期吃满,说明内存真的不够

建议:不管机器多大,都配 Swap。1G 内存配 1G Swap,4G 内存配 2–4G Swap。

二、查看当前内存与 Swap

# 看内存和 swap 总量/使用
free -h

# 看 swap 是分区还是文件
swapon --show

# 看内存具体被谁占了
ps aux --sort=-%mem | head -15

free -h 输出解读:

              total   used   free   shared  buff/cache   available
Mem:           3.8G   2.1G   312M    45M      1.4G         1.5G
Swap:          2.0G     0B   2.0G

重点看 available 那一列,不是 free。buff/cache 里的内存是可回收的,系统会自动还。available 才是真正能用的。

三、创建 Swap:文件方式(最通用)

云服务器默认可能没开 Swap,按下面步骤加:

# 1. 创建 2G 的 swap 文件(bs 块大小 x count 块数)
fallocate -l 2G /swapfile
# 老系统 fallocate 不支持就用 dd
# dd if=/dev/zero of=/swapfile bs=1M count=2048

# 2. 权限必须设 600,否则系统警告
chmod 600 /swapfile

# 3. 格式化为 swap
mkswap /swapfile

# 4. 启用
swapon /swapfile

# 5. 写入 fstab,开机自动挂载
echo '/swapfile none swap sw 0 0' >> /etc/fstab

验证:

free -h        # Swap 行应该有数
swapon --show  # 显示 /swapfile

删除 Swap(不需要时):

swapoff /swapfile
rm -f /swapfile
sed -i '/\/swapfile/d' /etc/fstab

四、调优:三个参数决定 Swap 性格

swappiness 控制系统多积极地把内存挪到 Swap:

# 查看当前值(默认 60)
cat /proc/sys/vm/swappiness

# 临时修改
sysctl vm.swappiness=10

# 永久修改
echo 'vm.swappiness = 10' >> /etc/sysctl.d/99-sysctl.conf
sysctl -p /etc/sysctl.d/99-sysctl.conf

怎么设:

场景swappiness理由
游戏服、数据库10尽量用物理内存,避免游戏卡顿
普通 Web 服务器30–60默认值,平衡
内存极小(1G)机器40–60多利用 Swap 兜底

另两个参数(内存紧张时调):

# 水位线比例,默认50,降到20更倾向于回收缓存而非swap
vm.watermark_scale_factor = 20

# 脏页回写策略:内存紧张时降低,让系统尽快把脏数据写盘
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

更多内核参数调优见内核参数优化 sysctl。

五、诊断:内存到底被谁吃了

free 只能看总量,定位元凶要组合拳:

# 1. 进程内存排序(看 RSS 实际占用)
ps aux --sort=-%mem | head -15

# 2. 更直观的交互式查看
yum install -y htop   # 或 apt install -y htop
htop

# 3. 看某个进程的内存明细(以 java 为例)
cat /proc/$(pgrep -f java | head -1)/status | grep -E 'VmRSS|VmSize'

# 4.  slab 缓存占用(内核对象缓存)
slabtop -o

# 5. 谁在产生内存泄漏?看增长趋势
while true; do ps aux --sort=-%mem | head -3; sleep 5; done

常见内存大户:

大户典型占用处理
Java(我的世界服务端)1–8G调 -Xmx 上限
幻兽帕鲁 PalServer8–16G换大内存或限制玩家数
MySQL0.5–2G调 innodb_buffer_pool_size
Redis0.1–1G设 maxmemory
残留的僵尸进程不等kill 掉,检查为什么没退

六、不升级配置:挤出内存的 8 个办法

内存实在不够又不想加钱,按见效顺序试:

1. 砍掉不用的服务

# 看哪些服务在跑
systemctl list-units --type=service --state=running

# 关掉确认不用的(举例)
systemctl disable --now postfix      # 邮件服务,网站不需要
systemctl disable --now rpcbind      # NFS 相关,不用就关
systemctl disable --now bluetooth    # 服务器没蓝牙

一条就省几十 MB,积少成多。

2. 限制游戏服内存上限

用 systemd 给服务端设 MemoryMax,防止失控(详见systemd 服务实战):

[Service]
MemoryMax=6G

3. 调 JVM 参数(我的世界等 Java 服)

# 启动脚本里限制最大堆
java -Xms2G -Xmx4G -jar server.jar

-Xmx 不要设超过物理内存的 70%,留空间给系统和其他进程。

4. 调 MySQL 缓冲池

# my.cnf
[mysqld]
innodb_buffer_pool_size = 256M   # 小机器别给太大
performance_schema = OFF          # 关掉能省 100MB+

5. 给 Redis 设上限

# redis.conf
maxmemory 256mb
maxmemory-policy allkeys-lru

6. 清理 pagecache(应急)

# 先 sync 再清,只影响性能不影响数据安全
sync && echo 3 > /proc/sys/vm/drop_caches

立竿见影,但缓存清了之后读盘会变慢,只用于救急,不要写进定时任务。

7. 找出并杀掉僵尸进程

# 看状态为 Z 的进程
ps aux | awk '$8 ~ /Z/ {print}'

# 杀不掉说明父进程有问题,重启父进程

8. 加 Swap(最有效)

前面说过,这是兜底。小机器加 2–4G Swap,能扛过大部分内存峰值。

七、OOM Killer:内存真爆了会发生什么

内存 + Swap 全满,内核启动 OOM Killer,挑一个进程杀掉。挑谁?oom_score 最高的那个——通常就是吃内存最多的(你的游戏服)。

查看和调整:

# 看某进程的 oom 分数(越高越先被杀)
cat /proc/$(pgrep -f PalServer)/oom_score

# 保护关键进程,降低被杀概率(-1000 表示基本免疫)
echo -1000 > /proc/$(pgrep -f PalServer)/oom_adj

# 日志里能看到 OOM 记录
dmesg | grep -i "killed process"

防御性配置:给核心服务写 MemoryMax(systemd)或调低 oom_score_adj,让系统先杀不重要的进程。

八、升级配置的判断标准

什么时候该加内存了:

  • Swap 长期占用 > 50%
  • vmstat 的 si/so(swap in/out)持续非 0
  • 游戏服频繁因 OOM 重启
  • 加了上述所有优化还是卡

小内存机器跑大游戏(幻兽帕鲁、RUST 大服)本来就是拧巴,该升就升。NAT 型云服务器在同配置下比独立 IP 机型省一半以上,升级成本没那么痛。

小结

内存优化优先级:先砍无用服务 → 再调各服务上限 → 加 Swap 兜底 → 还不够再升级配置。按这个顺序来,4G 机器跑两个中小型游戏服是完全做得到的。

更多内容见财富云计算知识库:Linux 命令速查、磁盘挂载扩容、资源排查、crontab 计划任务全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:Netdata 与宝塔面板:零基础服务器可视化监控方案
  2. 下一篇:云服务器时区与 NTP 时间同步:日志不错乱、任务不跑偏
发表评论 12