华子目录
- 服务端`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.17ms
10000转的机械盘平均延迟:60*1000/10000/2 = 3ms
15000转的机械盘平均延迟:60*1000/15000/2 = 2ms
每秒最大IOPS的计算方法
 
7200转的磁盘IOPS计算方式:1000毫秒/(9毫秒的寻道时间+4.17毫秒的平均旋转延迟时间)=1000/13.13=75.9 IOPS
10000转的磁盘的IOPS计算方式:1000毫秒/(6毫秒的寻道时间+3毫秒的平均旋转延迟时间)=1000/9=111IOPS
15000转的磁盘的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在返回给用户