Linux:如何加载系统内存?

Rei*_*ler 5 linux cpu load

我正在开发一个小功能,它可以让我的用户了解CPU的占用情况.我正在使用cat /proc/loadavg,它返回了众所周知的3个数字.

我的问题是,当我正在开发时,CPU现在没有做任何事情.

有没有一种很好的方法来在CPU上产生som负载,我想的是makecpudosomething 30,对于0.3或类似的负载.这样的应用程序是否存在?

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

谢谢

迈克尔

jsp*_*cal 14

while true;
    do openssl speed;
done
Run Code Online (Sandbox Code Playgroud)

压力程序还可以让你将cpu/mem/disk加载到你想要模拟的级别:

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

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

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

在这里还有一个针对本机cpu速率限制的内核补丁:http://lwn.net/Articles/185489/


Car*_*ino 7

如果您想生成任意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
Run Code Online (Sandbox Code Playgroud)

请注意,您必须等待一段时间(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;
}
Run Code Online (Sandbox Code Playgroud)

如果你想吃掉固定数量的RAM,可以使用cgkanchi的答案中的程序.


Fen*_*eng 6

1G内存

python -c 'a="a"*1024**3;raw_input()'
Run Code Online (Sandbox Code Playgroud)

  • 对于 Python 3:`python -c 'a="a"*1024**3; 输入()'` (2认同)

Chi*_*chi 5

要消耗固定数量的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

memset() 调用似乎是必需的,因为至少在 OS X 上,实际内存在实际初始化之前似乎不会被使用。

编辑:已修复以回应评论

  • 操作系统很快就会换掉所有的 RAM。您可能应该在循环中执行 memset() 以便这些页面将保留在 RAM 中。 (2认同)