Ubuntu為數十萬個 0 字節鎖文件設置 tmpfs
為數十萬個 0 字節鎖文件設置 tmpfs /run/lock
,並處理 inode 限制
我有一種情況,我需要創建數千個 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它提到系統將死鎖。這是如何運作的?
回答您的一些問題,按順序:
- 您可以
mount -o remount,nr_inodes=NUM /run/lock
在應用程序啟動腳本中使用(以防它以 uid=0 執行)。將相關行添加到/etc/fstab也應該是安全的,但尚未測試。- 分離在這裡是有意義的,因為在填充所有 inode 的情況下不會干擾系統的其餘部分。
- 是的,完全獨立。
- $$ … $$
- 使用虛擬(基於非塊設備)文件系統,您可以將任何內容作為設備放入 mount 命令,它只是重要的類型。
- $$ … $$
不確定您的應用程序是否通過打開它來創建空文件(以及持續多長時間),但您也可以考慮增加打開文件限制(檢查ulimit)以避免耗盡。