最近在验证一些机器的内存分配规律的时候,学习到了一些技能,跟大家分享一下。

大家可能有遇到类似的场景,想要对机器进行压测模拟 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 工具加 -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 的内存。

这么简单,你学会了吗?

各位伙伴们好,詹帅本帅搭建了一个个人博客和小程序,汇集各种干货和资源,也方便大家阅读,感兴趣的小伙伴请移步小程序体验一下哦!(欢迎提建议)

推荐阅读

牛逼!Python常用数据类型的基本操作(长文系列第①篇)

牛逼!Python的判断、循环和各种表达式(长文系列第②篇)

牛逼!Python函数和文件操作(长文系列第③篇)

牛逼!Python错误、异常和模块(长文系列第④篇)

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

  1. Linux一条命令多个机器执行,Linux 配置HA软件后,如果该机器上有多个IQServer如何执行切换命令?...

    在Linux 上配置 HA软件后,该机器上如果只有一个 IQ Server,在切换时,可以使用stop_iq 命令正常停止该服务进程: 要是有两个或多个 IQ Server,显然使用stop_iq命令 ...

  2. docker下的spark集群,调整参数榨干硬件

    本文是<docker下,极速搭建spark集群(含hdfs集群)>的续篇,前文将spark集群搭建成功并进行了简单的验证,但是存在以下几个小问题: spark只有一个work节点,只适合处 ...

  3. 整个电脑键盘被锁住了_蜗居共享经济,如何彻底榨干你家里的电子设备|鼠标|共享经济|键盘|电脑桌|显示器|升降支架...

    为什么在家都要共享,这可能需要和我家的布局有关系.家里面积不大,时常羡慕别人有三米长的电脑桌,自己蜗居东拼西凑才弄出一个一米宽的小桌子. 拥挤的把电脑桌铺满,还算有着不错的工作娱乐效果.如何物尽其用, ...

  4. Linux 新手必会的21条命令合集

    Linux初期的学习曲线有些陡峭,所以作为一名初学者,学会自娱自乐是非常重要的.先来看13个有趣的小命令. 1.sl 命令 你会看到一辆火车从屏幕右边开往左边...... 安装 $ sudo apt- ...

  5. 让 Netty “榨干” 你的CPU!

    在开始了解Netty是什么之前,我们先来回顾一下,如果需要实现一个客户端与服务端通信的程序,使用传统的IO编程,应该如何来实现? IO编程 我们简化一下场景:客户端每隔两秒发送一个带有时间戳的&quo ...

  6. NETSH WINSOCK RESET这条命令的含义和作用?

    简单来说netsh winsock reset命令含义是重置 Winsock 文件夹.假设一台机器上的Winsock协议配置有问题的话将会导致网络连接等问题,就须要用netsh winsock res ...

  7. 让Netty“榨干”你的CPU

    在开始了解Netty是什么之前,我们先来回顾一下,如果需要实现一个客户端与服务端通信的程序,使用传统的IO编程,应该如何来实现? IO编程 我们简化一下场景:客户端每隔两秒发送一个带有时间戳的&quo ...

  8. 年轻人的钱包,被十一假期榨干了

    本文来源:字母榜 ID:wujicaijing 作者:邢思远 十一长假,是打工人一年中难得的大块休闲时光,很多人利用这段时间旅游玩乐,好不惬意.但另一方面,假期间的各种消费开支,也让不少年轻人叫苦不迭 ...

  9. vSAN其实很简单-如何榨干vSAN的最后的空间- Part2(转)

    https://mp.weixin.qq.com/s/zFuxJeI0TuX3AM5TSrfEmA 上一篇文章我们聊了如何开启vSAN UNMAP功能用来回收释放的空间,这次我们继续来聊聊剩下两个节省 ...

最新文章

  1. 基于Python的开源人脸识别库:离线识别率高达99.38%
  2. 基于operator sdk编写一个k8s自定义资源管理应用
  3. OSI强调:SSPL并不是开源许可证
  4. Programming MS Office 2000 Web Components第二章第一节(第二部分)
  5. session过期时间控制的一些常用方法
  6. poj 3352Road Construction(无向双连通分量的分解)
  7. 一个 react+redux 工程实例
  8. 2015/04/01     RHCS
  9. Linux中msiexec无法运行,使用msiexec.exe绕过应用程序白名单(多种方法)
  10. PyTorch 1.0 中文文档:广播语义
  11. oracle数据库监听问题,分享一个有意思的Oracle19c数据库监听异常
  12. 1024程序员节:除了高薪,你还有什么理由坚持做程序员?
  13. 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
  14. ubuntu安装eclips
  15. 市场分析——行业背景分析
  16. java 拼音 联想_solr6.6.2之拼音联想
  17. HDOJ 4696 Answers 乱搞
  18. AngularCI/CD:Error: initial exceeded maximum budget
  19. SpringBoot整合Mybatis3 Dynamic Sql(IDEA)
  20. java图片转视频,附加代码以供参考

热门文章

  1. RabbitMQ自学之路(九)——RabbitMQ实现延时队列的两种方式
  2. PHP垃圾回收深入理解
  3. svn 命令行下常用的几个命令
  4. PHP的截取substr mb_substr
  5. java synchronized 原理_Java Synchronized的原理
  6. java批量修改txt文件_Java小工具 根据文本批量修改文件名
  7. eclipse jsp没有提示_JSP+Struts2+JDBC+Mysql实现的校园宿舍管理系统
  8. 不再迷惑,无值和 NULL 值
  9. 中dubbo所需要的依赖_Dubbo介绍、dubbo架构图、dubbo运行和执行流程、dubbo支持的协议以及支持的注册中心...
  10. datagrip mysql乱码_DataGrip和IDEA无法连接上Mysql问题解决方法详解