线程如何使用不到100%的挂壁时间?

时间:2011-02-09 14:27:43

标签: .net profiling dottrace

在分析应用程序时(使用dotTrace),我注意到一件非常奇怪的事情。我使用了“壁时间”测量,这在理论上应该意味着所有线程都会运行相同的时间。

但事实并非如此:有些线程(实际上我最感兴趣的话题)显示的总时间比其他线程少2倍。例如,分析运行230秒,大多数线程报告线程花费230秒,但5个线程仅显示100-110秒。这些不是线程池线程,它们肯定是在分析开始之前创建和启动的。

这里发生了什么?

更新我会添加更多可能相关或不相关的信息。有问题的应用程序(它是一个游戏服务器)有大约20-30个不断运行的线程。大多数线程遵循简单的模式:它们检查传入的队列是否有工作,如果有的则可以工作。 thread func的代码如下所示:

while(true){
    if(TryDequeueWork()){ // if queue is not empty
        DoWork();         // do whatever is was on top
    }else{
        m_WaitHandle.WaitOne(MaxTimeout); // m_WaitHandle gets signaled when work is added to queue
    }
}

显示奇怪时间的线程是这样的,除了它们提供多个队列,如下所示:

while(true){
    bool hasAnyWork=false;
    foreach(var queue in m_Queues){
        if(queue.TryDequeueWork()){
            hasAnyWork=true;
            DoWork();
        }
    }
    if(!hasAnyWork){ 
        m_WaitHandle.WaitOne(MaxTimeout); 
    }
}

奇怪的线程除了记录之外不会做任何IO。其他非奇怪的线程也可以进行日志记录。在profiler中报告等待WaitHandle所花费的时间;实际上,一些非奇怪的线程花费了他们几乎所有的时间等待(因为他们从来没有任何工作)。

该应用程序在8核虚拟机(VPS主机)上运行。我不知道那里使用了什么物理处理器。

2 个答案:

答案 0 :(得分:1)

他们在分析器完成之前完成了吗?

答案 1 :(得分:1)

如果

,您只能获得100%的待机时间
  • 您的计算机至少拥有与线程一样多的核心
  • 一个线程除了刻录cpu周期之外什么都不做,并且永远不会被同步对象(如 lock )或I / O请求阻止。

两者都不太可能,很少有问题能够很好地扩展。 Amdahl's law是相关的。