成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Linux塊層多隊(duì)列中如何引入內(nèi)核

本篇內(nèi)容主要講解“Linux塊層多隊(duì)列中如何引入內(nèi)核”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Linux塊層多隊(duì)列中如何引入內(nèi)核”吧!

在麒麟等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)整合營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),麒麟網(wǎng)站建設(shè)費(fèi)用合理。

首先過目一下多隊(duì)列架構(gòu):

Linux塊層多隊(duì)列中如何引入內(nèi)核

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

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

mapping->a_ops->readpages() 會(huì)一直調(diào)用q->make_request_fn()

generic_make_request()     q->make_request_fn() 調(diào)用blk_queue_bio()或者     多隊(duì)列blk_queue_make_request()       __elv_add_request()

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

單隊(duì)列插入request時(shí)會(huì)使用request_queue上的全局spinlock鎖

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

單隊(duì)列泄流到塊設(shè)備驅(qū)動(dòng)時(shí)也是使用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ù)必須在隊(duì)列鎖中,也就是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 }

多隊(duì)列插入request時(shí)沒有使用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)

多隊(duì)列泄流到塊設(shè)備驅(qū)動(dòng)也沒有使用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í)行多隊(duì)列上的->queue_rq()回調(diào)函數(shù)

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

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

Linux塊層多隊(duì)列中如何引入內(nèi)核

到此,相信大家對“Linux塊層多隊(duì)列中如何引入內(nèi)核”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁名稱:Linux塊層多隊(duì)列中如何引入內(nèi)核
分享網(wǎng)址:http://jinyejixie.com/article26/ghopcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、外貿(mào)建站服務(wù)器托管、企業(yè)建站企業(yè)網(wǎng)站制作、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
鄂尔多斯市| 儋州市| 城市| 内江市| 南郑县| 临城县| 公安县| 崇义县| 铜鼓县| 连江县| 治县。| 淳安县| 昌江| 黔东| 原阳县| 沁水县| 彩票| 亳州市| 嘉峪关市| 普格县| 乌拉特中旗| 墨江| 永平县| 淮南市| 当阳市| 宽城| 固阳县| 民县| 简阳市| 莫力| 卢龙县| 永安市| 江都市| 禹州市| 宣恩县| 靖安县| 泰和县| 磐安县| 保定市| 巧家县| 寿宁县|