I didn’t understand very well if you want to create arbitrary CPU load or processor load . Yes, these are really different things. I will try to address both issues.
First of all: load - the average number of processes in starting, starting, or waiting for the CPU scheduler queues for a certain period of time, “so that your processor” has it.
So, if you want to generate an arbitrary load (say, 0.3), you must start the process within 30% of the time, and then remove it from the execution queue within 70% of the time, for example, moving it to a sleeping queue or killing it.
You can try this script to do this:
export LOAD=0.3 while true do yes > /dev/null & sleep $LOAD killall yes sleep `echo "1 - $LOAD" | bc` done
Please note that you need to wait some time (1, 10 and 15 minutes) to get the corresponding numbers, and other processes in your system will influence it. The more busy your system, the more numbers will float. The last number (interval of 15 minutes) tends to be the most accurate.
CPU usage is the time that the processor has been used to process computer program instructions.
So, if you want to generate arbitrary CPU usage (say, 30%), you must start a process that is associated with the processor in 30% of cases and is 70% of it.
I wrote an example to show you that:
#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; }
If you want to eat a fixed amount of RAM, you can use the program in cgkanchi's answer.