一種基於記憶體的檔案系統tmpfs

roc_guo發表於2021-12-22

若你經常使用  ,你會發現 df -Th 後,一定會有 tmpfs 型別的檔案系統掛載在 /dev/shm 下面,雖然你大機率不會關注到它。

$ df -Th  
Filesystem     Type      Size  Used Avail Use% Mounted on  
devtmpfs       devtmpfs  910M     0  910M   0% /dev  
tmpfs          tmpfs     919M     0  919M   0% /dev/shm  
tmpfs          tmpfs     919M  896K  918M   1% /run  
tmpfs          tmpfs     919M     0  919M   0% /sys/fs/cgroup  
/dev/vda1      ext4       40G   11G   27G  28% /  
tmpfs          tmpfs     184M     0  184M   0% /run/user/0

而這個 tmpfs 就是明哥今天要介紹的主角。

tmpfs,顧名思義,是臨時檔案系統,是一種基於記憶體的檔案系統。

它和虛擬磁碟 ramdisk比較類似像,但不完全相同,和ramdisk一樣,tmpfs可以使用RAM,但它也可以使用swap分割槽來儲存,而且傳統的ramdisk是個塊裝置,要用mkfs來格式化它,才能真正地使用它;而tmpfs是一個檔案系統,並不是塊裝置,只是安裝它,就可以使用了。tmpfs是最好的基於RAM的檔案系統。

這意味著,你往掛載了 tmpfs 的目錄下寫入的檔案,都會直接寫入記憶體中。

假如你想佔用機器 10G 的記憶體,那我只要先建立一個臨時目錄 /tmp/memory ,並指定 tmpfs 的檔案系統型別及大小 10240M 掛載到該目錄下。

$ mount -t tmpfs -o size=10240M tmpfs /tmp/memory

接著我們使用 dd  ,往該目錄下寫入多少內容,就會佔用多少記憶體,由於我們的目的是佔用記憶體,因此 if 直接使用 /dev/zero

$ dd if=/dev/zero of=/tmp/memory/block

當 dd 寫入完成後,你再使用 free 去檢視可用記憶體,會發現剩餘的記憶體可分配的記憶體少了 10G。

如果你想用完機器的所有記憶體,完全可以在 mount 的時候,指定 size 為機器的記憶體大小,但你要清楚你在做什麼,否則執行完 dd ,你的機器可能就掛了。

利用上面這個方法,其實還可以做更多的事情,比如你在機器你有兩個 NUMA Node ,但你只想佔用 NUMA Node 0 的記憶體,那就可以指定 NUMA Node 0 的記憶體,怎麼辦呢?

首先利用 lscpu 找到 NUMA Node 0 上的所有 cpu 核

$ node0_cpus=$(lscpu | grep "NUMA node0" | awk '{print $NF}')

然後使用 taskset 工具加 -c 引數來指定對應的 cpu 核來執行建立 tmpfs 目錄和 dd  的過程

$ cat > /root/mem_alloc.sh <<EOF  
#!/bin/bash  
tmpdir=`mktemp`  
mount -t tmpfs -o size=1024M tmpfs ${tmpdir}  
dd if=/dev/zero of=${tmpdir}/block  
EOF  
$ taskset -c "${node0_cpus}" sh /root/mem_alloc.sh

執行完成後,如果你所佔用的記憶體,沒有超過 NUMA Node 0 的本地記憶體,那麼你使用 numactl 就會發現上面命令都只佔用了 NUMA Node0 的記憶體。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2848871/,如需轉載,請註明出處,否則將追究法律責任。

相關文章