【计组】输入输出设备--《深入浅出计算机组成原理》(十一)

一、CPU是如何控制 I/O 设备的

大部分的输入输出设备,都由两部分组成:接口(Interface)和实际的 I/O 设备(Actual I/O Device)。硬件设备通过接口连接到总线上,再通过总线和 CPU 通信。

接口本身是一块电路板,里面有三类寄存器,分别是状态寄存器(Status Register)命令寄存器(Command Register)以及数据寄存器(Data Register)。

无论是内置在主板上的接口,还是集成在设备上的接口,都有对应的控制电路。正是通过这个控制电路,CPU 才能通过向这个接口电路板传输信号,来控制实际的硬件。

CPU 和 I/O 设备的通信,一样是通过 CPU 支持的机器指令来执行的。

计算机会把 I/O 设备的各个寄存器,以及 I/O 设备内部的内存地址,都映射到主内存地址空间里来。主内存的地址空间里,会给不同的 I/O 设备预留一段一段的内存地址。CPU 想要和这些 I/O 设备通信的时候就往这些地址发送数据。这些地址信息是通过地址线来发送的,而对应的数据信息是通过数据线来发送的。

 I/O 设备会监控地址线,并且在 CPU 往自己地址发送数据的时候,把对应的数据线里面传输过来的数据,接入到对应的设备里面的寄存器和内存里面来。CPU 无论是向 I/O 设备发送命令、查询状态还是传输数据,都可以通过这样的方式。这种方式叫作内存映射IO(Memory-Mapped I/O,简称 MMIO)。

MMIO不是唯一一种 CPU 和设备通信的方式,还可以通过特定的指令,来支持端口映射 I/O(Port-Mapped I/O,简称 PMIO)或者也可以叫独立输入输出(Isolated I/O)。PMIO 的通信方式和 MMIO 差不多,核心的区别在于,PMIO 里面访问的设备地址,不再是在内存地址空间里面,而是一个专门的端口(Port)。这个端口并不是指一个硬件上的插口,而是和 CPU 通信的一个抽象概念。

无论是 PMIO 还是 MMIO,CPU 都会传送一条二进制的数据,给到 I/O 设备的对应地址。设备自己本身的接口电路,再去解码这个数据。解码之后的数据会变成设备支持的一条指令,再通过控制电路去操作实际的硬件设备。对于 CPU 来说,它并不需要关心设备本身能够支持哪些操作。它要做的,只是在总线上传输一条条数据就好了。

二、理解 IO_WAIT:I/O 性能是怎么回事

(一)IO性能、顺序访问和随机访问

硬盘有两个常用的指标,一个是响应时间(Response Time),另一个是数据传输率(Data Transfer Rate)。

常用的硬盘有两种:一种是 HDD 硬盘,也就是机械硬盘,用的是 SATA 3.0 的接口。另一种是 SSD 硬盘,一般也被叫作固态硬盘,一部分用的是 SATA 3.0 的接口,另一部分用的是 PCI Express 的接口。

SATA 3.0 的接口,带宽是 6Gb/s(“b”是比特),相当于每秒可以传输 768MB 的数据。而我们日常用的 HDD 硬盘的数据传输率,差不多在 200MB/s 左右。

响应时间就是程序发起一个硬盘的写入请求,直到这个请求返回的时间。

只看响应时间和吞吐率这两个指标,似乎硬盘性能很不错。即使是廉价的 HDD 硬盘,接收一个来自 CPU 的请求,也能够在几毫秒时间返回。一秒钟能够传输的数据,也有 200MB 左右,平时往数据库里写入一条记录,也就是 1KB 左右的大小,那差不多每秒钟可以插入 20 万条数据呢。但是这个计算出来的数字,似乎和我们日常的经验不符合啊?这又是为什么呢?

答案就来自于硬盘的读写。在顺序读写随机读写的情况下,硬盘的性能是完全不同的。

事实上,比起响应时间,我们更关注 IOPS 这个性能指标。IOPS,每秒读写的次数,也就是每秒输入输出操作的次数。IOPS 和 DTR(Data Transfer Rate,数据传输率)才是输入输出性能的核心指标。

因为,实际的应用开发当中,对于数据的访问更多是随机读写,而不是顺序读写。我们平时所说的服务器承受的“并发”,其实是在说,会有很多个不同的进程和请求来访问服务器。自然,它们在硬盘上访问的数据,是很难顺序放在一起的。这种情况下,随机读写的 IOPS 才是服务器性能的核心指标。

(二)如何定位 IO_WAIT

即使 CPU 向硬盘发起一条读写指令,需要很多个时钟周期,一秒钟 CPU 能够执行的指令数,和我们硬盘能够进行的操作数,也有好几个数量级的差异。CPU 指令发出去之后,不得不去“等” I/O 操作完成,才能进行下一步的操作。因此,应用开发的时候往往会说“性能瓶颈在 I/O 上”。

那么,在实际遇到服务端程序的性能问题的时候,怎么知道是不是 CPU 在等 I/O 来完成操作呢?可以通过 top iostat 这些命令,一起来看看 CPU 到底有没有在等待 io 操作。

top - 06:26:30 up 4 days, 53 min,  1 user,  load average: 0.79, 0.69, 0.65
Tasks: 204 total,   1 running, 203 sleeping,   0 stopped,   0 zombie
%Cpu(s): 20.0 us,  1.7 sy,  0.0 ni, 77.7 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
KiB Mem:   7679792 total,  6646248 used,  1033544 free,   251688 buffers
KiB Swap:        0 total,        0 used,        0 free.  4115536 cached Mem

 在 top 命令的输出结果里面,有一行是以 %CPU 开头的。这一行里,有一个叫作 wa 的指标,这个指标就代表着 iowait,也就是 CPU 等待 IO 完成操作花费的时间占 CPU 的百分比。当你自己的服务器遇到性能瓶颈,load 很大的时候,就可以通过 top 看一看这个指标。

知道了 iowait 很大,就要去看一看实际的 I/O 操作情况是什么样的。这个时候,就可以去用 iostat 这个命令了。输入“iostat”,就能够看到实际的硬盘读写情况。

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          17.02    0.01    2.18    0.04    0.00   80.76
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               1.81         2.02        30.87     706768   10777408

这个命令里,不仅有 iowait 这个 CPU 等待时间的百分比,还有一些更加具体的指标,并且它还是按照机器上安装的多块不同的硬盘划分的。

tps 指标,其实就对应着硬盘的 IOPS 性能。而 kB_read/s 和 kB_wrtn/s 指标,就对应着数据传输率的指标。

知道实际硬盘读写的 tps、kB_read/s 和 kb_wrtn/s 的指标,基本上可以判断出,机器的性能是不是卡在 I/O 上了。那么,接下来,就是要找出到底是哪一个进程是这些 I/O 读写的来源了。这时可以通过 iotop 这个命令,查看具体是哪一个进程实际占用了大量 I/O,然后有的放矢,去优化对应的程序了。

Total DISK READ :       0.00 B/s | Total DISK WRITE :      15.75 K/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:      35.44 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                             
  104 be/3 root        0.00 B/s    7.88 K/s  0.00 %  0.18 % [jbd2/sda1-8]
  383 be/4 root        0.00 B/s    3.94 K/s  0.00 %  0.00 % rsyslogd -n [rs:main Q:Reg]
 1514 be/4 www-data    0.00 B/s    3.94 K/s  0.00 %  0.00 % nginx: worker process

Linux 下,用 stress 命令,可以模拟一个高 I/O 复杂的情况。

课程链接:深入浅出计算机组成原理_组成原理_计算机基础-极客时间 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值