free 和 top)中的内存表现截然不同。
| 特性 | PostgreSQL | MySQL (InnoDB) |
|---|---|---|
| 进程模型 | 多进程 (Multi-Process) 主进程 fork 出子进程处理连接。 |
多线程 (Multi-Thread) 单进程 (mysqld) 内部产生线程处理连接。 |
| 内存共享方式 | OS System V / MMAP 共享内存 需向操作系统申请特殊的共享区域。 |
进程内堆内存 (Heap) 线程天然共享进程内的地址空间。 |
| 核心参数 | shared_buffers |
innodb_buffer_pool_size |
配置:shared_buffers = 1500MB
used 非常小 (302M),但 buff/cache 巨大。used,而是被 Linux 归类为 Shared Memory。
假设配置:innodb_buffer_pool_size = 4GB ~ 5GB 左右
used 很大 (5.3GB),shared 极小 (22M)。malloc 在堆上分配,被 Linux 视为进程的私有匿名内存,因此直接计入 used。
buff/cache 也有 6453M,这通常是操作系统的文件系统缓存 (Page Cache),用于加速文件读写,并非 MySQL 专用的共享内存配置。不要被很低的 used 迷惑,也不要被很高的 buff/cache 吓到。
free 命令中的 shared 列。它应该接近你的 shared_buffers 配置值。RES 包含了共享内存,多个 Postgres 进程的 RES 不能简单相加。内存实打实地显示在 used 中。
used。如果 used 持续增长接近 Total,可能会触发 OOM。RES,它代表了数据库实际持有的物理内存。在排查内存问题时,必须结合数据库类型来解读 Linux 命令输出: