先把三块占用加总
两档都是 AMD EPYC 7543P,32 核 / 64 线程,2.8–3.7 GHz。128GB 月租 $449,256GB 月租 $599。 内存都是 DDR4-3200 ECC RDIMM。下单时选定,之后不能加内存条。 主库和缓存要不要放在同一台,得在付款前算完,因为事后没有第三档可以升。
同一台机器上,内存至少被三块东西分走。第一块是操作系统、页缓存和连接本身,也包括你 SSH 进来之后的管理进程。
第二块是数据库想常驻的热数据:MySQL 里主要是 InnoDB 缓冲池;PostgreSQL 里是 shared_buffers,再加上操作系统替它留下的页缓存。
第三块是 Redis 或其他缓存的 maxmemory。应用进程如果也跑在这台机器上,还要再减掉它的常驻内存。
这三块加总,再留出余量,才能跟 128 或 256 比。不要用磁盘上的库容量直接当内存需求。 库文件有 400GB,经常被查询的热数据可能只有几十 GB。反过来,磁盘不大、但缓存要把大半个对象集放进内存时,128GB 会先不够。 看的是热数据集和缓存目标,不是数据目录的总大小。
ECC 两档都有,核心数也相同。多付的每月 $150 只买到内存。选 256GB 解决不了「核不够」,选 128GB 也省不下 CPU。
这篇按 Linux 上的 MySQL、PostgreSQL 和 Redis 来算。选了 Windows Server 之后,SQL Server 的内存上限要另算,不要把下面的缓冲池比例直接抄进 Windows。 Linux 用 SSH 连上去改配置。两档的接入方式相同,不因为内存更大就换成另一套登录方法。
什么情况下 128GB 够用
128GB 够用,指的是下面几件事同时成立。热数据用缓冲池罩得住,命中率已经稳定。 Redis 只放会话、热点键或一个可控的对象缓存,目标大约在 8GB 到 24GB,驱逐在你可接受的范围内。 操作系统、连接,以及同机的应用,加起来还能留下大约 16GB 到 24GB。接下来半年,热数据不会翻倍,也没有第二套大内存服务要搬上来。
可以把它想成一张粗算,不是这台机器的容量承诺。128GB 里先留约 20GB 给系统和连接。 Redis 若计划 16GB,剩下约 90GB 给数据库。MySQL 的缓冲池可以先落在 64GB 到 80GB,给页缓存和临时排序留缝。 Redis 只有几 GB 时,缓冲池可以再靠近 80GB。Redis 已经要 24GB 时,缓冲池就不要再往 80GB 以上推。
PostgreSQL 往往把 shared_buffers 设得比 MySQL 缓冲池更低,常见起点是物理内存的四分之一上下,其余交给操作系统页缓存。
同样的热数据,有时更适合留在 128GB 这一档。前提是并发排序和哈希聚合不要把 work_mem 乘出很大的峰值。
一个查询里可以有多个排序节点,再乘上同时在跑的查询数。64MB 乘几十个并发,通常还在余量里;把 work_mem 开到几百 MB,再叠上上百个并发,128GB 的空档会被吃掉。
什么情况下选 256GB
出现下面任意一条,就直接看 256GB。你希望缓冲池本身就在 80GB 上下,同时还要一个几十 GB 的 Redis。
当前机器上,数据库进程加缓存进程的常驻内存已经靠近或超过 90GB。
PostgreSQL 上并发排序很多,work_mem 乘上并发之后会把余量顶满。
除了主库和 Redis,还要在同一台放搜索引擎,或另一套会占堆内存的服务。应用和数据库没有拆开,应用本身就要十几 GB。
256GB 的粗算同样先留 24GB 到 32GB 给系统和连接。Redis 若要 32GB 到 48GB,缓冲池仍可以落在 120GB 到 160GB。 这是起点。上线后看命中率、临时文件和 Redis 驱逐次数,再把上限收回来。 不要把物理内存的百分之九十划给缓冲池,又在同一台跑一个大 Redis。两边一起膨胀时,系统开始换页,查询会比「没进缓冲池、改去读盘」更难查。
两档差价是每月 $150。季付是 $1,347 对 $1,797,半年付是 $2,694 对 $3,594,年付是 $5,388 对 $7,188。 周期只乘月数,不因为选了 256GB 就打折。内存不够时再迁一次库,通常比这 $150 更贵。 现有占用已经贴近 128GB 的水位,就在下单时选 256GB。热数据集中、命中率高、缓存仍是一二十 GB,就留在 128GB。
用你自己的数对一下
把现网或上一台机器上量到的数填进表里。对上右列任意一行,就按 256GB 准备;五行都落在左列,128GB 就够做这次下单。
| 你现在能量到的 | 更靠近 128GB | 更靠近 256GB |
|---|---|---|
| 热数据 | 缓冲池罩得住,命中率稳定 | 热数据本身接近或超过 100GB |
| Redis / 缓存 | 8–24GB 的热键或会话 | 还要几十 GB,并且缓冲池也大 |
| 连接和排序 | 连接数可控,很少因排序落盘 | work_mem 乘并发会顶满余量 |
| 同机还有谁 | 主要是主库和这一套缓存 | 还有应用、搜索或第二套内存服务 |
| 接下来半年 | 热数据不会翻倍 | 现有占用已经靠近 90GB |
命中率高、驱逐可接受、热数据集中,留在 128GB。正在靠磁盘补内存,或者 Redis 正在扔掉你还需要的键,选 256GB。 拿不准时,用上一台机器的常驻内存乘 1.3 做增长余量,再跟 128 和 256 比。乘完仍低于约 100GB,128GB 这一档放得下这次计划;乘完已经超过 100GB,选 256GB。
装好之后把上限写死
内存档选定之后,还要把数据库和缓存的上限写进配置。不写上限,InnoDB 和 Redis 会按各自的默认去抢同一块物理内存。
-
1
先写下三个数
数据库进程常驻、Redis 的
used_memory、系统可用内存。MySQL 看缓冲池读命中,Redis 看used_memory和evicted_keys,PostgreSQL 看缓存命中和临时文件。 -
2
缓冲池和 maxmemory 分开封顶
同一台上,不要让 InnoDB 缓冲池超过物理内存的大约六成到七成,除非 Redis 很小。Redis 设置
maxmemory,并选好驱逐策略。两边的上限要同时存在。 -
3
给页缓存留缝
缓冲池和 Redis 上限之和,要低于物理内存减去系统和连接。128GB 的机器上,两边合计先按不超过约 100GB 来试;256GB 的机器上,先按不超过约 210GB 来试。
-
4
上线一周后再看
交换持续升高,说明上限写大了。先缩小缓冲池或 Redis,再观察命中率。不要一看到读盘就认定内存档选错。
把缓冲池设到物理内存的百分之八十以上,再跑一个大 Redis,系统会开始换页。先把两个上限加总,确认还没盖过物理内存,再重启服务。
加硬盘补不上内存
默认是 2 × 1TB NVMe,没有硬件 RAID,两块盘各自直连,可用容量 2TB。热数据放不进内存时,读会落到这些盘上。 NVMe 能接住未命中,延迟仍高于内存命中。加购 2TB 盘每块每月 $79,最多两块,仍然直连,加的是容量,不是内存条。 数据文件怎么和备份分开,是磁盘规划的事,不要在选内存档时用「再加一块盘」代替 256GB。
带宽也补不上缓冲池。默认 250M 不限流量,升到 1G 加 $250,升到 2G 加 $750,解决的是出口速率。 主库和本机 Redis 之间的访问走回环,并不消耗这档带宽。内存档和带宽档是两笔账。 备份若要拉到机器外面,再按出口大小看 250M 够不够,那是另一项选择。
内存档定下来之后,再看两块直连盘怎么放数据。直连盘不是硬件 RAID,划分方式见 双盘直连那篇。
和这两档机器怎么对上
热数据、缓存和余量加总之后,配置页里就是这两款。128GB 月租 $449,256GB 月租 $599。
CPU 都是 EPYC 7543P,32 核 / 64 线程,2.8–3.7 GHz。内存都是 DDR4-3200 ECC RDIMM,下单时选定,之后不能加条。
机器在日本东京。Linux 用 SSH 连上去改缓冲池和 maxmemory。无安装费。
应付等于月租乘周期月数,月付、季付、半年付、年付都不另打折。选配,包括 Redis 所在的这台机器上的加盘和带宽,随主机同一周期预付。
若加总已经超过 256GB 还能舒服放下的范围,例如缓冲池、大缓存、搜索堆和应用要同时常驻,一台 256GB 也不要硬塞。 把缓存或搜索拆到第二台,比把所有上限都写满更清楚。本文只帮你在现有两档里做这次选择。