gpt4 book ai didi

.net - 线程如何使用少于 100% 的墙时间?

转载 作者:行者123 更新时间:2023-12-02 02:28:06 29 4
gpt4 key购买 nike

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

但事实并非如此:某些线程(实际上是我最感兴趣的线程)显示的总时间比其他线程少大约 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。其他非奇怪的线程也进行日志记录。在分析器中报告等待 WaitHandle 所花费的时间;实际上,一些非奇怪的线程几乎所有时间都在等待(因为它们从来没有任何工作)。

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

最佳答案

他们是否在分析器完成之前就完成了?

关于.net - 线程如何使用少于 100% 的墙时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4946164/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com