3

我正在使用pthreads并试图让线程休眠 X 秒。

我试过sleep(),,nanosleep()pthread_cond_timedwait()等待一个假的互斥锁 X 秒),,pthread_yield()每次线程唤醒时检查时间,看看是否该运行,最后只是忙等待 X 秒。

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

在我的配置中,我在 2 个模拟物理内核(运行 Ubuntu Server 的 VirtualBox)上运行 3 个软件线程。当让 3 个线程中的 1 个进入睡眠状态时,我希望获得更好的性能,因为其他 2 个线程有一个专用的物理内核可以运行。然而,我得到了完全相反的行为(我所有的方法):增加睡眠时间会降低性能。(注意,休眠线程的工作负载为 130-300ms。)

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

是如何实施sleep()nanosleep()?他们使用信号吗?您认为使用信号处理程序的实现alarm()会是更好的方法吗?当我打电话时会发生什么pthread_cond_wait()?它是如何实施的?

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

4

2 回答 2

3

我同意@Aaron Digulla 的观点,即您永远不会通过反复试验和猜测来回答性能问题。但更重要的是,我不确定你测量的是正确的东西,至少按照你的说法,你的周期性线程之间的睡眠时间越长,你的吞吐量就越差。按照这种逻辑,您可以将睡眠时间设置为无限数(基本上大于您的测量时间),并且您的吞吐量应该是最差的。是这样吗?

请注意,测量服务器吞吐量可能是一项棘手的业务,在测量和客户端设置中存在许多陷阱。这里有一些例子说明你的综合基准数字是多么容易被欺骗: http ://www.teamquest.com/pdfs/whitepaper/load-test.pdf

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

于 2012-06-19T19:25:54.603 回答
1
  1. 通过分析器运行您的代码以查看时间花在了哪里。否则,你只是在猜测,根据我的经验,这些猜测在 90% 的情况下都是错误的。

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

以下是可能导致此问题的一些想法:

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

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

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

要深入了解这一点,您必须逐个功能地减少代码功能,直到所需的行为开始出现 + 在分析器中运行它以检查意外情况。

于 2012-06-19T18:56:34.533 回答