Ich habe nicht ganz verstanden, ob man willkürliche CPU-Last oder CPU-Auslastung . Ja, das sind in der Tat unterschiedliche Dinge. Ich werde versuchen, beide Probleme zu behandeln.
Zuallererst: laden ist die durchschnittliche Anzahl der Prozesse in der läuft , lauffähig o Warten auf CPU Scheduler-Warteschlangen in einer bestimmten Zeitspanne, sozusagen "derjenige, der Ihre CPU will".
Wenn Sie also willkürliche laden (z. B. 0,3) müssen Sie einen Prozess 30 % der Zeit laufen lassen und ihn dann 70 % der Zeit aus der Ausführungswarteschlange entfernen, indem Sie ihn z. B. in die Warteschlange für den Ruhezustand verschieben oder ihn abschalten.
Dazu können Sie dieses Skript verwenden:
export LOAD=0.3
while true
do yes > /dev/null &
sleep $LOAD
killall yes
sleep `echo "1 - $LOAD" | bc`
done
Beachten Sie, dass Sie einige Zeit (1, 10 und 15 Minuten) warten müssen, bis die entsprechenden Zahlen angezeigt werden, und dass dies durch andere Prozesse in Ihrem System beeinflusst wird. Je stärker Ihr System ausgelastet ist, desto mehr schwanken diese Zahlen. Die letzte Zahl (15-Minuten-Intervall) ist in der Regel die genaueste.
CPU-Last ist stattdessen die Zeitspanne, in der die CPU für die Verarbeitung von Anweisungen eines Computerprogramms verwendet wurde.
Wenn Sie also willkürliche CPU-Last (sagen wir 30 %) müssen Sie einen Prozess laufen lassen, der 30 % der Zeit an die CPU gebunden ist und 70 % der Zeit schläft.
Ich habe ein Beispiel geschrieben, um Ihnen das zu zeigen:
#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;
}
Wenn Sie eine feste Menge an RAM verbrauchen wollen, können Sie das Programm im cgkanchi 's Antwort .
15 Stimmen
Starten Sie eine Java-Anwendung.
2 Stimmen
@Paul - Er sagte "RAM kontrolliert auffressen". Java würde einfach alles durchkauen, was es will...:-P
0 Stimmen
Möchten Sie die CPU-Last oder die CPU-Auslastung berechnen?