我正在测试我的公司软件项目,并希望了解它在重负载条件下的工作原理。 反正有没有创建一个占用大量CPU的任务,只有在我告诉它时才会停止? 如果它不是以编程方式可能的,还有什么其他选择?例如。什么软件和输入可以快速帮助我创造这样的条件? 提前谢谢。
答案 0 :(得分:1)
这可以通过程序来完成。
消耗CPU:
一个简单的死循环不会占用所有的CPU,因为你的CPU可能有多个逻辑核心,所以你需要创建多个线程来完成它。这是代码:
DWORD WINAPI ConsumeSingleCore(LPVOID lpThreadParameter)
{
DWORD_PTR mask = 1 << (int) lpThreadParameter;
::SetThreadAffinityMask(::GetCurrentThread(), mask);
for (;;) {}
}
void ConsumeAllCores()
{
SYSTEM_INFO systemInfo = { 0 };
::GetSystemInfo(&systemInfo);
for (DWORD i = 0; i < systemInfo.dwNumberOfProcessors; ++i)
{
::CreateThread(NULL, 0, ConsumeSingleCore, (LPVOID)i, 0, NULL);
}
}
消耗记忆:
在堆上分配足够的对象会有所帮助,虽然它不是很准确,因为系统中的内部结构(如堆)会产生一些开销。如果您需要准确的号码。我认为直接使用虚拟内存将是一个不错的选择。这是代码:
void ConsumeRAM()
{
SYSTEM_INFO systemInfo = { 0 };
::GetSystemInfo(&systemInfo);
DWORD memSize = 1024 * 1024 * 1024;
char *buffer = (char *)::VirtualAlloc(NULL, memSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
// Touch all the pages, so system will try to allocate physical memory for them.
for (DWORD memAddrOffset = 0; memAddrOffset < memSize; memAddrOffset += systemInfo.dwPageSize)
{
buffer[memAddrOffset] = 0;
}
return;
}
如果您只需要一些工具进行测试,可以尝试CPU overload消耗一定数量的内核,MemAlloc消耗一定数量的内存。
答案 1 :(得分:0)
任何简单的循环都会占用CPU,通常在等待操作系统执行某些操作时处理产量,读取磁盘,访问网络,分配内存。
int quiteBig = 20000;
int a[quiteBig] ;
while ( true ) { // or check for a terminating condition
for ( long i = 0; i < quiteBig ; i++ ) {
a[i] = i;
}
}
答案 2 :(得分:0)
在C#中:
对于RAM
List<anyObject> hogger = new List<anyObject>();
for(long i = 0; i < someHugeNumber; i++)
hogger.Add(new anyObject());
基本上尝试查看占用所需空间所需的对象数量。
对于CPU
while(true)
;
即时100%CPU
如果你想少一点
while(true)
{
for(long i = 0; i < someNumber; i++)
{
;
}
Thread.Sleep(1);
}
有一些数字你可以调整休息前的疯狂周期数 =&GT;摆弄CPU使用率平均值的数字
作为while
- 循环的终止,您可以使用表单上的按钮或键组合等。
答案 3 :(得分:0)
是的,它是以编程方式实现的,因为其他人已经展示了如何加载CPU的示例。请注意,CPU负载通常只需要一个核心,因此您需要为每个核心运行一个程序副本(为每个核心分配一个脚本并指定它将运行的核心)
您还可以查看https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing