最近在驗證一些機器的記憶體分配規律的時候,學習到了一些技能,趁著週末有時間寫點東西,跟大家分享一下。
大家可能有遇到類似的場景,想要對機器進行壓測模擬 OOM 的場景,但是無奈機器的規格實在太高,若用程式碼去實現,大家可以想象一下如何實現?個人感覺還是有點麻煩的。
那麼有沒有好有的辦法,不用寫程式碼,用幾個簡單的命令直接就可以向機器申請記憶體呢?或者更極端點,直接把機器的記憶體給榨乾了。。
若你經常使用 linux,你會發現 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 工具來指定對應的 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 的記憶體。
絮叨一下
我在 SegmentFault 上寫過很多的 Python 相關文章,其中包括 Python 實用工具,Python 高效技巧,PyCharm 使用技巧,很高興得到了很多知乎朋友的認可和支援。
在他們的鼓勵之下,我將過往文章分門別類整理成三本 PDF 電子書
PyCharm 中文指南
《PyCharm 中文指南》使用 300 多張 GIF 動態圖的形式,詳細講解了最貼合實際開發的 105個 PyCharm 高效使用技巧,內容通俗易懂,適合所有 Python 開發者。
線上體驗地址:https://pycharm.iswbm.com
Python 黑魔法指南
《Python黑魔法指南》目前迎來了 v3.0 的版本,囊集了 100 多個開發小技巧,非常適合在閒時進行碎片閱讀。
線上體驗地址:https://magic.iswbm.com
Python 中文指南
學 Python 最好的學習資料永遠是 Python 官方文件,可惜現在的官方文件大都是英文,雖然有中文的翻譯版了,但是進度實在堪憂。為了照顧英文不好的同學,我自己寫了一份 面向零基礎的朋友 的線上 Python 文件 -- 《Python中文指南》
線上體驗地址:https://python.iswbm.com
有幫助的話,記得幫 點個贊喲~