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?