Ubuntu

為數十萬個 0 字節鎖文件設置 tmpfs /run/lock,並處理 inode 限制

  • August 3, 2015

我有一種情況,我需要創建數千個 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)

我對此有幾個問題(但第一個是最重要的):

  1. 如何永久增加 inode 限制/run/lock?所以這個限制在重啟後仍然存在?
  2. 我創建自己的目錄並在其上掛載 tmpfs 以用於此而不是使用會更好/run/lock嗎?
  3. 每個分區的大小限制是否完全相互獨立?那是儲存文件/run似乎沒有影響/run/lock,反之亦然。
  4. 1KB是從inode派生的嗎?我注意到在創建非空文件時,每個文件的基本塊是 4KB。
  5. 為什麼/run給定文件系統類型tmpfsbut /run/lock,給文件系統類型“none” /run/shm/run/user特別是因為它們都由 TMPFS 支持?為什麼他們不都像列tmpfs中那樣閱讀Filesystem
  6. 如果所有目錄都受到獨立約束,OOM 殺手如何處理存在多個完整 TMPFS 分區的情況,每個分區的大小為 RAM 的 50%,並且還有程序競爭 RAM。顯然,不能使用超過 100% 的 RAM。根據https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt它提到系統將死鎖。這是如何運作的?

回答您的一些問題,按順序:

  1. 您可以mount -o remount,nr_inodes=NUM /run/lock在應用程序啟動腳本中使用(以防它以 uid=0 執行)。將相關行添加到/etc/fstab也應該是安全的,但尚未測試。
  2. 分離在這裡是有意義的,因為在填充所有 inode 的情況下不會干擾系統的其餘部分。
  3. 是的,完全獨立。
  4. $$ … $$
  5. 使用虛擬(基於非塊設備)文件系統,您可以將任何內容作為設備放入 mount 命令,它只是重要的類型。
  6. $$ … $$

不確定您的應用程序是否通過打開它來創建空文件(以及持續多長時間),但您也可以考慮增加打開文件限制(檢查ulimit)以避免耗盡。

引用自:https://serverfault.com/questions/710398