cfq調度器


cfq調度是block層最復雜的一個調度器,主要思想是是說每個進程平均享用IO帶寬,實現方法是在時間上對進程進行划分,以此達到平均占用IO的目的。帶着幾個問題去看cfq

1)現在進程來了之后,是插入到某一個隊列中去,或者說是進程的IO插入到其中;

2)上面提到的隊列是啥子咧?是一個接收BIO的隊列?還是一個進程的隊列,io_context是啥子?

 【電梯中函數的執行的順序是啥樣子的?很重要!】

elv_set_request

 

#0  elv_set_request (q=0xffff88007c21aa08, rq=0xffff88007c127590, bio=0xffff88007c892000, gfp_mask=37748736) at block/elevator.c:718
#1  0xffffffff81353f00 in __get_request (gfp_mask=<optimized out>, bio=<optimized out>, op_flags=<optimized out>, op=<optimized out>, 
    rl=<optimized out>) at block/blk-core.c:1172
#2  get_request (q=<optimized out>, op=<optimized out>, op_flags=<optimized out>, bio=0xffff88007c892000, gfp_mask=<optimized out>)
    at block/blk-core.c:1265
#3  0xffffffff813564ae in blk_queue_bio (q=0xffff88007c21aa08, bio=0xffff88007c892000) at block/blk-core.c:1762
#4  0xffffffff81354900 in generic_make_request (bio=0xffff88007c892000) at block/blk-core.c:2062
#5  0xffffffff81354a1e in submit_bio (bio=0xffff88007c21aa08) at block/blk-core.c:2122
#6  0xffffffff811b35e4 in submit_bh_wbc (op=<optimized out>, op_flags=2081584528, bh=0xffff88007c892000, bio_flags=37748736, 
    wbc=<optimized out>) at fs/buffer.c:3101
#7  0xffffffff811b3770 in __block_write_full_page (inode=<optimized out>, page=0xffffea00000821c0, get_block=<optimized out>, 
    wbc=<optimized out>, handler=<optimized out>) at fs/buffer.c:1789
#8  0xffffffff811b3c08 in block_write_full_page (page=0xffffea00000821c0, get_block=0xffffffff811b5c90 <blkdev_get_block>, 
    wbc=<optimized out>) at fs/buffer.c:2977
#9  0xffffffff811b66d8 in blkdev_writepage (page=<optimized out>, wbc=<optimized out>) at fs/block_dev.c:313

   cfq中有優先級樹,所有的優先級

  對於一個磁盤所有的IO,都是放在一棵優先級數里邊管理的(即便這些IO來自於不同的進程)

各種tree之間是什么關系,首先,一個進程在每個設備上都有自己的cfq_queue,這個queue里面裝這這個進程所有的IO,那么這些IO是怎么整的呢?

每個設備都有自己的cfq_data,在這個結構中,是如何管理進程的這些東西咧

 

request在哪里管理呢?request在cfq_queue中管理(elv_rb_add 函數)

cfq_resort_rr_list

上面這個函數中把cfqq加入到cfqd中去,分別加入到:service_tree_add 和 cfq_prio_tree_add,這倆是干嘛的呀

到底要插入到哪一棵service tree啊,

所以我們知道了一件事情,所有的cgroup都是通過key=vdisktime插入到該disk全局紅黑樹中;

每個cgroup中有一顆服務樹二維數組[2][3],這棵樹里面,每一進程cfq-queue,就插入到這棵服務樹里的一棵,其中鍵值好像是服務的起始時間;

另外cfqd中還維護着一條對於所有IO的優先級樹。。。。

現在,一個進程的IO就放在這里了,在各種樹里管理着

大致清楚了選擇進程的過程,首先會選擇cgroup組,然后會從cgroup組中按照優先級選擇一個IO下發。

算是比較清楚了吧,現在,oh,my gosh,這個周不是人過的

明天再想一個問題,一個cgroup組里的進程是怎么共享帶寬的咧?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM