併發程式設計10 效能和可伸縮性

2021-09-23 21:25:19 字數 1536 閱讀 6622

使用多執行緒也會引入一些效能的開銷,比如執行緒協調,上下文切換,執行緒建立和消亡。 當使用過度的時候這些開銷可能超過對吞吐量響應和提高計算能力帶來的好處。

可伸縮性就是可以通過增加計算資源(cpu,記憶體)來提供程式的吞吐量或者效能。

程式的序列化**影響程式的效能,使用多執行緒來優化效能時,序列部分無法優化。

上下文切換,比如哪個等待,哪個執行,會損害效能

競爭性的鎖會損失效能和可伸縮性。

通常可以:

- 減少持有鎖的時間

- 減少請求鎖的頻率

- 用協調機制代替獨佔鎖

縮小鎖的範圍

快進快出原則,為了減少持有鎖的時間

分拆鎖

private listlist1 = new arraylist();

private listlist2 = new arraylist();

public

synchronized

void

add1(string item)

public

synchronized

void

add2(string item)

分拆為:

private listlist1 = new arraylist();

private listlist2 = new arraylist();

public

void

add1(string item)

}public

void

add2(string item)

}

分離鎖

跟分拆鎖差不多。不如concurrentmap的實現,對每個桶使用乙個鎖,這樣就可以支援多個併發寫了,當然前提是hashcode對映到了不同的鎖上。

分離鎖這種辦法很適用於競爭相同鎖,但是競爭的不是相同資料的程式。

獨佔鎖替代方式

熱點域是使用了分離鎖之後的,仍然避免不了的全域性鎖。concurrenthashmap的size()方法避免了熱點域,給每個桶單獨維護了乙個計數器。

readwriterlock 這樣支援讀併發,但是有寫就阻塞的鎖形式

用原子變數來減少熱點域帶來的併發損失

監測cpu使用率

為了監測我們的處理器是否充分利用,可以監測cpu使用率,如果太過於清閒了,可以看看是不是如下的原因:

- 負載不夠。 加大併發量

- i/0限制 perfmon來檢視是否是因為頻寬限制

- 外部限制,通過profiler工具來判斷等待外部服務結果的用時

- 鎖競爭,使用profiling,檢視程式中存在多少個鎖的競爭。

用後台程式處理任務

比如log,單啟執行緒來進行列印操作,使用執行緒池和佇列的方式。需要考慮如下的問題:

- 服務擔保, 保證成功加入佇列的訊息都能在服務終止前被記錄?

- 飢餓策略,如果生產者比消費者快怎麼辦?

- 生命週期, 如果在伺服器停止的時候關閉消費者

- 中斷,如果執行緒被中斷(如伺服器重啟)會怎麼辦

java併發程式設計實戰 效能與可伸縮性1

1,效能與可伸縮性 1.1,要想通過併發來獲得更好的效能,需要努力做好兩件事 更有效地利用現有處理資源,以及在出現新的處理資源時使程式盡可能地利用這些新的資源。1.2,應用程式效能可以採用多個指標來衡量 服務時間,延遲時間,吞吐率,效率,可伸縮性以及容量等 1.3,可伸縮性指的是 當增加計算資源時 ...

Linux 核心效能和可伸縮性

linux 作為 web 伺服器作業系統,展示了其高可靠性,最多可達4路的對稱多處理器 smp 它的smp可伸縮性 磁碟和網路i o效能,排程程式和虛擬記憶體管理器。硬體和軟體 ia 32體系結構 資料庫 查詢資料庫基準測試程式,而在硬體上,採用帶大磁碟配置的 8 路 smp 系統。資料庫軟體採用 ...

多執行緒效能與可伸縮性

1 單執行緒程式不需要執行緒排程也不需要同步開銷,而且不需要使用鎖來保證資料結構的一致性。在多執行緒的排程和協調中都需要一定的效能開銷。對於為了效能而引入多執行緒的程式,並行帶來的效能提公升必須要超過併發導致的開銷。2 上下文切換 如果可執行的執行緒數大於 cpu 的數量,那麼作業系統最終會將某個正...