我有一种情况,我需要创建数千个 0 字节锁定文件以进行并发控制。
我已经使用以下方法测试了创建它们:
for i in `seq 1 50000`; do touch "/run/lock/${i}.lock"; done
由于文件是 0 字节,因此它们不会占用分区中的任何空间。看着df -h
:
Filesystem Size Used Avail Use% Mounted on
tmpfs 50M 344K 49M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 246M 0 246M 0% /run/shm
none 100M 0 100M 0% /run/user
该0%
数字在行中根本没有变化/run/lock
。
然而,每个锁文件的内存大小确实增加了大约 1KB。我通过比较free -h
在内部创建 70,000 个锁定文件之前和之后发现了这一点/run/lock
。这种内存增加反映在实际内存使用中(虚拟内存减去缓冲区/缓存)。
后来我发现这个 1KB 的增加很可能是由于 inode 造成的。所以我使用以下方法检查了 inode 使用情况df -i
:
Filesystem Inodes IUsed IFree IUse% Mounted on
tmpfs 62729 322 62407 1% /run
none 62729 50001 12728 80% /run/lock
none 62729 1 62728 1% /run/shm
none 62729 2 62727 1% /run/user
如您所见,锁定文件增加了/run/lock
分区内的 inode。
我目前在 Ubuntu 上,/run
安装并没有反映在/etc/fstab
. 跑步mount
给了我:
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
我对此有几个问题(但第一个是最重要的):
- 如何永久增加 inode 限制
/run/lock
?所以这个限制在重启后仍然存在? - 我创建自己的目录并在其上挂载 tmpfs 以用于此而不是使用会更好
/run/lock
吗? - 每个分区的大小限制是否完全相互独立?那是存储文件
/run
似乎没有影响/run/lock
,反之亦然。 - 1KB是从inode派生的吗?我注意到在创建非空文件时,每个文件的基本块是 4KB。
- 为什么
/run
给定文件系统类型tmpfs
but/run/lock
,给文件系统类型“none”/run/shm
,/run/user
特别是因为它们都由 TMPFS 支持?为什么他们不都像列tmpfs
中那样阅读Filesystem
? - 如果所有目录都受到独立约束,OOM 杀手如何处理存在多个完整 TMPFS 分区的情况,每个分区的大小为 RAM 的 50%,并且还有进程竞争 RAM。显然,不能使用超过 100% 的 RAM。根据https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt它提到系统将死锁。这是如何运作的?