【问题标题】:Create a task that takes up a specific amount of CPU and RAM创建一个占用特定数量的 CPU 和 RAM 的任务
【发布时间】:2014-08-01 05:00:43
【问题描述】:

我正在测试我公司的软件项目,想看看它在高负载条件下的工作情况。 无论如何要创建一个占用大量 CPU 并且只有在我告诉它时才会停止的任务? 如果不能以编程方式实现,还有哪些其他选择?例如。有什么软件和输入可以快速帮助我创造这样的条件? 提前致谢。

【问题讨论】:

  • 它是一个网络项目吗?在这种情况下可以使用负载测试器。
  • @holdenweb:不,不是。这是一个桌面应用程序。
  • 你可以用一些测试工具来拿。
  • @RongNguyen:你能说得更具体点吗?这些工具的名称是什么?

标签: java c# python c++ windows


【解决方案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消耗一定数量的内存。

【讨论】:

  • 你能回答这部分询问是否可以通过编程方式实现吗?
  • 当然,我刚刚将这部分添加到答案中。
【解决方案2】:

任何简单的循环都会消耗 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;
    }

 }

【讨论】:

    【解决方案3】:

    在 C# 中:
    对于内存

    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);
    }
    

    使用一些数字,您可以调整休息前的疯狂循环次数
    => 摆弄平均降低 CPU 使用率的数字

    作为while-loops 的终止,您可以使用表单上的按钮或组合键等。

    【讨论】:

      【解决方案4】:

      是的,它可以通过编程方式实现,因为其他人已经展示了如何加载 CPU 的示例。请注意,CPU 负载通常只占用一个内核,因此您需要为每个内核运行一份程序副本(为每个内核分配一个脚本并指定它将在哪个内核上运行)

      你也可以关注https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多