调优之IO调度




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







 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值