华子目录
- 服务端`i/o`介绍
- `磁盘i/o`
- `机械磁盘`的`寻道时间`、`旋转延迟`和`数据传输时间`
- 常见的机械磁盘平均`寻道时间值`
- 常见磁盘的平均`延迟时间`
- 每秒最大`IOPS`的`计算方法`
- `网络i/o`
- `网络I/O`处理过程
- `磁盘和网络i/o`
- `一次完整的请求在内部的执行过程`
服务端i/o介绍
i/o在计算机中指Input/Output,IOPS(Input/Output Per Second) 即每秒处理I/O请求的数量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位I/O请求通常为读或写数据操作请求一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换- 但是由于
内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中 - 所以简单说
I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中
服务器的I/O
磁盘I/O网络I/O:一切皆文件,本质为对socket文件的读写
磁盘i/o
磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源,比如是html文件或者图片,然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间
机械磁盘的寻道时间、旋转延迟和数据传输时间
寻道时间:是指磁头移动到正确的磁道上所花费的时间,寻道时间越短则I/O处理就越快,目前磁盘的寻道时间一般在3-15毫秒左右
旋转延迟:是指从磁盘寻道结束开始,直到磁头旋转到I/O请求所请求的起始数据块位置为止的时间间隔。这个时间间隔是磁盘驱动器读取或写入数据时所需的一个额外时间,主要由磁盘的物理特性决定旋转延迟的大小取决于磁盘的转速和磁头所在磁道与目标磁道之间的角度差。一般使用磁盘旋转周期的一半作为旋转延迟的近似值,这种方法在实际应用中非常实用旋转延迟=磁盘旋转一周所需时间 / 2=60秒 × 1000毫秒/秒/磁盘转速(RPM)/2例如,一个7200RPM的磁盘,其平均旋转延迟大约为60 × 1000 / 7200 / 2 = 4.17毫秒
数据传输时间:指的是读取到数据后传输数据的时间,主要取决于传输速率,数据传输时间等于数据大小除以传输速率,目前的磁盘接口每秒的传输速度可以达到600MB,因此可以忽略不计
常见的机械磁盘平均寻道时间值
7200转/分的磁盘平均物理寻道时间:9毫秒10000转/分的磁盘平均物理寻道时间:6毫秒15000转/分的磁盘平均物理寻道时间:4毫秒
常见磁盘的平均延迟时间
7200转的机械盘平均延迟:60*1000/7200/2 = 4.17ms10000转的机械盘平均延迟:60*1000/10000/2 = 3ms15000转的机械盘平均延迟:60*1000/15000/2 = 2ms
每秒最大IOPS的计算方法
7200转的磁盘IOPS计算方式:1000毫秒/(9毫秒的寻道时间+4.17毫秒的平均旋转延迟时间)=1000/13.13=75.9 IOPS10000转的磁盘的IOPS计算方式:1000毫秒/(6毫秒的寻道时间+3毫秒的平均旋转延迟时间)=1000/9=111IOPS15000转的磁盘的IOPS计算方式:15000毫秒/(4毫秒的寻道时间+2毫秒的平均旋转延迟时间)=1000/6=166.6 IOPS
网络i/o
网络I/O指的是网卡与内存之间的输入输出。当网络上的数据到来时,网卡需要将数据拷贝到内存中;当要发送数据给网络上的其他设备时,需要将数据从内存拷贝到网卡里

网络I/O处理过程
获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成返回数据,服务器将已构建好的响应再通过内核空间的网络I/O发还给客户端
磁盘和网络i/o
每次I/O,都要经由两个阶段:
第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
一次完整的请求在内部的执行过程
网卡和内存都在主板上,网卡和内存通过总线通信(不消耗cpu),用户请求的数据就会到io空间上,访问的是socket套接字,这个io空间是内核开的,然后内核会把请求copy到应用软件app,然后进程就会知道这个请求需要什么东西(所有对于硬件的调用,app是做不到的,只能内核可以),如果说这个app是nginx,请求是index.html。nginx就会构建报文,告诉内核,它要取index.html文件。内核读取完所有数据之后(需要消耗cpu),返回给nginx,nginx开始构建相应报文,将相应报文返回给内核中的socket,socket在返回给用户
