针对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.均中断 (责任编辑:IT) |