系统优化-IO-优化套路

基准测试

用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 延迟增大)。