UNIT 6 Compensating for Physical Disk Characteristics
学习目标:
A. 了解影响磁盘IO的物理因素
B. 应用队列技术调整IO调度
6.1 Physical factors affect disk IO 影响磁盘IO的物理因素
A. 存储密度:
区域恒定角速度(ZCAV)原理:现代硬盘都采用的是等密度存储,因此每个磁 道上的扇区数外圈要比内圈多,从内圈到外圈分为若干区域,每个区域内角速度保持一定,也就是ZCAV方式
a. 外圈磁道比内圈有更多的线性存储区域
b.在转速一定的情况下,每秒钟读取的数据外圈磁道要比内圈磁道多。
c. 外圈的分区号比内圈要低(因为分区是从外圈开始的,0磁道0扇区)
B.总线连接
a. Linux 内核的处理带宽为10Gib/s
C. 电子-机械定位
a. 转速延时
b. 寻道时间
PS:
硬盘结构
A. 磁盘物理组成: 通常由一个或多个圆形盘片组成,每个盘片都是两面存储的,通过机械臂上的磁头进行数据读写操作,主要由盘片、机械手臂、磁头与主轴马达所组成。
B. 磁盘逻辑组成:磁头(header)柱面(cylinder)磁道(track)扇区(sector)
磁头 : 磁头固定在可移动的机械臂上,用于读写数据。现代硬盘都是双面可读写,因此磁头数量等于盘片数的 2 倍。磁头数最大值为 255 (8 个二进制位)。
磁道 : 每个盘面都有 n 个同心圆组成,每个同心圆称之为一个磁道。由外向内分为 0 磁道到 n 磁道。
柱面 : n 个盘面的相同磁道 (位置相同) 共同组成一个柱面。柱面数最大为 1023 (10 个二进制位)。
扇区 : 从磁盘中心向外画直线,可以将磁道划分为若干个弧段。每个磁道上一个弧段被称之为一个扇区。扇区是硬盘的最小组成单元,通常是 512 字节。磁道上的扇区数最大为 63 (6 个二进制位)。
硬盘的存储容量公式:
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
3D 寻址参数:
×× 磁道(柱面),×× 磁头,×× 扇区
Track=sector*n
Linux 的分区是按柱面来划分的。
引导区信息:
硬盘的第一个扇区被称之为 Boot Sector。由 MBR (MasterBoot Record)、DPT (Disk Partition Table) 和 Boot Record ID 三部分组成。
•MBR 又称作主引导记录,占用 Boot Sector 的前 446 个字节(0 ~ 0x1BD)。存放系统主引导程序,负责从活动分区中装载并运行系统引导程序。
•DPT 即主分区表,占用 64 个字节 (0x1BE ~ 0x1FD),记录了磁盘的基本分区信息。主分区表分为四个分区项,每项 16 字节,分别记录了每个主分区的信息 (因此最多可以有 4 个主分区)。通常分完三个主分区后,剩下的磁盘空间全部分给扩展分区,然后在扩展分区里再分区(IDE:5~59分区,SATA:5~15分区);如果不这样的话,分完4个分区后剩下的空间不能再使用。
•Boot Record ID 即引导区标记,占用两个字节 (0x1FE ~ 0x1FF)。对于合法引导区,它等于 0xAA55,这是判别引导区是否合法的标志。
6.2 Disk storage density 磁盘的存储密度
A 使用bonnie++测试磁盘及文件系统的性能
yum –y install bonnie++
rpm –qd bonnie++
useradd zcav; usermod –aG disk zcav
for drive in sdb sdc sdd sde;
do
su –c “zcav –c1 /dev/$drive” zcav >> /tmp/zcavdata.$drive
done
Gnuplot 指令:
set term png size 600,300 notransparent 1w 2
set output ‘/tmp/rh442_zcav.png’
set xlabel ‘Block’;set xrange [0:]
set ylabel ‘Disk thronghput (KiB/s)’; set yrange [0:]
set border 3; set xtics nomirror; set ytics nomirror
set label ‘ZCAV steppings’ at 5000,50000
plot ‘/tmp/zcav.sdd’ u 1:2 t ’80 GB HDD’ with lines , \
‘/tmp/zcav.sdb’ u 1:2 t ’16 GiB SSD’ with lines , \
‘/tmp/zcav.sde’ u 1:2 t ’64 GB USB flash’ with lines , \
‘/tmp/zcav.sdc’ u 1:2 t ‘8 GiB SD card’ with lines
B. bonnie++工具介绍
a、简介
Bonnie++是一个硬盘和文件系统的基准性能测试工具,它通过一系列的简单测试来生成硬盘和文件系统的性能参数。其主程序提供两种风格的测试:针对单个文件的数据库风格的访问测试和针对大量小文件的创建和删除来模拟诸如Squid,INN,或者Maildir格式的Email这一类风格的访问测试。在选择RAID设定方法、文件系统的创建参数和NFS访问方式时,此工具可以提供有用的帮助信息。
Bonnie++对三个方面做基准测试:数据读、写速度,每秒可以完成的磁盘寻道次数和每秒可以完成的文件元数据操作次数。
元数据的性能表现跟运行着squid或为Maildir格式邮件服务器保存邮件时有很大关系,因为它们都是元数据操作密集型的应用。
Bonnie++目前的最新版本是1.03e,项目地址:。
b、安装
安装完成以后会在/usr/local/sbin/目录中生成两个可执行文件,bonnie++(主测试程序)和zcav(裸盘吞吐量测试程序);同时也会在/usr/local/bin目录下生成两个可执行文件,用于生成可读性强的测试报告,它们是bon_csv2html和bon_csv2txt。
c.、bonnie++的常用选项说明
-d DIR 用于测试的目录,即测试目标位置;
-s SIZE(MiB) 用于测试IO性能的文件的大小;如果指定的文件大小大于1G,bonnie++会将其分为多个大小为1G的文件;
-m 测试目标主机的主机名,仅用于显示测试结果时的主机标识;
-r 指定测试程度使用的内存大小;bonnie++一般要求指定的测试文件的大小至少为物理内存的2倍;如果测试时指定的文件过小,则可以通过指定所使用的物理内存大小来滞此条件;
-x 用于指定同时运行的测试数目;
-u 测试程序运行时关联的uid,如果以root用户的身份做测试,则此项必须明确指定。-g选项则用于指定gid;
-q 静默模式;
-f 快速模式,此种模式不进行IO测试;
-D 直接IO测试,用于测试大规模IO请求时的性能;
使用示例:
# bonnie++ -d /data -u root -s 4096 -m mail
说明:
1、测试结果中显示形如的“++++”的符号表示此项测试时间小于500ms,所以被视作不准确结果不予显示;
2、每项测试都会显示两个结果,其中的%CP表示此项测试的CPU占用率;
d. 、zcav使用简介
ZCAV是“Zoned Constant Angular Velocity”的简写,用于测试裸盘的吞吐率。常用选项如下:
-b 读/写操作的数据块的大小,单位为MB:默认为100M;
-c 读/写整个磁盘的次数;
-f 读入数据时所用的文件;
-u 测试时使用的uid;-g 为使用的gid;
-w 通过向磁盘填充“0”的方式测试,会破坏原有文件。
使用示例:
# zcav -b 2048 /dev/sda3
6.3 Choosing a peripheral interconnect 选择外部连接
A. 资源和系统的瓶颈在于总线吗?
B. 常用总线接口
Bus Type Bus Width Clock speed Burst bandwidth Sustainable bandwith
总线类型 总线大小 时钟频率 带宽峰值 支撑带宽
PCI 32bits 33 MHz 133 MiB/s 115 MB/s
PCI 32bits 66 MHz 266 MiB/s 230 MB/s
PCI 64bits 33 MHz 266 MiB/s 230 MB/s
PCI 64bits 66 MHz 533 MiB/s 490 MB/s
PCI-X 64bits 133 MHz 1066 MiB/s 980 MB/s
PCIe x1 1 bits 2.5 GHz 250 MiB/s 200 MB/s
6.4 SCSI bus considerations 使用SCSI总线接口要注意的事项
A. 物理上要注意的因素
a. 在同一总线上使用不同速度的混合设备(宽型和窄型设备)时要特别小心,因为在总线上窄型终结发生的位置可能与宽型设备不同。
b. 主动终结VS被动终结
c. Differential signaling 差分信号: 用一个数值来表示两个物理量之间的差异
B. sg3_utils 工具包,查看SCSI接口相关信息及设置参数,相关命令:
for DRIVE in $(sginfo -r) ; do
sginfo –a $DRIVE;
done
6.5 Electro-mechanical positioning 电子机械定位
A. 突发传输率与实际吞吐量是没有关系的
B. 内部传输速率非常重要
a. 内部传输速率是磁盘每次读或写多少个比特
b.旋转速度
C. 通过队列技术减少平均寻道时间
a. 使用电梯算法重排序请求队列
b. 系统的元数据通常存放在buffer cache里面
c. 文件数据通常存放在page cache里面
d 大部份设备都有自己的内部缓存
e. 可以饶过内核缓存直接读写IO 设备(比如访问裸设备)
File=1 inode + N blocks
File = metadata + data
Data rate =(sectors_per_track * 512 * rpm)/60
Disk speed =((Average sectors_per_track * rpm *512)/60)/1000000
6.6 Block IO requests and cache effect
(略)
6.7 Tuning sequential read access 顺序读访问
A. 内核会自动按顺序的向前读写。
blockdev - getra /dev/sda 查看
blockdev –setra 512 /dev/sda 设置一次读写多少kb
a. 可以在/sys/block/sda/queue/read_ahead_kb查看
b. 可调整最大窗口大小
c. 读写窗口的初始值是可调值的一半
d. 设置可写入/etc/rc.local
B. 小结
a. 减少了寻道时间,但增加了每次读写的服务时间
b. 减少了要读写数据时通知磁盘控制器的操作次数
c. 不适合随机文件的读写。
应用:适用于大文件读写(Web Server)
6.8 Tuning the disk queue调整磁盘队列
A.调整队列长度
/sys/block/sda/queue/nr_requests
增加队列长度,可以提高磁盘吞吐量,但消耗内存。
B. 调度算法
/sys/block/sda/queue/scheduler
C. 加长队列…
a. 多个读请求合并一次写入
b. 允许更多有效的读请求合并但会增加延时。
内核默认的IO调度算法是cfq: 相关查看命令
Grep –I cfq /boot/config-*
调度算法相关帮助文档:/usr/share/doc/kernel-doc-*/Documentation/block/*
6.9 Tuning the deadline scheduler 最后期限调度
A. 调整目标:优休等待时间(W)
echo deadline > /sys/block/sda/queue/scheduler
B. 主要调整在/sys/block/sda/queue/iosched/
a. Max queue time 最大队列时间
参数 :
read_ expire: 每个IO读请求多少豪秒后过期
write_expire:每个IO写请求多少豪秒后过期
b.合并连续请求
参数:
front_merges:通常在请求队列的队尾合并IO请求,这个参数的值可以控制是否 在请求队列的队首合并IO请求,这样可以处理更多的请求,0代表禁止,1代表启用。
应用:保证响应速度,适合于小文件读写
6.10 Tuning the anticipatory scheduler 猜想调度
A. 目标:优化读数据的完成率
echo anticipatory > /sys/block/sda/queue/scheduler 默认值6秒,猜想下一个数据会不会在附近出现,避免磁头频繁来回移动。
B.主要调整在/sys/block/sda/queue/iosched/
a. 在执行下一个读/写请求时等待多长时间
参数:antic_expire
b. Max queue time (W)
read_expire
write_expire
批量读请求比批量写请求允许更长的时间
相关帮助文档:/usr/share/doc/kernel-doc-*/Documentation/block/as-iosched.txt
应用:适用于批量顺序读写,适用于大文件(如,web server)
6.10 Tuning the noop scheduler 不作为调度
A..目标:节省CPU时钟频率
echo noop > /sys/block/sda/queue/scheduler
a. 不需要调整设置
b. 使用CPU时钟频率开销昂贵。
c. 主机CPU时钟频率通常比SAN CPU时钟频率便宜
B. 有些磁盘控制器执行的是电梯算法
a. 标识命令队列
b. 在SCSI和一些SATA磁盘上有效
C. 对于iSCSI和GNBD来说排序非常有用。
6.11 Tuning the (default) cfq scheduler 公平调度算法(默认)
A.目标:为每个应用提供不同的IO服务
echo cfq > /sys/block/sda/queue/scheduler
a. 基于IO的优先级
b. 使用64位的内部队列
c. 使用轮循的方式填充内部队列
d. 从非空队列里调出请求
e. 派遣队列可以进行排序
B.主要调整在/sys/block/sda/queue/iosched/
a.每个内部队列最大请求数
queued
b.每次派发请求的数量。
Quantum
应用:适用于随机离散的读写。
6.12 Fine-tuning the cfq scheduler cfq 调度算法进阶调整
A. 基于优先级队列
a.类1(real-time)实时队列:最优先访问磁盘,调成这种实时队列可能会饿死其它 类
优先级0(最重要)~7(最不重要)
b.类2(best-effor)尽力而为:轮循访问,默认。
优先级0(最重要)~7(最不重要)
c.类3(idle)空闲:队列空闲时才处理 磁盘IO
Example:
ionice –p1
ionice –p1 –n7 –c2 进程号为1,轮循访问2,等级为7最不重要
ionice –p1
针对进程对IO进行调整:
-p pid 进程号
-n 优先级
-c 优先类别
6.12 Physical block devce interfaces 物理块设备接口类型
A. IDE: 133MB/s以上
B. SATA: 300MB/s
C. SCSI: 320 MB/s
D. USB: 480Mbps(60MB/s)
E. iSCSI+GigE: 1Gb/s(125MB/s)
F. FC: 4.25Gb/s(531 MB/s)