0%

系统io优化

因为kafka集群的问题引发对系统io的相关优化,所以此优化针对kafka等大量io的应用场景。

IO调度器

参考: https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/performance_tuning_guide/ch06s04s02

  • cfq

centos6 默认是cfq(Completely Fair Queuing), 每个进程维护一个io队列,然后调度器对每个队列进行轮询,相对于每个进程是公平的。每个进程可以设置io读写优先级。

  • Deadline

对于读写操作有截止时间,对读和写操作用两条不同的队列管理,可以解决读取饥饿的现象。因为操作系统对读请求是同步处理的,写入请求可以异步处理。操作系统可以数据写到内存,然后对IO队列中的请求做合并,提高IO的吞吐量。通过设置read_expire < write_expire时间,避免读取操作处于饥饿调度的状态。对于数据库存储应用,Deadline是最佳的IO Scheduler,甚至很多PCIE卡作为设备内置默认参数。

  • NOOP

是建立在FIFO调度模型之上的,并合相邻IO请求。Noop容易出现读取操作饥饿现象,使用NOOP调度,需要磁盘有足够的IO能力。对于SSD基于闪存技术存储介质和SAN存储,NOOP也是首选的调度器。

脏页相关配置

系统数据写入磁盘可以异步进行,这样效率可能会更高。对于IO比较大的机器,可以把脏页大小的阈值调到,更多的使用系统内存来优化磁盘写入速度(所谓优化是尽量让io更多顺序的进行,同一时间点只读或者只写,因为磁盘顺序读写的速度很快).

  • dirty_ratio 系统总内存的百分比,太小导致系统强制脏页写回到磁盘,这个会阻塞系统接受写入请求。
  • dirty_background_ratio 文件系统的写入缓冲区的大小,达到这个百分比时,pdflush进程开始启动,把数据写回到磁盘,但是不影响正常的读写请求。

但是调大脏页率有会带来数据丢失的危险,要有所取舍。

所以我们也可以继续调整下面两个参数

  • dirty_writeback_centisecs,控制 pdflush/flush/kdmflush等进程的唤醒时间。默认30s

  • dirty_expire_centisecs,控制dirty page刷盘时间点。默认5s

减小这两个参数可以使脏页尽快落盘,避免数据丢失,也可解决 io spike 现象。同时io_await也会下降。

文件系统

做了lvm的机器io性能会下降,所以用来频繁io的机器, 最好不要用lvm。

一般会选用xfs,因为Ext4最大只支持16T分区,xfs可以到100T+,顺序读写性能也更好一点,更适合操作大文件。