0

0

/ dev/shm 被塞满导致 PostgreSQL 或 Redis 崩溃的常见业务场景

冰川箭仙

冰川箭仙

发布时间:2026-01-19 13:32:02

|

891人浏览过

|

来源于php中文网

原创

/dev/shm 是基于内存的tmpfs,默认64MB,PostgreSQL和Redis依赖其创建共享内存段;占满会导致崩溃、启动失败或连接拒绝。PostgreSQL在高并发、逻辑复制、统计扩展等场景易耗尽空间;Redis在AOF重写、模块扩展、容器部署时可能间接触发占用;其他服务残留文件亦会隐形占用。诊断用df -h /dev/shm和ls -l /dev/shm,缓解可清理或扩容至1G,或PostgreSQL v12+改用mmap。

/ dev/shm 被塞满导致 postgresql 或 redis 崩溃的常见业务场景

/dev/shm 是 Linux 系统中基于内存的临时文件系统(tmpfs),默认大小通常为 64MB(部分系统为 512MB 或 1GB,取决于内核版本和配置)。PostgreSQL 和 Redis 都会主动使用 /dev/shm 存放共享内存段,一旦该空间被占满,会导致服务无法创建新的共享内存对象,进而触发崩溃、启动失败或连接拒绝等严重问题。

PostgreSQL 的共享内存需求场景

PostgreSQL 启动时会在 /dev/shm 下创建以 PostgreSQL.xxx 命名的共享内存段,用于进程间通信(如 WAL 共享缓冲、并行查询协调、逻辑复制槽状态等)。以下情况容易快速耗尽 /dev/shm:

  • 高并发连接 + 大量并行查询:每个并行工作进程需额外共享内存页,连接数 × 并行度 × 每个 worker 的 shm 开销可能远超默认容量
  • 启用了逻辑复制且订阅端堆积大量未消费的变更:逻辑解码中间状态缓存会驻留在 /dev/shm
  • 使用 pg_stat_statements 或其他扩展频繁刷新统计信息:某些版本在重载统计时会短暂申请大块共享内存
  • PostgreSQL 版本较老(如 9.6 或更早):对 shm 使用不够节制,且不支持 shared_memory_type = mmap 回退机制

Redis 的共享内存使用场景

Redis 本身不直接依赖 /dev/shm,但以下常见业务集成方式会间接触发其占用:

千问APP
千问APP

阿里最强大模型官方AI助手

下载
  • 启用 AOF 重写(BGREWRITEAOF)时配合子进程 fork:虽然 Redis 主要用 copy-on-write,但在某些内核(尤其开启 transparent_hugepage)下,fork 可能触发 tmpfs 映射,临时放大内存需求
  • 使用 Redis Modules(如 RedisAI、RedisJSON)进行大模型推理或批量解析:部分模块为加速数据交换,主动在 /dev/shm 创建命名信号量或共享缓冲区
  • 部署在容器中且未限制 shm 大小:Docker 默认只给容器 64MB /dev/shm,Kubernetes Pod 若未设置 securityContext.shmSize,也会继承该限制,而 Redis Cluster 节点间通信或 Lua 脚本大量调用 redis.call() 可能累积 shm 对象

被忽略的“隐形”占用源

除数据库自身外,同一台机器上的其他服务或脚本也可能持续写入 /dev/shm,导致 PostgreSQL/Redis 启动时“莫名失败”:

  • Python 多进程程序(如使用 multiprocessing.SharedMemory)未显式 .close().unlink(),残留 shm 对象长期不释放
  • Java 应用使用 java.nio.channels.FileChannel.map() 映射 /dev/shm 下的文件,JVM 退出异常时未清理映射
  • 监控 agent(如 collectd、telegraf)采集进程指标时,将临时元数据写入 /dev/shm 且未轮转清理
  • CI/CD 构建脚本临时解压大型归档包到 /dev/shm(误以为“快”就安全),忘记清理

快速诊断与缓解建议

发现崩溃后,优先确认 /dev/shm 实际使用情况:

  • 运行 df -h /dev/shm 查看使用率;ls -l /dev/shm/ 列出对象,重点关注 PostgreSQL.*、sem.*、redis.* 等前缀文件
  • ipcs -m 查看系统级共享内存段(注意:tmpfs 中的文件不显示在此,但传统 shm 段会)
  • PostgreSQL 启动失败时检查日志关键词:could not create shared memory segmentNo space left on device
  • 临时缓解:清空非关键 shm 文件(rm -f /dev/shm/PostgreSQL.* /dev/shm/sem.*),但需确保无活跃数据库进程
  • 长期方案:调整 /dev/shm 大小(如挂载时指定 size=1G),或让 PostgreSQL 使用 mmap(shared_memory_type = mmap,v12+ 支持),Redis 容器明确设置 --shm-size=1g

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

760

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

639

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

763

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

619

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1285

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号