none
Windows Server 2008 R2 Enterprise对进程CPU的使用限制 RRS feed

  • 问题

  • 您好!
         我在以下的机器配置上做了一个测试:

    代码功能:写一个C测试程序,多线程的计算程序,用 while 循环来 hold 住每一个线程,然后看看最高能占用多少 CPU。
    实现:我从main()函数传入两个参数:并发线程数目和线程运行结束时间
    实验结果如下:
    线程数  时间    最高CPU消耗  线程数
     5      5min      16           6    
    25      5min      32          26    
    50      5min      28          51    
    55      2min      32          56    
    60      2min      28          61    
    61      2min      30          62    
    62      2min      32          63    
    63      2min      30          64    
    64      2min      31          65    

    结论:最多可测试的线程数目为64,占有的CPU最高为32%。测试65以上(包含65)个线程时,程序会被系统强制退出。    

    机器配置如下:
    操作系统:Windows Server 2008 R2 Enterprise Service Pack 1
    处理器:   Intel(R) Xeon(R) CPU   E7520 @ 1.87GHz  1.87GHz (4处理器)
    安装内存: 16.0GB
    系统类型:64位操作系统

    问题: 在Windows Server 2008 R2上,对进程使用CPU是否有一定的限制机制?具体的机制是怎么样的?谢谢!

    问题补充:线程数目受限的问题已经解决,谢谢heroboy_ywq!但是当我并发100,500,1000个线程时,该进程消耗的CPU值在27~32范围之间波动,对进程使用CPU是有什么受限的机制吗?

    • 已编辑 bery.zhang 2012年2月23日 9:09 补充问题
    2012年2月21日 6:42

全部回复

  • 你在主线程用WaitForMultipleObjects了吧,它最多只能等64个句柄。
    2012年2月23日 3:35
  • 你在主线程用WaitForMultipleObjects了吧,它最多只能等64个句柄。

    对,我是在主线程用WaitForMultipleObjects

    最多只能等64个句柄,是系统设定的吗?有什么资料可以参考呢?谢谢!

    2012年2月23日 6:02
  • https://www.google.com/search?q=WaitForMultipleObjects
    2012年2月23日 6:19
  • 谢谢!我已经找到资料了,解决了线程数目受限的问题。

    但是还有另外一个问题:就是在Windows Server 2008 R2上,当我并发100,500,1000个线程时,该进程消耗的CPU值在27~32范围之间波动,该系统对进程使用CPU是有什么受限的机制吗?

    2012年2月23日 9:12
  • 你线程的while循环里写了什么,是不是有Sleep
    2012年2月23日 9:20
  • while循环里没有Sleep。以下是线程函数代码:

    /** 
    * 线程回调函数,用while()hold住线程,在指定的时间段内执行 
    * @param  tp:传入函数的结构体,包含结束时间和线程编号
    */
    static DWORD WINAPI ThreadFun(LPVOID tp)
    {
    	printf("Start to execute the thread function.\n");
    
    	struct ThreadParam* threadParam = (struct ThreadParam*)tp;
    	const char* cendTime = threadParam->endTime;
    	const int handle = threadParam->ihandle;
    
    	string stopTime(cendTime);
    
    	while(true)
    	{
    		if(IsSetTime(stopTime)==true)  //判断是否到达指定时间
    		{
    			printf("\n The thread %d is end\n", handle);
    			break;
    		}
    		else
    		{   
    			continue;
    		}
    	}
    
    	return 0;
    }


    2012年2月23日 9:29
  • CPU 在 27-31,明显就是 1/4 CPU。

    也就是 可能是 4核心的CPU ,你只用了一个。

    你没有处理并行计算。


    我也有自己的签名档哦!

    2012年2月25日 3:41
  • 围观楼主, 期待解答.

    2012年2月27日 4:57
  • 请问,并发处理不是由系统自主控制的吗?

    如果要做并发处理,该如何做呢?有什么可供参考的资料啊,谢谢!

    2012年2月28日 1:52
  • .

          嘿, 楼主试试设置 /MT 呢 ? 编译成发布版      别说这是CRT的原因哦...  

          另外, windows核心编程(5th) 那本书有关于CPU亲和性的讲解, 不过也搞不清楼主用的服务器是多核心还是多处理器


    2012年2月28日 2:35