Linux性能优化:磁盘I/O优化思路

应用程序优化

  1. 追加写代替随机写
  2. 借助缓存I/O
  3. 在应用程序内部构建缓存,或者外部比如redis
    C标准提供的fopen、fread等函数,都会利用标准库的缓存,减少磁盘的操作。系统的open、read等系统调用,则只能利用操作系统提供的页缓存和缓冲区等,没有库函数的缓存可以用。
  4. 需要频繁读写同一块磁盘是,用mmap代替read/write,减少内存的拷贝次数
  5. 需要同步写的场景,尽量将写合并:使用fsync代替O_SYNC
  6. 多个应用程序共享相同磁盘时,使用cgrups的I/O子系统,来限制进程/进程组的IOPS和吞吐量
  7. 使用CFS调度器时,可以使用ionice来调整进程的I/O调度优先级

文件系统优化

  1. 优化文件系统的配置选项
    文件系统的特性、日志模式、挂载选项
  2. 优化文件系统的缓存
    pdflush脏页的刷新频率,回收目录项缓存和节点缓存的倾向

磁盘优化

  1. 针对磁盘和应用程序I/O模式的特征,选择最适合的I/O调度算法。比如SSD和虚拟机中的磁盘通常使用noop调度算法,而数据库采用deadline
  2. 对应用程序的数据进行磁盘级别的隔离,比如日志、数据库等分配单独的磁盘
  3. 顺序读比较多的场景增大磁盘的预读
  4. 优化内核块设备I/O的选项,比如调整磁盘队列的长度
comments powered by Disqus