none
Windows 2008 R2 线程亲和性问题??? RRS feed

  • 常规讨论

  • 有个棘手问题,请各位大神赐教:

    软件平台: Windows Server 2008 R2 Enterprise Service Pack 1

    硬件平台:Dell R710(双处理器,16GB内存)。

    软件开发平台:Visual Studio 2005 /c++开发

    问题:编写应用程序使用ioctl通过驱动提供的接口不断读写硬件寄存器,期间会有等待硬件返回状态,以便进行下一步操作。  

          正常情况下会在两分钟左右结束。但不稳定,有时候会出现半个小时~一个小时才能完成的情况。基本可以排除硬件问题,因为在Linux平台上表现十分稳定,从未出现过以上现象。该应用程序处理流程几乎与Linux一致。 

            通过观察发现,如果应用程序使用默认的CPU亲和性设置,就会出现以上现象,但在任务管理器中把该应用程序的CPU亲和性设置为Node0上的任何一个CPU,性能立刻恢复正常。如果设置为Node1上的任何一个CPU,性能立刻下降。通过Process Explorer观察,其性能差距(每秒下发的Ioctl数)达几十倍。而且只要设置完,性能立刻就会起变化。

           另一个观察到的现象是如果出现问题,所有处理必然集中在一个CPU上,但CPU占用率不高(10%~12%);不出现问题时,每个CPU上都有一定的CPU占用率,比较平均。需要指出的是,该应用程序要求所有操作必须是串行执行,不能并发执行。

           曾尝试使用了SetThreadIdealProcessor()函数将线程的preferred processor设置为Node 0上的CPU,情况有很大改善,但未彻底解决,也未找到问题的真正原因。还未尝试过SetThreadAffinityMask()函数。

           希望可以提供一个有效的方法彻底定位或解决此问题。谢谢!

    2012年9月5日 15:06

全部回复

  • 我不了解Linux内核函数。。。。帮忙顶起来

    Lazylamb loves smelly cat.

    2012年9月7日 9:09
  • 您好,

    感谢您在论坛中的积极参与。

    根据您的描述,这个问题可能比较难找到一个确切的答案,所以我暂时把它改为常规讨论贴,感谢您的理解。


    Damon Zheng [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月14日 9:35
    版主