Linux: Как создать нагрузку для системной памяти?

Я работаю над небольшой функцией, которая дает моим пользователям изображение того, насколько занятый ЦП.

Я использую cat /proc/loadavg, который возвращает известные 3 числа.

Моя проблема состоит в том, что ЦП ничего не делает, прямо сейчас, в то время как я разрабатываю.

Есть ли хороший способ генерировать некоторую нагрузку на ЦП, я думал что-то как makecpudosomething 30, для загрузки 0,3 или подобный. Приложению нравится, это существует?

Кроме того, есть ли какой-либо способ съесть RAM управляемым способом?

5
задан amelvin 24 July 2019 в 12:31
поделиться

6 ответов

Я не очень хорошо понял, если вы хотите сгенерировать произвольную загрузку процессора или загрузку процессора. Да, это действительно разные вещи. Попробую описать обе проблемы.

Прежде всего: load - это среднее количество процессов в запущенном , запущенном или ожидающих очереди планировщика 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-минутный интервал), как правило, наиболее точное.

Использование процессора - это количество времени, в течение которого процессор использовался для обработки инструкций компьютерной программы.

Итак, если Вы хотите сгенерировать произвольное использование процессора (скажем, 30%), то Вы должны запустить процесс, который на 30% связан с процессором и спит 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;
}

Если Вы хотите съесть фиксированное количество оперативной памяти, то Вы можете использовать программу в ответе cgkanchi.

.
7
ответ дан 18 December 2019 в 05:40
поделиться

Вы можете попробовать http://code.google.com/p/stressapptest/

2
ответ дан 18 December 2019 в 05:40
поделиться

Чтобы съесть фиксированный объём оперативной памяти, можно просто:

#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() кажется необходимым, потому что, по крайней мере, на операционной системе X, фактическая память, кажется, не используется до тех пор, пока не инициализируется.

EDIT: Исправлено в ответ на комментарий

.
3
ответ дан 18 December 2019 в 05:40
поделиться
while true;
    do openssl speed;
done

также программа стресса позволит вам загрузить процессор/мем/диск до уровней, которые вы хотите имитировать:

stress is a преднамеренно простой генератор нагрузки для систем POSIX. Он накладывает на конфигурируемое количество нагрузка на процессор, память, входы/выходы и диски на систему. Она написана на C, и свободное программное обеспечение, лицензированное под GPLv2.

для поддержания определенного уровня использования вычислительных процессоров, скажем 30%, попробуйте cpulimit:

он адаптируется к текущему системному окружению и подстраивается под любую другую активность в системе.

здесь также есть заплатка к ядру для нативных ограничений скорости работы вычислительных процессоров: http://lwn.net/Articles/185489/

14
ответ дан 18 December 2019 в 05:40
поделиться

Вы не думали использовать prime95?

Я не уверен, что вы можете ограничить его до такого процента, как этот то...

.
0
ответ дан 18 December 2019 в 05:40
поделиться
mark@localhost$ time pi 1048576 | egrep '.*total$'

Это простая команда бенчмаркинга, которая даст вашему процессору рост, сообщит ваше время :D

.
0
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: