最近在验证一些机器的内存分配规则时,学到了一些技巧。周末有时间写点东西分享给大家。你可能遇到过类似的场景,想在机器上进行压力测试,模拟OOM场景,但是机器的规格太高了。如果用代码来实现,你能想象如何实现吗?个人感觉还是有点麻烦。那么有没有一种不用写代码直接通过简单的几条命令就可以向机器申请内存的好方法呢?或者更极端,直接耗尽机器内存。.如果你经常使用linux,你会发现在df-Th之后,/dev/shm下肯定挂载了一个tmpfs类型的文件系统,虽然你可能不会注意它。$df-ThFilesystemTypeSizeUsedAvailUse%Mountedondevtmpfsdevtmpfs910M0910M0%/devtmpfstmpfs919M0919M0%/dev/shmtmpfstmpfs919M896K918M1%/runtmpfstmpfsys/919Mro1Gd401ex27G28%/tmpfstmpfs184M0184M0%/run/user/0而这个tmpfs就是明哥今天要介绍的主角。tmpfs,顾名思义,就是一个临时文件系统,一个基于内存的文件系统。它类似于虚拟磁盘ramdisk,但又不完全相同。和ramdisk一样,tmpfs可以使用RAM,但也可以使用swap分区进行存储,而传统的ramdisk是块设备。需要用mkfs格式化。真正使用它;而tmpfs是文件系统,不是块设备,安装即可使用。tmpfs是最好的基于RAM的文件系统。这意味着你写入tmpfs挂载目录的文件会直接写入内存。如果要占用机器10G的内存,那么我只需要先建立一个临时目录/tmp/memory,并指定文件系统类型和10240M的tmpfs大小挂载到这个目录即可。$mount-ttmpfs-osize=10240Mtmpfs/tmp/memory然后我们用dd命令向这个目录写入尽可能多的内容,它会占用多少内存。由于我们的目的是占用内存,所以如果直接使用/dev/zero$ddif=/dev/zeroof=/tmp/memory/block当dd写入完成后,可以使用free查看可用内存,以及你会发现剩余可以分配的内存少了10G。如果想用完机器所有的内存,可以在mount的时候指定size为机器的内存大小,但是一定要清楚自己在干什么,否则你的机器执行dd后可能会挂掉。使用上面的方法,其实可以做更多的事情。比如你机器上有两个NUMANode,但是你只想占用NUMANode0的内存,那么你可以指定NUMANode0的内存,怎么办?先用lscpu找到NUMANode0上的所有cpucore$node0_cpus=$(lscpu|grep"NUMAnode0"|awk'{print$NF}')然后用taskset工具指定对应的cpucore执行创建tmpfs目录和dd进程$cat>/root/mem_alloc.sh<
