Linux:如何加载系统内存?

我正在开发一个小function,让我的用户了解CPU占用情况。 我正在使用cat /proc/loadavg ,这将返回已知的3个数字。

我的问题是CPU在我开发的时候什么都不做。

有没有一种很好的方式来生成CPU的CPU负载,我正在makecpudosomething 30一个类似于makecpudosomething 30 ,负载为0.3或类似的。 像这样的应用程序是否存在?

另外,有没有办法以受控的方式吃掉RAM?

谢谢

迈克尔

如果你想产生任意的CPU负载或CPU利用率,我不太清楚。 是的,他们确实是不同的东西。 我会尽力涵盖这两个问题。

首先: load是在一定时间内运行运行等待CPU调度程序队列的平均进程数量,“想让你的CPU”这么说。

所以,如果你想产生任意的负载 (比如说0.3),你必须在30%的时间内运行一个进程,然后在运行队列中将其从运行队列中移出70%,将其移动到睡眠队列中或者杀死它,例如。

你可以试试这个脚本来做到这一点:

 export LOAD=0.3 while true do yes > /dev/null & sleep $LOAD killall yes sleep `echo "1 - $LOAD" | bc` done 

请注意,您需要等待一段时间(1,10和15分钟)才能得到相应的号码,并且会受到系统中其他进程的影响。 你的系统越忙,这个数字就越多。 最后一个数字(间隔15分钟)往往是最准确的。

相反, CPU使用率是CPU用于处理计算机程序指令的时间量。

所以,如果你想产生任意的CPU使用率 (比如30%),你必须运行一个30%的时间占用CPU的进程,并占用 70%的进程。

我写了一个例子来告诉你:

 #include <stdlib.h> #include <unistd.h> #include <err.h> #include <math.h> #include <sys/time.h> #include <stdarg.h> #include <sys/wait.h> #define CPUUSAGE 0.3 /* set it to a 0 < float < 1 */ #define PROCESSES 1 /* number of child worker processes */ #define CYCLETIME 50000 /* total cycle interval in microseconds */ #define WORKTIME (CYCLETIME * CPUUSAGE) #define SLEEPTIME (CYCLETIME - WORKTIME) /* returns t1-t2 in microseconds */ static inline long timediff(const struct timeval *t1, const struct timeval *t2) { return (t1->tv_sec - t2->tv_sec) * 1000000 + (t1->tv_usec - t2->tv_usec); } static inline void gettime (struct timeval *t) { if (gettimeofday(t, NULL) < 0) { err(1, "failed to acquire time"); } } int hogcpu (void) { struct timeval tWorkStart, tWorkCur, tSleepStart, tSleepStop; long usSleep, usWork, usWorkDelay = 0, usSleepDelay = 0; do { usWork = WORKTIME - usWorkDelay; gettime (&tWorkStart); do { sqrt (rand ()); gettime (&tWorkCur); } while ((usWorkDelay = (timediff (&tWorkCur, &tWorkStart) - usWork)) < 0); if (usSleepDelay <= SLEEPTIME) usSleep = SLEEPTIME - usSleepDelay; else usSleep = SLEEPTIME; gettime (&tSleepStart); usleep (usSleep); gettime (&tSleepStop); usSleepDelay = timediff (&tSleepStop, &tSleepStart) - usSleep; } while (1); return 0; } int main (int argc, char const *argv[]) { pid_t pid; int i; for (i = 0; i < PROCESSES; i++) { switch (pid = fork ()) { case 0: _exit (hogcpu ()); case -1: err (1, "fork failed"); break; default: warnx ("worker [%d] forked", pid); } } wait(NULL); return 0; } 

如果你想吃一定量的RAM,你可以在cgkanchi的答案中使用该程序。

 while true; do openssl speed; done 

压力程序也会让你加载你想要模拟的cpu / mem / disk:

压力是POSIX系统的一个故意简单的工作负载生成器。 它在系统上强加一个可配置的CPU,内存,I / O和磁盘压力。 它是用C语言编写的,是GPLv2下的免费软件。

保持特定的cpu利用率,比如说30%,试试cpulimit:

它将适应当前的系统环境并调整系统上的任何其他活动。

这里还有一个内核补丁,用于处理本地CPU速率限制: http : //lwn.net/Articles/185489/

要吃掉一定数量的RAM,你可以:

 #include <stdlib.h> #include <string.h> #define UNIX 1 //remove the above line if running under Windows #ifdef UNIX #include <unistd.h> #else #include <windows.h> #endif int main(int argc, char** argv) { unsigned long mem; if(argc==1) mem = 1024*1024*512; //512 mb else if(argc==2) mem = (unsigned) atol(argv[1]); else { printf("Usage: loadmem <memory in bytes>"); exit(1); } char* ptr = malloc(mem); while(1) { memset(ptr, 0, mem); #ifdef UNIX sleep(120); #else Sleep(120*1000); #endif } } 

memset()调用似乎是必需的,因为至少在OS X上,实际的内存似乎并没有被使用,直到它被实际初始化。

编辑:修复回应评论

使用“memtester”在Linux中进行记忆回归测试。

我拿这个程序修改了这行:mem = 1024 * 1024 * 512; // 512 mb来说这个:mem = 1 * 1024 * 1024 * 1024; // 1 GB并编译它。

$ gcc iss_mem.c -o iss_mem

然后在上面的C程序的编译版本上写一个bash包装器。 它可以帮助我在服务器中产生大量的内存负载。

 #!/bin/bash # Author: Mamadou Lamine Diatta # Senior Principal Consultant / Infrastructure Architect # Email: diatta at post dot harvard dot edu # -------------------------------------------------------------------------------------- # ************************************************************************************* memsize_kb=`grep -i MemTotal /proc/meminfo | awk '{print $2}'` MemTotal=$(($memsize_kb*1024)) for i in `seq 1 50` do echo "`date +"%F:%H:%M:%S"` ----------------- Running [ $i ] iteration(s)" MemToAlloc=$((1*1024*1204*1204)) # 1Gb of memory per iss_mem call TRESHOLD=$(($MemTotal/$MemToAlloc)) # We are not supposed to make the system # run out of memory rand=1000 # High enough to force a new one while (( $rand > $TRESHOLD )) do rand=$(($RANDOM/1000)) done if [ $rand -eq 0 ] then rand=1 fi echo `date +"%F:%H:%M:%S"` Running $rand iss_mem in parallel ... for j in `seq 1 $rand` do ${ISSHOME}/bin/iss_mem > /dev/null & # NOTE: gcc iss_mem.c -o iss_mem done sleep 180 jobs -p kill `jobs -p` sleep 30 done # ------------------------------------------------------------------------------------- # ************************************************************************************* 

其实很简单:安装压力工具,并做:

 stress --vm X --vm-bytes YM 
  • 将X替换为你想要产生的工作者的数量和“ malloc() ”你的RAM
  • 将Y替换为每个工作人员必须分配的内存量

例:

 stress --vm 2 --vm-bytes 128M 

你有没有考虑过使用prime95 ?

我不确定你是否可以将它限制在这样的比例下

 mark@localhost$ time pi 1048576 | egrep '.*total$' 

是一个简单的基准测试命令,会给你的CPU一个无聊的,张贴你的时间:D

我发现加载RAM(和SWAP)最简单的方法是使用Perl:

 my $allocation = "A" x (1024 * 1024 * $ARGV[0]); print "\nAllocated " . length($allocation) . "\n"; 

希望这个应用程序将是有用的:

https://www.devin.com/lookbusy/

在使用lookbusy的github项目中找到了安装和使用的步骤。

https://github.com/beloglazov/cpu-load-generator

摘自Github页面:

要使用test.data文件在2个内核上分别产生20%,90%和50%的CPU利用率,每次20秒,

 python cpu-load-generator.py -n 2 20 test.data 

您可以强调实用程序,因为它是一个工作负载生成器工具,旨在使您的系统受到CPU,内存,I / O和磁盘压力的可配置测量。

要使用1GB的虚拟内存运行1个虚拟压力源60秒,请输入:

压力 – vm 1 –vm-bytes 1G –vm-keep -t 60s