我想进行一些低资源测试,为此,我需要有90%的可用内存已满。
如何在*nix
系统上执行此操作?
我想进行一些低资源测试,为此,我需要有90%的可用内存已满。
如何在*nix
系统上执行此操作?
Answers:
Stress-ng是一个工作负载生成器,可模拟POSIX系统上的cpu / mem / io / hdd压力。在Linux <3.14上,此调用应该可以解决问题:
stress-ng --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
对于> = 3.14的Linux,您可以使用它MemAvailable
来估计新进程的可用内存,而无需交换:
stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
/proc/meminfo
使用free(1)
/ vm_stat(1)
/ etc 修改呼叫。如果您需要便携的话。
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.98;}' < /proc/meminfo)k --vm-keep -m 1
--vm 1 and --vm-keep
都非常重要。只是--vm-bytes
什么都不做,您可能会误以为您可以根据需要/想要分配尽可能多的内存。我对此有所了解,直到尝试通过分配256G的内存来检查自己的状况。这不是答案中的缺陷,它提供了正确的标志,只是额外的警告。
-m 1
。根据压力手册,-m N
它的缩写是--vm N
:产卵N
工人旋转malloc()/free()
您可以将C程序写入malloc()
所需的内存,然后使用mlock()
来防止内存被换出。
然后,只需让程序等待键盘输入,然后解锁内存,释放内存并退出即可。
calloc
将遇到相同的问题IIRC。所有内存将仅指向相同的只读清零页面。在尝试写入之前,它实际上不会被分配(由于它是只读的,因此不会起作用)。真正确定自己知道的唯一方法是对memset
整个缓冲区执行操作。有关更多信息,请参见以下答案stackoverflow.com/a/2688522/713554
来自此HN评论:https : //news.ycombinator.com/item? id =6695581
只需通过dd或类似名称填充/ dev / shm。
swapoff -a dd if=/dev/zero of=/dev/shm/fill bs=1k count=1024k
pv
已安装,则有助于查看计数:dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024
如果你有基本的GNU工具(sh
,grep
,yes
和head
),你可以这样做:
yes | tr \\n x | head -c $BYTES | grep n
# Protip: use `head -c $((1024*1024*2))` to calculate 2MB easily
之所以可行,是因为grep将整个数据行加载到RAM中(我在复制磁盘映像时以一种非常不幸的方式学到了这一点)。线,通过所产生yes
,替换新行,将是无限长的,但由不限head
于$BYTES
字节,从而将grep的加载在存储器$字节。Grep本身为我使用了100-200KB,您可能需要减去它以获得更精确的数量。
如果您还想添加时间限制,可以在中轻松完成bash
(在中无效sh
):
cat <(yes | tr \\n x | head -c $BYTES) <(sleep $NumberOfSeconds) | grep n
这<(command)
件事似乎鲜为人知,但通常非常有用,有关更多信息,请参见:http : //tldp.org/LDP/abs/html/process-sub.html
然后使用cat
:cat
将等待输入完成直到退出,并且通过保持其中一个管道打开,它将使grep保持活动状态。
如果您有pv
并且想要慢慢增加RAM使用量:
yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n
例如:
yes | tr \\n x | head -c $((1024*1024*1024)) | pv -L $((1024*1024)) | grep n
将以每秒1MB的速度使用多达1 GB的数据。另外,pv
还会显示当前使用率和到目前为止的总使用率。当然,这也可以使用以前的变体来完成:
yes | tr \\n x | head -c $BYTES | pv | grep n
只需插入| pv |
零件即可显示当前状态(默认情况下,吞吐量和总数,我想-否则请参见手册页)。
为什么还要另一个答案?可接受的答案建议安装一个软件包(我敢保证每个芯片组都有一个版本,而无需软件包管理器);票数最高的答案建议编译C程序(我没有安装可用于目标平台的编译器或工具链);第二个投票最高的答案建议在VM中运行该应用程序(是的,让我在USB或其他设备上dd这部手机的内部sdcard并创建一个virtualbox映像);第三个建议在启动顺序中修改某些内容,使其无法按需填充RAM;仅当/ dev / shm挂载点(1)存在且(2)很大时(挂载需要root用户),第四个才有效;第五部分结合了以上内容,没有示例代码;第六是一个很好的答案,但是在提出自己的方法之前,我没有看到这个答案,因此,我认为我会添加自己的,也是因为如果您看不到膜状线实际上是问题的症结所在,那么记住或键入内容的时间会更短;第七个再次不回答问题(使用ulimit限制进程);第八种尝试让您安装python;第九位认为我们都是非常无聊的,最后第十位认为自己编写了C ++程序,该程序导致了与最高投票答案相同的问题。
set -e
,所以我刚刚学到了一些东西:)
time yes | tr \\n x | head -c $((1024*1024*1024*10)) | grep n
(使用10 GiB内存)需要1分46秒。在github.com/julman99/eatmemory运行julman99的eatmemory程序需要6秒钟。嗯,再加上下载和编译时间,但是在我的RHEL6.4机器上编译起来没有问题,而且很快。不过,我还是喜欢这种解决方案。为什么要重新发明轮子?
我保留了在点文件中执行类似操作的功能。 https://github.com/sagotsky/.dotfiles/blob/master/.functions#L248
function malloc() {
if [[ $# -eq 0 || $1 -eq '-h' || $1 -lt 0 ]] ; then
echo -e "usage: malloc N\n\nAllocate N mb, wait, then release it."
else
N=$(free -m | grep Mem: | awk '{print int($2/10)}')
if [[ $N -gt $1 ]] ;then
N=$1
fi
sh -c "MEMBLOB=\$(dd if=/dev/urandom bs=1MB count=$N) ; sleep 1"
fi
}
一个简单的python解决方案有多出色?
#!/usr/bin/env python
import sys
import time
if len(sys.argv) != 2:
print "usage: fillmem <number-of-megabytes>"
sys.exit()
count = int(sys.argv[1])
megabyte = (0,) * (1024 * 1024 / 8)
data = megabyte * count
while True:
time.sleep(1)
sysctl vm.swappiness=0
vm.min_free_kbytes设置为一个较小的数字,例如1024。确实可以使其变得非常缓慢,以至于导致计算机出现OOM状态。参见kernel.org/doc/Documentation/sysctl/vm.txt和kernel.org/doc/gorman/html/understand/understand005.html
如果要使用有限的内存测试特定进程,则最好使用ulimit
限制可分配内存的数量。
man setrlimit
:RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.
我为此编写了一个小C ++程序:https : //github.com/rmetzger/dynamic-ballooner
此实现的优点是可以定期检查是否需要释放或重新分配内存。