基准测试
用fio+blktrace
fio用于基准测试,blktrace可以进行io的录制通过fio的回放功能得到系统真实场景的io情况
优化套路
代码优化
- 追加写替代随机写
- 采用有缓存的io
- 采用标准库缓存或者外部缓存介绍io
- 如果对大文件写考虑用mmap(zero copy)
- 用fsync替代O_SYNC
- 做好进程隔离防止某个进程占有所有的io资源,比如采用cgroup对进程的io做限制
- 如果io的调度采用CFQ,考虑对ionice进行设置
- ionice 支持三个优先级类:Idle、Best-effort 和 Realtime。其中, Best-effort 和 Realtime 还分别支持 0-7 的级别,数值越小,则表示优先级别越高。
文件系统优化
- 采用适合的文件系统
- 对文件系统参数调优
- 优化文件系统的缓存
- 可以优化 pdflush 脏页的刷新频率(比如设置 dirty_expire_centisecs 和 dirty_writeback_centisecs)以及脏页的限额(比如调整 dirty_background_ratio 和 dirty_ratio 等)。
磁盘优化
- 硬件优化用SDD取代HDD等
- 采用RAID方案提高读写能力
- 采用适合的线程调度算法
- 如果磁盘读写负担较大,可以单独配置磁盘
- 对顺序读取增加磁盘的预读能力
- 调整内核选项 /sys/block/sdb/queue/read_ahead_kb,默认大小是 128 KB,单位为 KB。
- 使用 blockdev 工具设置,比如 blockdev –setra 8192 /dev/sdb,注意这里的单位是 512B(0.5KB),所以它的数值总是 read_ahead_kb 的两倍。
- 通过调整请求队列增加磁盘吞吐
- 可以调整磁盘队列的长度 /sys/block/sdb/queue/nr_requests,适当增大队列长度,可以提升磁盘的吞吐量(当然也会导致 I/O 延迟增大)。