07 Understand IO Scheduling理解IO调度
==================================================================================
IO优化方向:
1.调度策略
2.文件系统
IO是调优的主要对象: 最慢的设备存储,也是最容易成为整个系统的性能瓶颈
a. 提高I/O的能力
b. 尽量减少I/O (Cache 应用程序尽可能使用缓存)
Linux通过多种手段给存储(硬盘)提速:
1. 工作方式(机械/SSD)
2. 接口类型(SATAIII 6Gbps/s 6x1024/8=768M,SAS)
3. 连接方式 内部 外部 SATA线 光纤线
4. RAID0/1/5/6/10
5. Caching (硬盘本身的缓存,内存作为数据缓存)
程序从内存中读,写到内存 读优先 写延后
读能够被缓存,写可以延后写deferred
6. Cgroup资源分配
7. I/O Scheduling
尽量把request合并成少量的I/O请求,从而可以减少I/O次数。
I/O调度图:
所有请求会在队列 IO调度算法会合并操作 减少IO 让磁盘的驱动程序控制读写
DEMO: 直接IO direct I/O 不缓存 不支持/dev/zero 系统调用 glibc调用
# dd iflag=direct oflag=direct if=/dev/sda of=/file1 bs=1M count=1000
# free -m
sync
# echo 3 > /proc/sys/vm/drop_caches 清空缓存
==================================================================================
I/O调度算法:
cfq 完全公平队列,比较适合于各种工作负载,绝大多数情况,具有普遍性
deadline 最后期限,预期的时间必须完成。 当发出一个I/O请求,一定会在指定时间如5ms之内完成 保证及时响应
作为虚拟机的物理机(virtualization host),使用deadline可以让所有的虚拟机得到它们想要的东西
noop FIFO 先进先出
响应很快,CPU不用费时,低开销,也就是不用调度
适合于SSD磁盘,不用合并适合于虚拟机virtualization guests,因为写数据最终是虚拟机管理器(上层)来写,所以虚拟机不需要调度 使用半虚拟化驱动可以使用
查询和设置电梯算法:
每个磁盘可以独立的设置自己的电梯算法
# cat /sys/block/sda/queue/scheduler 查看当前磁盘调度算法
# echo deadline > /sys/block/sda/queue/scheduler 制定调度算法
适用于所有调度算法的参数:
[root@uplook ~]# ls /sys/block/sda/queue/
add_random hw_sector_size max_hw_sectors_kb minimum_io_size physical_block_size scheduler
discard_granularity iosched max_sectors_kb nomerges read_ahead_kb unpriv_sgio
discard_max_bytes iostats max_segments nr_requests rotational
discard_zeroes_data logical_block_size max_segment_size optimal_io_size rq_affinity
修改内核参数后 iocsched调度算法参数不一样
通用参数:
nr_requests 队列长度 满足队列长度后一起处理
# cat /sys/block/sda/queue/nr_requests
128 队列的长度,即128个请求
read_ahead_kb 预读技术
# cat /sys/block/sda/queue/read_ahead_kb
128 单位是kb,如果kernel发现当前是顺序读(顺序读取的扇区),会预先读取128kb。如果kernel发现是随机读,会逐渐将其值调至0,关闭预读机制
关于磁盘的参数 不能写在sysctl里面
/etc/sysctl.conf 修改/proc/sys的参数
/sys/block开机自启动
开机有效:
[root@uplook ~]# cat /etc/rc.local
echo deadline > /sys/block/sda/queue/scheduler
echo 256 > /sys/block/sda/queue/nr_requests
针对不同的电梯算法可调的参数:
Tuning the deadline Scheduler
# echo deadline > /sys/block/sda/queue/scheduler
# cd /sys/block/sda/queue/iosched/
# cat read_expire
500 最后期限,保障,读操作500毫秒后响应
# cat write_expire
5000 最后期限,保障,写操作5秒之后内响应 可以缓冲会再写
Tuning the cfq Scheduler 重点
# echo cfq > /sys/block/sda/queue/scheduler
# cd /sys/block/sda/queue/iosched/
基于分类,优先级队列:
Class1(RT real-time):实时
子优级0-7,数字越小0(最高),越大7(最低)
Class2(BE best-effort): 最佳效果,都能访问 默认
子优级0-7,数字越小0(最高),越大7(最低)
Class3(idle): 空闲
在cfq调度算法下,ionice 用于设置或更改分类
# ionice -p PID 查看进程IO类别
# ionice -c3 -p PID idle
# ionice -c1 -n0 dd if=/dev/sda of=/dev/null
c1 RT 优先级
c2 BE 优先级
c3 idle 无高低
c类别 n优先级
LAB1:
先准备三个大文件 谁先读取完
# dd if=/dev/zero of=/bigfile1 bs=1M count=1000
# dd if=/dev/zero of=/bigfile2 bs=1M count=1000
# dd if=/dev/zero of=/bigfile3 bs=1M count=1000
# echo 3 > /proc/sys/vm/drop_caches
终端一: root 监控当前谁在使用磁盘
# iotop
be best-effort be
real-time rt
idle idle
终端二: 普通用户 user1
$ time ionice -c3 dd if=/bigfile3 of=/dev/null //C3没有优先级
终端三: 普通用户 user2
$ time ionice -c2 dd if=/bigfile2 of=/dev/null //c2默认,可以不写,默认为c2中的4
终端四: root 只有管理员才可以使用c1
# time ionice -c1 dd if=/bigfile1 of=/dev/null //默认为4,c1强势
LAB2:
终端二: 普通用户 user1
$ time ionice -c2 -n0 dd if=/bigfile3 of=/dev/null
终端三: 普通用户 user2
$ time ionice -c2 -n7 dd if=/bigfile2 of=/dev/null
LAB3:
ionice 降低updatedb的IO //不希其望占太多的磁盘开销
LAB4:
dd if=/dev/zero of=/test1.txt
ps aux |grep dd
ionice -c3 -p PID