我有一個多線程服務器C++程序,它使用MSXML6並不斷分析XML消息,然後應用準備好的XSLT轉換來生成文本。我在有4個CPU的服務器上運行它。每個線程都是完全獨立的,並使用自己的變換對象。線程之間不共享任何COM對象。MSXML XSL轉換mutthreaded性能爭用
這很好,但問題是可擴展性。運行時:
- 有一個線程,我得到每個線程每秒約26個parse +轉換。
- 與2個線程,我得到約20/s /線程,
- 與3線程,18/s /線程。
- 4線程,15/s /線程。
線程之間沒有共享我期望接近線性的可擴展性,所以它應該是4線程的4倍,而不是1線。相反,它只有2.3倍的速度。
它看起來像一個經典的爭用問題。我編寫了測試程序來消除我的代碼中存在爭用的可能性。我正在使用DOMDocument60類而不是FreeThreadedDOMDocument類,以避免不必要的鎖定,因爲文檔永遠不會在線程之間共享。我很難看到任何緩存行虛假共享的證據,至少在我的代碼中沒有任何證據。
另一個線索是,每個線程的上下文切換率大於15k/s。 我猜測罪魁禍首是MSXML中的COM內存管理器或內存管理器。也許它有一個全局鎖,必須獲取並釋放每個內存分配/釋放。我無法相信,在當今這個時代,內存管理器的寫入方式並不是多線程多CPU場景中可以很好地擴展的方式。
有沒有人有任何想法是什麼導致這個爭論或如何消除它?
+1爲多進程而不是多線程。 – 2008-11-28 19:23:15