如何一條命令,榨乾機器的所有內存?

最近在驗證一些機器的內存分配規律的時候,學習到了一些技能,趁着週末有時間寫點東西,跟大家分享一下。

大家可能有遇到類似的場景,想要對機器進行壓測模擬 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 的內存。

絮叨一下

我在 『開源中國』寫過很多的 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

有幫助的話,記得幫我 @王炳明 點個贊喲~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章