VPS 内存不够怎么判断?哪些负载该上大内存方案

· 更新于 · 发布:iVPSer · Linode、Linux教程

内存够不够,看三样东西就行。free 里的 available 长期很低,swap 一直在进进出出,内核日志里有 OOM 杀进程的记录。三样都出现了,而且占内存的是数据本身,比如缓存和数据库,索引和模型也算,那就该加内存。这种负载要的是内存不是核数,Linode 的 High Memory 方案就是给它准备的,每个核配的内存比 Dedicated 方案多,核心也是独享的。

反过来,内存一直涨、从来不回落,多半是程序在泄漏。这种情况换多大的机器都只是晚几天出事,先查程序。

先确认内存真的不够

“已用 90%”不用慌。Linux 会把空闲内存拿去做文件缓存,used 高很正常。要看的是 free -h 里的 available 列,按 man 手册的说法,它是不动用 swap 还能给新程序用的内存,已经把可回收的缓存算进去了。

free -h
vmstat 5
journalctl -k | grep -i "out of memory"

vmstat 5 每 5 秒打一行,盯 si 和 so 两列,这是每秒换入换出 swap 的量。偶尔跳一下没事,持续不为零说明内存装不下了,程序在拿磁盘当内存用,这时候服务会明显变慢。

最后一条命令查内核有没有因为内存耗尽杀过进程。有记录就别犹豫了,被杀的往往就是最占内存的那个,也就是你的数据库或者缓存。没有 journalctl 的系统用 dmesg | grep -i "out of memory"。

哪些负载是吃内存的

负载 内存花在哪 加内存有没有用
Redis、Memcached 整个数据集放在内存里 直接有用,数据多大内存就得多大
MySQL(InnoDB) buffer pool 缓存表和索引 热数据装进 buffer pool 后,查询少走磁盘
Elasticsearch JVM 堆加系统文件缓存 堆有上限,多出来的内存给文件缓存用
本地跑大模型 模型文件整个加载进内存或显存 装不下就跑不起来,或者慢到没法用
网站、博客、调用 API 的 Agent 进程常驻,数据在数据库或远端 一般不缺内存,缺了先查进程

Redis 有个容易漏算的地方。官方的运维建议里说,写入多的实例在做 RDB 持久化或重写 AOF 时,内存最多能用到平时的两倍。数据集 10G 的 Redis 放进 16G 的机器,平时没事,一到落盘就可能被 OOM 杀掉。官方还建议给 maxmemory 设明确上限,留出 Redis 自身开销和碎片的空间。

MySQL 官方文档说,专用的数据库服务器常把最多 80% 的物理内存分给 buffer pool。所以数据库单独放一台,内存给足,比和网站挤在一台上省心。

Elasticsearch 的堆有上限。官方要求堆设成不超过总内存的一半,同时不超过压缩指针的阈值,多数系统 26GB 以内是安全的。机器内存再大,堆也就停在那里,剩下的给系统做文件缓存,对搜索一样有用。

本地跑模型最简单,模型文件多大,内存或显存至少就要那么大,还得给上下文留余量。要上显卡就看 GPU 方案。

什么时候加内存没用

内存曲线一路往上爬、重启后回落、过几天又爬上去,这是泄漏,加内存只是延长重启周期。

配置写得比机器大也一样。buffer pool 和 JVM 堆设得超过物理内存能撑的量,或者 PHP-FPM 进程数开得太多,加了内存它还会接着吃。先把这些参数按机器实际内存改回来,再看还缺不缺。

还有一种是慢在 CPU 上。内存检查都正常,top 里的 st 却经常不为零,那是被同机邻居抢了 CPU,怎么判断和怎么选见共享 CPU 还是独享 CPU。

在 iVPSer 上怎么选

普通方案加内存会连着加核,你为用不上的 CPU 也付了钱。Linode 机房的 High Memory 每个 vCPU 配的内存比 Dedicated 方案多,官方文档写的适用场景是 Redis、Memcached 这类内存缓存,还有内存数据库和大数据处理,vCPU 也是整颗只给你用。

High Memory 每档最便宜的机房列在大配置页的大内存方案表里,每行能直接下单,其他机房的价格看价格页。CPU 和内存都要大的,看大配置云服务器里按机房列的 8 核以上方案。已经在用的 Linode 机器想升配,可以按 Linode Resize 指南操作,先备份再动手。

常见问题

swap 能代替加内存吗?

能顶短时的峰值,顶不了长期。swap 在磁盘上,比内存慢得多,vmstat 里 si、so 一直有数的时候,服务已经被拖慢了。Redis 官方反而建议开 swap,理由是没有 swap 时内存一满 Redis 会直接被杀,有 swap 至少能先看到延迟升高,有时间处理。

内存用了 90% 要升级吗?

看 available,不看 used。available 还有不少、swap 没在动、日志里没有 OOM,就不用升级。被吃掉的那部分多半是文件缓存,程序要用时系统会还回来。

Redis 需要多大内存?

先看数据集本身多大,Redis 里跑 INFO memory 能看到当前用量。在这个基础上留出自身开销和碎片,写入多又开了持久化的,按官方说的最多两倍去留余量。

参考资料