华子目录
服务端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
在返回给用户