针对linux IO性能的调优可以从以下几个方面考虑:
1.块设备的预读粒度,根据读、写操作的粒度来确定此数值的大小
2.块设备的调度算法,主要有cfq、deadline、Anticipatory、noop四种;
其中:
noop不对请求做出特定的排序,只做IO请求的聚合,适合ssd、ramdisk等不需要磁头寻址的设备
cfq(complete fair queueing),根据磁盘扇区号排序,减少磁盘寻道时间,实现了IO聚合,它的特点是对所有请求进程保证完全的公平,也就是在一个特定的时间内,保证每个进程的请求数量一样多
deadline根据硬盘扇区号进行读写的排序,并为请求设置最后期限,防止这些请求在一段时间内得不到调度
anticipatory识别请求的进程号,能够利用请求的局部性特点,适合顺序读写场景
总结:noop应用在ssd设备上;cfq、deadline应用在零散io请求,比如数据库;anticipatory应用在顺序io读写的场景
3.利用posix_fadvise对应用程序的读写进行优化,主要用到willneed方式将文件内容读到page cache,dontneed将文件的page cache清空,sequntial将文件的预取窗口放大2倍
4.使用taskset将进程与cpu核绑定
5.利用iostat、sar,来分析从硬盘上读取的数据与网卡发送的数据流量是否一致
6.对小写、小读比如mysql数据库应用,使用ssd来存储
7.尽量加大物理内存,并且禁用swap分区
8.应用程序尽量避免线程泛滥,尽量采用线程池化或者单线程多任务
9.保证应用正确的前提下,减小锁的粒度
10.采用TOE、RDMA网卡
11.使用零拷贝sendfile发送socket文件
12.使用异步、非阻塞方式发送文件
13.使用AIO
14.对RAID的chunk进行调优、文件系统的block参数进行调优,针对读取粒度选择合适的chunk和block参数
15.均中断