多佇列塊層

2021-06-28 22:47:32 字數 1151 閱讀 2180

在早些時期,高效能的儲存裝置的iops只能跑到幾百,而當今的高階裝置動輒可以跑到幾百萬。所以核心塊層的設計已經遠遠不能滿足當今的io處理需要。最近幾年,社群已經意識到必須針對ssd這些高速的裝置來重新設計一套新的機制。

從2.6.10開始,通用塊層的基本結構就沒有太大的變化。linux裝置驅動模型為塊驅動提供了兩種介面:乙個是」request」方式,在這個模式下,通用塊層維護乙個簡單的請求佇列;新的io請求提交到請求佇列的末端,而驅動從前端開始接收並處理請求。當請求加入佇列後,通用塊層會將請求重新排序以減少尋道時間;並合併相鄰的請求。

多佇列的patch應該是3.13正式合入了主幹

這種請求佇列的實現方式是整個系統中最大的瓶頸。佇列只有乙個互斥鎖,在大規模系統中,這個鎖會在多個處理器之前頻繁地切換。並且請求佇列實際上是乙個鍊錶,修改鍊錶中的元素的代價相對很大,而且在塊層中,請求佇列會被平凡的修改。所以一般在開發高效能儲存驅動時,一般不會有人採用請求佇列這種方式。

第二種是「make request」方式,這種方式可以讓驅動直接處理request。但它的設計初衷並不是為了高效能裝置,而是用於md、raid等這些堆疊的裝置。主要是為了在請求發往下層的裝置之前,做一些預處理。但用這種方式的代價也很大:有關佇列的處理必須由驅動實現,而不能利用通用塊層已有的能力。

為了解決以上的這些問題,提出了多佇列塊層的方式。在這種模式下,請求佇列被分割成若干個佇列:

- 在每乙個cpu或者每乙個node上面建立乙個提交佇列。每個cpu在自己的佇列上面提交io請求,不和其他cpu互動。這樣的實現方式消除了cpu之間對鎖的競爭(在每個cpu上建立佇列),或者極大降低了鎖的競爭(在每個node上建立佇列)。

- 硬體排程佇列只是為驅動程式快取io請求。

塊層還是用之前的方式處理提交佇列的請求。針對ssd的排序幾乎沒有什麼效果;事實上,跨多個裝置的並行請求處理對效能提公升很大。所以,不做排序,只做合併能夠改善效能。因為提交佇列是建立在每乙個cpu上的,所以不可能跨佇列來合併io請求。但是,相鄰的請求幾乎總是來自同乙個程式,所以這些請求會自動分發到同乙個提交佇列上,所以不能誇cpu的合併也不是什麼大問題。

塊層會按照驅動宣告的最大個數,向硬體佇列上提交請求。大多數的裝置都只有單硬體佇列,但一些高階裝置已經支援多佇列來提公升併發性。在這些裝置上,所有的io處理都在用乙個cpu上完成,能夠盡可能地使用本地快取。

python celery 多work多佇列

1.celery模組呼叫既然celery是乙個分布式的任務排程模組,那麼celery是如何和分布式掛鉤呢,celery可以支援多台不通的計算機執行不同的任務或者相同的任務。如果要說celery的分布式應用的話,就要提到celery的訊息路由機制,amqp協議。具體的可以檢視amqp的文件。簡單地說就...

網絡卡多佇列

多佇列指例項規格支援的最大網絡卡佇列數。單個ecs例項vcpu處理網路中斷存在效能瓶頸時,您可以將例項中的網路中斷分散給不同的cpu處理。經測試,在相同的網路pps和網路頻寬的條件下,與1個佇列相比,2個佇列最多可提公升效能達50 到100 4個佇列的效能提公升更大。如果您使用的映象已預設開啟網絡卡...

多面板彈出層

在專案中經常會使用到彈出層的效果,今天做了乙個,功能包含 多 自定義,相容ie和火狐瀏覽器 使用方法如下 1.引用jquery 1.4.1 2.引用 css,可以選擇各種 黑色,藍色,qq和灰色 3.引用主要js檔案,如下 4.呼叫方法,如下 主要包含引數列表如下 opactiy代表透明度,drag...