io_fs_04
一个块IO的一生:从page cache到bio到request
task_struct->file->inode->i_mapping->address_space 文件系统 每个进程plug队列->IO调度电梯elevator内部队列->dispatch队列
app --------------------------------------------> page cache -----> bio ---------------------------------> request --> 块设备驱动但是 不是所有进程读/写硬盘都经过page cache,如下:
常规app进行读写硬盘时,需要经过page cache缓冲,某一时刻再读/写硬盘
O_SYNC app进行读写硬盘时,需要经过page cache缓冲,然后立刻读/写硬盘
O_DIRECT app进行读写硬盘时,不需要经过page cache,直接读/写硬盘
IO调度算法
IO调度算法有三种:
noop : 最简单的调度器,把邻近bio进行合并处理
deadline : 保证读优先级的前提下,写不会饿死
cfq : 考虑进程
查询目前是用哪一种IO调度算法?
$ cat /sys/block/sda/queue/scheduler
noop deadline [cfq]设置IO调度算法与IO nice值
cgroup与IO
cgroup v1的weight throttle
cgroup v2的writeback throttle
在cgroup v1,blkio cgroup write 只能用于DIRECT_IO的场景(writeback线程和write线程不是同一个),这使得write变成system wide,而不是group wide.
在cgroup v2,打通了 memory group 和 blkio group,能知道每个group的dirty情况
Last updated
Was this helpful?