/dev/shm 中的操作導致溢出
我在 /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 . 的另一個特徵ramfs
是tmpfs
可以在需要時將其推入交換: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
因此,我認為以您描述的方式使用沒有任何問題。