我正在开发一个小功能,它可以让我的用户了解CPU的占用情况。
我正在使用cat /proc/loadavg
,它会返回众所周知的3个数字。
我的问题是,当我正在开发时,CPU现在没有做任何事情。
有没有一种很好的方法可以在CPU上生成som负载,我想的是像makecpudosomething 30
这样的负载为0.3或类似的负载。这样的应用程序是否存在?
另外,有没有办法以受控的方式吃掉RAM?
由于
迈克尔
答案 0 :(得分:13)
while true;
do openssl speed;
done
压力程序还可以让你将cpu / mem / disk加载到你想要模拟的级别:
压力是故意的简单 POSIX系统的工作负载生成器。 它强加了可配置的数量 CPU,内存,I / O和磁盘压力 系统。它是用C语言编写的 免费软件根据 的GPLv2。
维持特定级别的cpu利用率,比如说30%,试试cpulimit:
它将适应当前的系统环境并调整系统上的任何其他活动。
这里还有针对本机cpu速率限制的内核补丁:http://lwn.net/Articles/185489/
答案 1 :(得分:7)
如果你想生成任意CPU load or CPU utilization,我不太了解。是的,它们确实是不同的东西。我会尽力解决这两个问题。
首先: load 是正在运行, runnable 或等待的平均进程数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 usage 是CPU用于处理计算机程序指令的时间。
因此,如果你想生成任意 CPU使用率(比如说30%),你必须运行一个30%的CPU占用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答案中的程序。
答案 2 :(得分:3)
要吃掉固定数量的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上,实际内存在实际初始化之前似乎没有被使用。
编辑:已修复以回复评论
答案 3 :(得分:2)
答案 4 :(得分:2)
使用“memtester”在Linux中进行内存回归测试。
答案 5 :(得分:1)
我接受了这个程序并修改了这行: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
# -------------------------------------------------------------------------------------
# *************************************************************************************
答案 6 :(得分:1)
实际上很简单:安装stress工具并执行:
stress --vm X --vm-bytes YM
malloc()
”RAM 示例:
stress --vm 2 --vm-bytes 128M
答案 7 :(得分:0)
您是否考虑过使用prime95?
我不确定你是否可以将它限制在像这样的百分比......
答案 8 :(得分:0)
mark@localhost$ time pi 1048576 | egrep '.*total$'
是一个简单的基准测试命令,可以让你的cpu成为一个烦恼,发布你的时间:D
答案 9 :(得分:0)
我发现加载RAM(和SWAP)的最简单方法是使用Perl:
my $allocation = "A" x (1024 * 1024 * $ARGV[0]);
print "\nAllocated " . length($allocation) . "\n";
答案 10 :(得分:0)
希望这个应用程序有用:
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
答案 11 :(得分:0)
你可以强调实用程序,因为它是一个工作负载生成器工具,旨在使系统受到CPU,内存,I / O和磁盘压力的可配置测量。
要使用1GB虚拟内存运行1 vm压力源60秒,请输入:
压力--vm 1 --vm-bytes 1G --vm-keep -t 60s
答案 12 :(得分:0)
1G内存
python -c 'a="a"*1024**3;raw_input()'
答案 13 :(得分:0)
我认为这篇文章对此很有创意。 Credit to solution
例如,这应“强调” 100 MB 2分钟
cat <(yes | tr \\n x | head -c $((1024*1024*100))) <(sleep 120) | grep n