目录标题
POSIX 共享内存( POSIX Shared Memory),是 Linux/Unix 系统中一种 进程间共享内存(IPC)机制,符合 POSIX(Portable Operating System Interface)标准,用于多个进程之间共享一块内存区域,达到快速通信的目的。
🔍 1. 什么是共享内存?
共享内存是一种进程间通信方式(IPC),允许两个或多个进程访问同一块物理内存区域:
- 比如:一个数据库主进程和多个工作子进程,它们共享缓存、元数据区、事务日志缓冲等。
共享内存通常比管道(pipe)、消息队列(message queue)快得多,因为它省去了内核复制数据的开销。
📦 2. POSIX 共享内存的特点
| 特性 | 说明 |
|---|---|
| 接口标准 | 遵循 POSIX.1b(也叫 POSIX Realtime Extensions)标准 |
| 使用方式 | 通过文件路径 /dev/shm/<name> 管理共享内存对象 |
| 通常用的函数 | shm_open(), mmap(), shm_unlink() |
| 生命周期 | 与命名对象(比如 /dev/shm/myshm)相关,需显式删除 |
| 作用域 | 进程间共享(需在内存映射后才可访问) |
| 性能 | 极高,适合多进程共享大块内存 |
🧠 3. 和 System V 共享内存的区别(PostgreSQL 中也支持)
| 项目 | POSIX Shared Memory | System V Shared Memory |
|---|---|---|
| 创建方式 | shm_open() 创建 /dev/shm 文件 | shmget() 获取共享内存段 |
| 接入方式 | mmap() 映射 | shmat() 附加 |
| 清理方式 | shm_unlink() 删除文件 | shmctl() 控制删除 |
| 命名空间 | 文件路径命名(如 /dev/shm/db-shm) | ID 标识,无文件 |
| 便捷性 | 更现代,代码更简洁 | 更传统,兼容性好 |
| 适用场景 | 多数现代 Linux 和容器环境 | 老系统或特权进程环境 |
🏗️ 4. 在 PostgreSQL 中的作用
PostgreSQL 从 9.3+ 开始支持多种动态共享内存类型,通过参数控制:
dynamic_shared_memory_type = posix # 可选值:posix | sysv | mmap | none
posix(默认):在支持的系统中性能最好sysv:兼容性最好,但分配/释放开销稍高mmap:用于调试或极端限制环境none:禁用动态共享内存(不推荐)
PostgreSQL 使用共享内存的目的包括:
- 并发连接共享
shared_buffers - 多后台进程(WAL writer, autovacuum)协同共享
- 多个并发查询共享临时执行状态
🧱 5. POSIX SHM 在容器中的风险
POSIX 共享内存依赖于系统的 /dev/shm:
- 容器中如果未挂载或空间太小(默认 64MB),会导致 PostgreSQL 报错(Bus error)。
- Kubernetes 默认不会扩展
/dev/shm,需要显式配置emptyDir.medium: Memory。
✅ 总结一句话:
POSIX 共享内存是现代 UNIX 系统中高性能、标准化的进程间内存共享机制,PostgreSQL 用它来实现高效并发数据访问。
如果你要部署 PostgreSQL 在容器中并使用 POSIX SHM,务必要保证 /dev/shm 正常挂载、空间足够,或显式切换为 dynamic_shared_memory_type=sysv。是否要我帮你写一个 Kubernetes 中 /dev/shm 的挂载配置模板?

1116

被折叠的 条评论
为什么被折叠?



