[英]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.