我正在尝试分析我在一台大型机器(32 核,256GB RAM)上编写的多线程程序。我注意到在两次运行之间,程序的性能可能会有很大差异(70-80%)。我似乎无法找到程序性能出现这种巨大差异的原因,但是通过分析大量运行的“时间”实用程序的结果,我注意到非自愿上下文切换的数量与程序性能(显然,更少的上下文切换会带来更好的性能,反之亦然)。
有什么好的方法可以确定是什么导致了这种上下文切换?如果我能找到罪魁祸首,那么也许我可以尝试解决问题。但是,我对可以使用的工具有一些特殊限制。首先,我在这台机器上没有 root 权限,所以任何需要这种权限的工具都没有了。其次,它是一个相当老的内核(RHEL5,内核 2.6.18),所以一些标准的性能事件可能不存在。无论如何,任何关于如何更深入地挖掘上下文切换原因的建议都将不胜感激。
更新:我决定在另一台(更小的)机器上测试我的程序。另一台机器是一个 4 核(带有超标题)的 linux 机器,具有 8Gb 的 RAM,以及一个更新的内核——另一台机器上的 3.2.0 与 2.6.18。在新机器上,我无法重现双模式性能配置文件。这让我相信这个问题要么是由于硬件问题(正如评论中所建议的那样),要么是由于内核级别的一个特别病态的情况,该情况已被修复。我目前最好的假设是,这可能是因为新机器有一个带有完全公平调度程序 (CFS) 的内核,而旧机器没有。有没有办法测试这个假设(告诉新机器使用不同/旧的调度程序)而不必为新机器重新编译一个古老的内核版本?