创建一个占用特定CPU和RAM数量的任务
本文关键字:RAM CPU 任务 一个 创建 | 更新日期: 2023-09-27 18:15:51
我正在测试我公司的软件项目,想看看它在重载条件下是如何工作的。有没有办法创建一个占用大量CPU的任务,只有在我告诉它停止时才会停止?如果在编程上不可行,还有其他选择吗?例如,有什么软件和输入可以快速帮助我创建这样的条件?
这可以通过程序来完成。
占用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过载消耗一定数量的内核和MemAlloc消耗一定数量的内存。
任何简单的循环都会消耗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;
}
}
c#中:
为RAM
List<anyObject> hogger = new List<anyObject>();
for(long i = 0; i < someHugeNumber; i++)
hogger.Add(new anyObject());
基本上试着看看你需要多少物体占用你想要的空间。
For CPU
while(true)
;
这是一个即时的100% CPU
如果你想少一点
while(true)
{
for(long i = 0; i < someNumber; i++)
{
;
}
Thread.Sleep(1);
}
使用一些数字,您可以在中断前调整疯狂循环的数量
=>调整CPU使用的平均值
作为while
-循环的终止,您可以使用表单上的按钮或键组合或其他东西。
是的,这在编程上是可能的,因为其他人已经展示了如何加载CPU的示例。请注意,CPU负载通常只占用一个核心,因此您需要为每个核心运行程序的副本(为每个核心分配一个脚本并指定它将在哪个核心上运行)
您也可以查看https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing