久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Linux塊層多隊列中如何引入內核

155次閱讀
沒有評論

共計 2324 個字符,預計需要花費 6 分鐘才能閱讀完成。

本篇內容主要講解“Linux 塊層多隊列中如何引入內核”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“Linux 塊層多隊列中如何引入內核”吧!

首先過目一下多隊列架構:

以讀 IO 為例,單隊列和多隊列相同的執(zhí)行路徑:

read_pages() { ... blk_start_plug() /*  進程準備蓄流  */ mapping- a_ops- readpages() /*  蓄流  */ blk_finish_plug() /*  進程開始泄流  */ ... } io_schedule()  進程蓄流之后等待 io 完成  (在 blk_mq_make_request()函數(shù)中 request 的數(shù)目大于或者等于 16 request_count  = BLK_MAX_REQUEST_COUNT  不需要調用 io_schedule(), 直接泄流到塊設備驅動)

mapping- a_ops- readpages() 會一直調用 q - make_request_fn()

generic_make_request() q- make_request_fn()  調用 blk_queue_bio()或者   多隊列 blk_queue_make_request() __elv_add_request()

為什么引入多隊列:多隊列相對與單隊列來說,每個 cpu 上都有一個軟隊列 (使用 blk_mq_ctx 結構表示) 避免插入 request 的時候使用 spinlock 鎖,而且如今的高速存儲設備,比如支持 nvme 的 ssd(小弟剛買了一塊,速度確實快), 訪問延遲非常小,而且本身硬件就支持多隊列,(引入的多隊列使用每個硬件隊列 hctx- delayed_work 替換了 request_queue- delay_work)   以前的單隊列架構已經不能榨干它的性能,而且成為了它的累贅, 單隊列在插入 request 和泄流到塊設備驅動時,一直有 request_queue 上的全局 spinlock 鎖,搞得人們都想直接 bypass 塊層的沖動。

單隊列插入 request 時會使用 request_queue 上的全局 spinlock 鎖

blk_queue_bio() { ... spin_lock_irq(q- queue_lock); elv_merge() spin_lock_irq(q- queue_lock); ... }

單隊列泄流到塊設備驅動時也是使用 request_queue 上的全局 spinlock 鎖:

struct request_queue *blk_alloc_queue_node() INIT_DELAYED_WORK(q- delay_work, blk_delay_work); blk_delay_work() __blk_run_queue() q- request_fn(q);

__blk_run_queue()函數(shù)必須在隊列鎖中,也就是 spin_lock_irq(q- queue_lock);

281 * __blk_run_queue - run a single device queue 282 * @q: The queue to run 283 * 284 * Description: 285 * See @blk_run_queue. This variant must be called with the queue lock 286 * held and interrupts disabled. 287 */ 288 void __blk_run_queue(struct request_queue *q) 289 { 290 if (unlikely(blk_queue_stopped(q))) 291 return; 292 293 __blk_run_queue_uncond(q); 294 }

多隊列插入 request 時沒有使用 spinlock 鎖:

blk_mq_insert_requests() __blk_mq_insert_request() struct blk_mq_ctx *ctx = rq- mq_ctx; (每 cpu 上的 blk_mq_ctx) list_add_tail(rq- queuelist,  ctx- rq_list)

多隊列泄流到塊設備驅動也沒有使用 spinlock 鎖:

static int blk_mq_init_hw_queues() INIT_DELAYED_WORK( hctx- delayed_work, blk_mq_work_fn); 708 static void blk_mq_work_fn(struct work_struct *work) 709 { 710 struct blk_mq_hw_ctx *hctx; 711 712 hctx = container_of(work, struct blk_mq_hw_ctx, delayed_work.work); 713 __blk_mq_run_hw_queue(hctx); 714 } __blk_mq_run_hw_queue()  沒有 spinlock 鎖  q- mq_ops- queue_rq(hctx, rq);  執(zhí)行多隊列上的 - queue_rq()回調函數(shù)

從下圖可以看出系統(tǒng)使用多隊列之后的性能提升:

(我自己沒測試過性能,憑客觀想象應該與下列圖相符:) )

到此,相信大家對“Linux 塊層多隊列中如何引入內核”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-08-17發(fā)表,共計2324字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發(fā)布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 河北区| 资溪县| 南溪县| 邯郸县| 沾益县| 农安县| 秦皇岛市| 永靖县| 荥阳市| 民丰县| 阿克陶县| 栖霞市| 广丰县| 永年县| 抚顺县| 临湘市| 滦南县| 文水县| 鲜城| 乐昌市| 武义县| 盐边县| 闸北区| 南汇区| 易门县| 察隅县| 乌兰县| 南川市| 上蔡县| 土默特右旗| 镇宁| 沧州市| 龙口市| 托克托县| 南充市| 武邑县| 赞皇县| 高邑县| 监利县| 上蔡县| 丹寨县|