Linux

/dev/shm 中的操作導致溢出

  • June 17, 2013

我在 /dev/shm 中重複數以萬計的類似操作,每個操作都創建一個目錄,寫入文件,然後刪除。我曾經的假設是我實際上是在創建目錄並在適當的位置刪除它們,因此記憶體消耗必須非常低。然而事實證明,使用率相當高,最終導致記憶體溢出。所以我的問題是:像這樣的操作

mkdir /dev/shm/foo
touch /dev/shm/foo/bar
[edit] /dev/shm/foo/bar
....
rm -rf /dev/shm/foo

最終會導致記憶體溢出嗎?如果是這樣,為什麼會這樣,因為它似乎是在原地移除它們。

**注意:**這是一個數以萬計的類似操作。

好奇,當你執行這個應用程序時,df -h /dev/shm你的 RAM 使用情況是什麼?

tmpfs

預設情況下,它通常設置為系統物理記憶體量的 50%。這記錄在 kernel.org 上的 tmpfs 文件系統文件下。mount手冊頁中也提到了它。

安裝手冊頁的摘錄

此實例的最大 inode 數。預設值為物理 RAM 頁數的一半,或(在具有 highmem 的機器上)lowmem RAM 頁數,以較低者為準。

確認

在我的 8GB RAM 筆記型電腦上,我有以下設置/dev/shm

$ df -h /dev/shm
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 3.9G  4.4M  3.9G   1% /dev/shm

這是怎麼回事?

我認為正在發生的事情是,除了分配 50% 的 RAM 來啟動之外,隨著時間的推移,您基本上消耗了全部 50%,並將您的/dev/shm空間與其他 50% 的 RAM 一起推入交換空間。

tmpfs請注意, vs . 的另一個特徵ramfstmpfs可以在需要時將其推入交換:

摘自geekstuff.com

                   Table: Comparison of ramfs and tmpfs

Experimentation                          Tmpfs                Ramfs
---------------                          -----                -----
Fill maximum space and continue writing  Will display error   Will continue writing
Fixed Size                               Yes                  No
Uses Swap                                Yes                  No
Volatile Storage                         Yes                  Yes

歸根結底,它是在 RAM 中實現的文件系統,所以我希望它的行為有點像兩者。我的意思是,當文件/目錄被刪除時,您正在使用 inode 表的一些物理記憶體頁,以及這些文件/目錄消耗的實際空間。

通常,當您使用 HDD 上的空間時,您實際上並沒有釋放物理空間,只是 inode 表中的條目,表示特定文件佔用的空間現在可用。

因此,從 RAM 的角度來看,文件佔用的空間只是記憶體中的髒頁。因此,隨著時間的推移,它將盡職盡責地將它們換掉。

目前還不清楚是否tmpfs有任何特殊措施來清理它提供的文件系統使用的實際 RAM。我在幾個論壇中看到有人提到,他們的系統需要 15 分鐘以上的時間來“回收”他們在/dev/shm.

也許我在tmpfs標題為:tmpfs: A Virtual Memory File System 的這篇論文將更清楚地說明它是如何在較低級別實現的,以及它是如何相對於 VMM 發揮作用的。該論文是專門為 SunOS 編寫的,但可能包含一些線索。

實驗

以下人為的測試似乎表明/dev/shm能夠自行清理。

實驗#1

創建一個包含單個文件的目錄,然後刪除該目錄 1000 次。

的初始狀態/dev/shm

$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5500   3988244   1% /dev/shm

用文件填充它

$ for i in `seq 1 1000`;do mkdir /dev/shm/sam; echo "$i" \
     > /dev/shm/sam/file$i; rm -fr /dev/shm/sam;done

的最終狀態/dev/shm

$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5528   3988216   1% /dev/shm

實驗#2

創建一個包含單個 50MB 文件的目錄,然後刪除該目錄 300 次。

用 50MB 的隨機垃圾文件填充它

$ start_time=`date +%s`
$ for i in `seq 1 300`;do mkdir /dev/shm/sam;                     \
  dd if=/dev/random of=/dev/shm/sam/file$i bs=52428800 count=1 > \
  /dev/shm/sam/file$i.log; rm -fr /dev/shm/sam;done              \
  && echo run time is $(expr `date +%s` - $start_time) s

...
8 bytes (8 B) copied, 0.247272 s, 0.0 kB/s
0+1 records in
0+1 records out
9 bytes (9 B) copied, 1.49836 s, 0.0 kB/s
run time is 213 s

的最終狀態/dev/shm 再次沒有明顯增加所消耗的空間/dev/shm

$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5500   3988244   1% /dev/shm

結論

我沒有註意到使用我的/dev/shm. 多次執行上述內容似乎也沒有任何影響。/dev/shm因此,我認為以您描述的方式使用沒有任何問題。

引用自:https://unix.stackexchange.com/questions/79364