簡體   English   中英

測量無等待多線程java程序中的爭用

[英]Measure contention in wait-free multi-threaded java programs

我有二進制搜索樹的無等待實現,但我無法找出測量線程爭用的具體方法。 通過爭用,這里我的意思是嘗試同時訪問同一塊內存的線程數。

到目前為止,我已經搜索了ThreadMXBean和ThreadInfo類,但由於沒有涉及鎖,我還沒有找到任何解決方案。

如果沒有過高的性能成本,就無法衡量“內存位置”的爭用。 直接測量(例如,正確同步的計數器包裹所有訪問)將引入人為瓶頸,這將破壞測試可靠性。

在您想要測量它的比例上松散地定義“同一時間”,因為在給定時間內只有一個CPU“擁有”內存中的特定位置。 在這種情況下,您可以做的最好的事情是測量CPU處理內存沖突的速率,例如通過HW計數器。 這樣做需要了解給定平台上的內存子系統。 此外,HW計數器屬性為機器(= CPU)狀態,而不是內存狀態; 換句話說,您可以估計特定指令經歷的沖突數,而不是訪問給定內存位置的CPU數量。

在爭用源中嘗試該措施是錯誤的方法。 什么可能是爭論的原因?!

因此,首先,設置一個基准測試套件,在您的數據結構上運行典型的訪問模式,並繪制不同線程數的性能圖。 這是nitro緩存性能頁面的一個很好的例子。

如果你幾乎是線性的:祝賀,你完成了!

如果不進行線性擴展,則需要更多洞察力。 現在您需要將系統整體分析,看看是什么原因,例如CPU管道停頓。 最好的方法是使用低開銷跟蹤。 在Linux上,您可以使用OProfile OProfile還提供Java支持,可幫助您將JITed機器代碼與Java程序相關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM