inode耗尽导致“No space left on device”错误,需同步调整tmpfs的size和nr_inodes参数;查用df -h和df -i确认容量与inode使用率,临时用mount -o remount,size=2G,nr_inodes=1000000生效,永久则修改/etc/fstab并remount。

直接改 /etc/fstab 并 mount -o remount 就行,但必须同步调 size 和 nr_inodes,否则小文件多时会报 “No space left on device”——这不是磁盘满,是 inode 耗尽。
查当前大小和 inode 用量
别猜,默认值因发行版和容器环境差异极大(Docker 默认仅 64MB,裸机可能是内存一半):
-
df -h /dev/shm看已用/总大小 -
df -i /dev/shm看 inode 使用率(关键!默认常只有几千个) -
ls -1 /dev/shm | wc -l数当前文件数,对比df -i输出判断是否接近上限
临时调整(重启失效,适合验证)
不用改配置文件,立即生效,但只维持到下次 reboot 或 unmount:
- 增大容量并提升 inode 上限(例如设为 2GB + 100 万 inode):
sudo mount -o remount,size=2G,nr_inodes=1000000 /dev/shm - 注意:
nr_inodes必须显式指定,不写就沿用旧值;size单位支持G/M/k,但不能带空格(如size=2 G会失败) - 执行后立刻
df -i /dev/shm确认 inode 数已更新
永久生效:/etc/fstab + remount
编辑 /etc/fstab,加一行(或修改已有 tmpfs 行):
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
tmpfs /dev/shm tmpfs defaults,size=2G,nr_inodes=1000000 0 0
然后重载:
-
sudo mount -o remount /dev/shm—— 这步不能省,/etc/fstab修改后不会自动应用 - 常见错误:只改了 fstab 没 remount;或写成
tmpfs /dev/shm tmpfs size=2G ...缺少defaults,导致挂载选项解析失败 - 容器环境(如 Docker/K8s)需额外在启动参数里透传,
/etc/fstab在容器内通常无效
为什么还是报错?检查三个隐性限制
即使 /dev/shm 看起来够大,shm_open() 仍可能返回 ENOMEM:
-
kernel.shmmax和kernel.shmall过低:POSIX 共享内存段受内核级共享内存参数约束,不是只看/dev/shm大小。用cat /proc/sys/kernel/shmmax确认,必要时同步调整(参考 Oracle/PostgreSQL 文档要求) - 进程级
RLIMIT_AS或RLIMIT_MEMLOCK限制:ulimit -l查锁页内存上限,ulimit -v查虚拟内存上限,Java 或数据库进程常被这些卡住 - 残留文件未清理:
ls /dev/shm若看到大量hsperfdata_*、PostgreSQL.*或无名前缀文件,说明程序异常退出后没调shm_unlink(),得手动删(确认无活跃进程使用后再操作)
真正麻烦的不是调参本身,而是问题常跨三层:内核参数、文件系统挂载、进程资源限制——漏查一层,就白调。

















