2012-06-19 89 views
2

我正在使用pthreads,并且正在尝试将线程休眠X秒。让线程进入睡眠状态(c pthreads)

我已经试过sleep()nanosleep()pthread_cond_timedwait()(上假mutexlock等待X秒),pthread_yield(),每个线程醒来时检查的时间,看它是否是它的时间来运行,最后只忙着等待X秒。

问题是,虽然所有这些方法在考虑结果时都能正常工作,但它们并没有给出我期望的性能结果。性能是衡量吞吐量(每秒回复),而不是及时。

在我的配置中,我运行了3个软件线程,其中有2个模拟物理内核(运行Ubuntu Server的VirtualBox)。我希望在将3个线程中的1个睡眠时可以获得更好的性能,因为其他2个线程有一个专用物理内核可以运行。然而,我得到了完全相反的行为(用我所有的方法):增加睡眠时间会导致更糟糕的表现。 (注意睡眠线程的工作量是130-300ms。)

难道是因为虚拟化(主机有4个核心)?难道是因为我使用的方法与我的方法使用pthread_yield的方法类似吗?

sleep()nanosleep()是如何实现的?他们使用信号吗?你认为使用信号处理器和alarm()的实现会是更好的方法吗?当我拨打pthread_cond_wait()会发生什么?它是如何实现的?

我也尝试使用chrt更改调度策略,但没有运气。

+0

为什么不使用互斥量或信号量?保持线程仅在需要的时间内睡眠 – Jarry

+1

您能否给出示例代码以及实际性能数字(例如,来自'time'命令),以说明您的问题? –

+0

你的线程表现有多少工作?你睡了多久?多久?不要忘记上下文切换咀嚼宝贵的CPU周期。 –

回答

1
  1. 通过分析器运行你的代码,看看时间花在哪里。否则,你只会猜测,根据我的经验,这些猜测在90%的时间内是错误的。

  2. alarm()可以帮助,但它应该实际上做什么sleep()做的,所以我不会真的期望有所不同。

这里有一些想法可能导致此:

  • 缓存刷新。如果你的两个工作线程很好地使用缓存,那么切换到新线程可能意味着缓存刷新,这可能非常昂贵。这里的想法是,如果睡眠者让他们独立很长一段时间,工作线程可以填充更多的缓存。

  • 两个工作线程需要睡眠者锁定的资源。

  • 你测量性能的情况如何?也许你测量的其他一些效果(桌面搜索索引您的计算机,无论)

要到这条底线,你必须按功能来减少对码功能,直到所期望的行为开始出现+运行它在一个分析器中检查意外情况。

2

我同意@Aaron Digulla的观点,你永远无法通过命中和猜测得到答案。 但更重要的是,我不确定你是否正在测量正确的东西,至少你的说法是你的定期线程之间的睡眠时间越长,吞吐量就越差。按照这种逻辑,您可以将睡眠周期设置为无限次数(基本上大于您的测量周期),并且吞吐量应该是该集合中最差的。是这样吗?

请注意,测量服务器吞吐量可能是一个棘手的业务,容易受到测量和客户端设置中的许多缺陷。以下是一些示例,说明如何轻松地通过综合基准数来欺骗它:http://www.teamquest.com/pdfs/whitepaper/load-test.pdf

如果您对性能测量感兴趣,请阅读该文章。这是纯金。

+0

是的,是这样。关于测量,我对我的测量技术很有信心,尽管我不是服务器方面的专家。我还会阅读你的参考资料,看看是否有任何可能与我的案例有关的事情,并且我希望能够像你说的那样发现它是有益的:)。 – zakkak

+0

那么如果是这种情况,我认为你必须开始减少你的变量。你能在真实的物理多核机器上运行相同的测试吗(这样虚拟机的东西就不存在了)。此外,另一个值得一提的事情是将工作线程的数量从2增加到1,并查看吞吐量在哪里。 – chetan

+0

不幸的是,在物理多核上运行是不可能的,也是不可取的。我觉得玩的线程数是一个很好的主意,我不知道为什么我还没有尝试过。如果有什么有趣的话,我会让你知道的。 – zakkak

相关问题