• 安排
    2019-06-17
    看了一点儿其它的资料,大概了解了一下,有以下几种情况:1、request_fn是在unplug泄流的时候调用(也就是队列里面的请求达到一定的数量) 2、或者是由定时器触发,也就是即使队列里面的请求很少,但是也不能无限期的不执行它们,所以在定时器超时后会调用request_fn 3、或者在添加request进行合并的时候,判断一下是哪种合并方式,如果是后向合并就会立即调用requset_fn。
    不知道这样理解的对不对?
    
     3
  • Geek_54edc1
    2019-06-24
    /sys/block/xvda/queue/scheduler 磁盘的调度算法,临时修改:echo noop > /sys/block/xvda/queue/scheduler,永久修改就需要修改内核参数,然后重启。
    iostat -d -x 中的avgqu-sz是平均I/O队列长度。

    作者回复: 赞

    
     1
  • Leon📷
    2019-06-22
    文件系统中的page_cache对应逻辑上的块的概念,将page_cache打包成bio递交给通用块设备层,通用块设备层将多个bio打包成一个请求request, 尽量把bio对应的sector临近的数据合并,提交给块设备调度层,块设备调度层就是把各个request当成段提交给设备驱动程序,因为设备驱动程序只识别段,也就是说通用块设备层捣腾的其实就是把bio对应的页框和在磁盘中对应的sector进行合并的过程,调度层只负责把合并的request放进队列,用调度算法下发给驱动程序处理,其实所有复杂的合并操作以及内存和磁盘扇区的对应关系都是通过块设备层做了,老师,可以这么理解吧

    作者回复: 是的

    
     1
  • 小美
    2019-06-19
    会不会断电丢失数据呢?

    作者回复: 会呀,flush就不会

    
     1
  • 安排
    2019-06-18
    make_request_fn被初始化成了blk_queue_bio函数。submit_bio会调用到generic_make_request,然后进一步调用到make_request_fn,也就是blk_queue_bio。在blk_queue_bio里面其实是先尝试将bio合并到当前进程的plug_list里面的request,如果可以合并,则合并后直接返回了,如果不能合并,则接着向磁盘设备的request_queue中合并,向request_queue中合并的时候一定会成功(因为即使不能合并也会新生成一个request)。而每个进程的plug_list里面的request也会在适当的时候就行泄流,泄流的时候会调用到磁盘设备的request_queue里面的电梯成员的elevator_add_req_fn,这个函数就是讲plug_list里面的request加入到request_queue里面的电梯队列里,进行更进一步的合并。
            设备驱动会调用request_queue的request_fn,平时写块设备驱动也就是申请一个request_queue,然后调用一些内核api初始化这个request_queue,并且实现自己的request_fn函数,request_fn会调用blk_peek_request从request_queue的queue_head成员取出request,并转化为更底层的指令来执行,如果发现queue_head为空,则会调用request_queue的elevator_dispatch_fn分发request。
    展开
    
     1
  • Leon📷
    2019-06-17
    那个队列,队头和队尾的合并都是为了所谓的顺序写,减少机械硬盘寻址消耗吧,能赶上就上同一辆车,赶不上自己叫一辆车等满了再走,但是也是有超时等待时间的,可以这么理解吧

    作者回复: 是的

    
     1
  • 安排
    2019-06-17
    往设备里面写的时候调用的是request_fn,这个函数是谁来调用的呢?触发这个调用的时机是什么呢?还是说请求一旦进入队列就会立即写入?

    作者回复: 会调用__blk_run_queue,里面调用request_fn

    
     1
  • Paul Shan
    2019-12-31
    请问老师,do_direct_IO 里面每一页(page)可能对应多个块(block),是不是现实中大多数情况页和块相等(4K),也就是每页也就循环一次。是不是从这里也可以看出,页的大小虽然可以配置,也必须是4K的整数倍,块的大小应该是不可配置的(永远4K)。
    
    
  • hello
    2019-09-26
    太爽了,听了三四遍这节课,以前一直担心io在内核内部会发生多次拷贝,听完发现并没有。下一次我一定要边读源码边听。
    
    
  • 游弋云端
    2019-09-01
    老师,是否可以认为直接 IO执行完成后,数据就是下盘的,还是不一定,还有驱动层以及磁盘缓存等因素。

    作者回复: 还是需要设备驱动层的

    
    
  • 眭东亮
    2019-07-10
    查看磁盘调度算法
    cat /sys/block/sda/queue/scheduler

    作者回复: 赞

    
    
  • 安排
    2019-06-19
    老师,希望在答疑篇能讲一讲request_fn取出请求之后的具体执行过程,具体的执行是不是和block_device有关,磁盘的最底层的操作是不是都在block_device中?

    作者回复: 取出来之后,基本就是面向设备的操作了。

    
    
  • 安排
    2019-06-18
    直接读写裸设备不会走文件系统,那还会走通用块层吗?

    作者回复: 不会的

    
    
  • 石维康
    2019-06-17
    bio_list_merge(&bio_list_on_stack[0], &lower);
    bio_list_merge(&bio_list_on_stack[0], &same);
    bio_list_merge(&bio_list_on_stack[0], &bio_list_on_stack[1]);

    请问这些加到bio_list_on_stack[0]上的bio是在什么时候被处理的?

    作者回复: 后面会加回去的

    
    
我们在线,来聊聊吧