文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何一条命令,榨干机器的所有内存?

2024-12-02 14:57

关注

最近在验证一些机器的内存分配规律的时候,学习到了一些技能,趁着周末有时候写点东西,跟大家分享一下。

大家可能有遇到类似的场景,想要对机器进行压测模拟 OOM 的场景,但是无奈机器的规格实在太高,若用代码去实现,大家可以想象一下如何实现?个人感觉还是有点麻烦的。

那么有没有好有的办法,不用写代码,用几个简单的命令直接就可以向机器申请内存呢?或者更极端点,直接把机器的内存给榨干了。。

若你经常使用 linux,你会发现 df -Th 后,一定会有 tmpfs 类型的文件系统挂载在 /dev/shm 下面,虽然你大概率不会关注到它。 

  1. $ df -Th  
  2. Filesystem     Type      Size  Used Avail Use% Mounted on  
  3. devtmpfs       devtmpfs  910M     0  910M   0% /dev  
  4. tmpfs          tmpfs     919M     0  919M   0% /dev/shm  
  5. tmpfs          tmpfs     919M  896K  918M   1% /run  
  6. tmpfs          tmpfs     919M     0  919M   0% /sys/fs/cgroup  
  7. /dev/vda1      ext4       40G   11G   27G  28% /  
  8. 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 挂载到该目录下。 

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

接着咱使用 dd 命令,往该目录下写入多少内容,就会占用多少内存,由于我们的目的是占用内存,因此 if 直接使用 /dev/zero 

  1. $ 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 核 

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

然后使用 taskset 工具加 -c 参数来指定对应的 cpu 核来执行创建 tmpfs 目录和 dd  的过程 

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

执行完成后,如果你所占用的内存,没有超过 NUMA Node 0 的本地内存,那么你使用 numactl 就会发现上面命令都只占用了 NUMA Node0 的内存。

这么简单,你学会了吗? 

 

来源:良许Linux内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯