【发布时间】:2013-06-20 10:01:01
【问题描述】:
我正在尝试分析我在一台大型机器(32 核,256GB RAM)上编写的多线程程序。我注意到在两次运行之间,程序的性能可能会有很大差异(70-80%)。我似乎无法找到程序性能出现这种巨大差异的原因,但是通过分析大量运行的“时间”实用程序的结果,我注意到非自愿上下文切换的数量与程序性能(显然,更少的上下文切换会带来更好的性能,反之亦然)。
有什么好的方法可以确定是什么导致了这种上下文切换?如果我能找到罪魁祸首,那么也许我可以尝试解决问题。但是,我对可以使用的工具有一些特殊限制。首先,我在这台机器上没有 root 权限,所以任何需要这种权限的工具都没有了。其次,它是一个相当老的内核(RHEL5,内核 2.6.18),所以一些标准的性能事件可能不存在。无论如何,任何有关如何深入挖掘此上下文切换原因的建议都将不胜感激。
更新:我决定在另一台(更小的)机器上测试我的程序。另一台机器是一个 4 核(带有超标题)的 linux 机器,具有 8Gb 的 RAM,以及一个更新的内核——另一台机器上的 3.2.0 与 2.6.18。在新机器上,我无法重现双模式性能配置文件。这使我相信这个问题要么是由于硬件问题(如 cmets 中所建议的那样),要么是由于内核级别的一个特别病态的情况,该情况已被修复。我目前最好的假设是,这可能是因为新机器有一个带有完全公平调度程序 (CFS) 的内核,而旧机器没有。有没有办法测试这个假设(告诉新机器使用不同/旧的调度程序),而不必为新机器重新编译一个古老的内核版本?
【问题讨论】:
-
“非自愿上下文切换”是指“其他进程想要运行”,还是“我的进程做了一些事情导致系统在系统完成某些工作时停止它,例如等待一些要从磁盘或网络加载的文件数据”?
-
你知道 pthread_cond_t 吗?
-
@MatsPetersson 是的 - '首先,我在这台机器上没有 root 权限'并不建议独占使用它。
-
询问系统管理员,谁有权限,找出来。
-
@DanielKO --
time实用程序实际上通过自愿/非自愿分解上下文切换。这里的非自愿上下文切换的定义是当您的进程由于某种原因被操作系统抢占,而不是它自愿放弃控制(例如让步/等待)。当它的时间片到期并且有更高优先级的进程要运行时,可能会发生这种情况,并且可能在许多其他条件下也是如此。
标签: c++ multithreading performance profiling context-switch