原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://alansky.blog.51cto.com/634963/654451
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,项目地址:http://www.coker.com.au/bonnie++/。

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)

RHCA学习笔记:RH442-Unit6 磁盘性能调整的更多相关文章

  1. SignalR学习笔记(四) 性能优化

    限制消息发送次数 这种方式在学习笔记(二)-  高并发应用中介绍过,在客户端和服务器端使用定时器来减少消息发送的次数 减少消息数据的大小 服务器端,可以使用JsonIgnore, 来忽略不需要序列化的 ...

  2. RHCA学习笔记:RH442-Unit8进程与调度

      UNIT 8  Processes and the Scheduler 进程与调度 学习目标 A. CPU cache 与Service time之间的关系 B. 分析应用程序使用CPU cach ...

  3. RHCA学习笔记:RH442-Unit9内核定时与进程延时

      Unit 9 Kernel Timing and Process Latency 内核定时与进程延时 学习目标: A.了解CPU 是怎样追踪时间的 B.调整CPU的访问次数 C.调整调度延时 D. ...

  4. Linux学习笔记之Linux磁盘及文件系统管理笔记

    Linux磁盘及文件系统管理 CPU,memory(RAM),I/O i/o: disks,ehtercard disks:持久存储数据 接口类型: IDE(ata): 并口,133MB/s;并行总线 ...

  5. RHCA学习笔记:RH442-Unit5 队列原理

    NIT 5 Queuing Theory 队列原理 目标: 1.明白性能调优的关键术语       2. 应用队列技术解决性能问题       3.明白性能调优的复杂性   5.1    Introd ...

  6. MySQL学习笔记:select语句性能优化建议

    关于SQL中select性能优化有以下建议,仅当笔记记录. 1.检查索引:where.join部分字段都该加上索引 2.限制工作数据集的大小:利用where字句过滤 3.只选择需要的字段:减少IO开销 ...

  7. python学习笔记(threading接口性能压力测试)

    又是新的一周 延续上周的进度 关于多进程的学习 今天实践下 初步设计的接口性能压力测试代码如下: #!/usr/bin/env python # -*- coding: utf_8 -*- impor ...

  8. js-JavaScript高级程序设计学习笔记21 改善JavaScript性能的方法

    第24章 最佳实践 1.性能 1.避免全局查找 将在一个函数中会用到多次的全局对象保存在局部变量.比如多次使用document.getElement...,可以首先var doc=document,把 ...

  9. MySQL学习笔记(二)性能优化的笔记(转)

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

随机推荐

  1. 【Pyhton Network】使用poll()或select()实现非阻塞传输

    通常情况下,socket上的I/O会阻塞.即除非操作结束,否则程序不会照常进行.而以下集中情况需要在非阻塞模式下进行:1. 网络接口在等待数据时是活动的,可以做出相应:2. 在不使用线程或进程的情况下 ...

  2. bzoj1875

    我们知道,邻接矩阵自乘t次就是经过t条边的路径数但这道题显然不能这样,因为不能走回头路于是我们可以构造边的邻接矩阵矩乘即可 ; type way=record po,fr:longint; end; ...

  3. WordPress Backdoor未授权访问漏洞和信息泄露漏洞

    漏洞名称: WordPress Backdoor未授权访问漏洞和信息泄露漏洞 CNNVD编号: CNNVD-201312-497 发布时间: 2013-12-27 更新时间: 2013-12-27 危 ...

  4. $destroy

    ng-view 路由切换会触发 $destroy

  5. 设置将 Microsoft Azure 的网络基础结构以支持设置为灾难恢复站点

    Prateek Sharma 云 + Enterprise 高级项目经理 Azure SiteRecovery (ASR)可以将Microsoft Azure用作您的虚拟机的灾难恢复站点. 当管理 ...

  6. 用PowerShell批量部署wsp包

    转:http://www.xuebuyuan.com/168337.html 提供wsp部署的参数: $wsppath:wsp文件所在的路径,如"c:\" $wspnames:路径 ...

  7. http://www.cnblogs.com/eye-like/p/4121219.html

    c# 操作Word总结 在医疗管理系统中为保存患者的体检和治疗记录,方便以后的医生或其他人查看.当把数据保存到数据库中,需要新建很多的字段,而且操作很繁琐,于是想到网页的信息创建到一个word文本中, ...

  8. 面试准备--Spring(AOP)

    AOP:面向切面编程,在执行某个指令时,需要添加某个预编译的指令. 下面这个例子是来自网上的: 1.OOP回顾 在介绍AOP之前先来回顾一下大家都比较熟悉的OOP(Object Oriented Pr ...

  9. 用Eclipse和GDB构建ARM交叉编译和在线调试环境

    我们在 Linux 主机中搭建我们的开发环境,使用 Ubuntu 10.04 LTS 为例. 搭建应用开发环境   安装 JRE Eclipse 依赖于Java 环境,所以必须先安装 JRE 或 JD ...

  10. C#调用C++编写的DLL函数, 以及各种类型的参数传递 z

    1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int__declspec(dllexport) test(consti ...