《构建高性能web站点》–服务器并发处理能力–I/O
网络流量作为互联网最重要的部分,广义上说最重要的是PV,UV等参数,流量和这个网站的价值成正比。微观来说具体到web服务器,就是一个一个资源从服务器出去、进来的过程。这个过程,是互联网的核心,互联网也就是提供了一种比较方便快捷的数据传输的方法而已。
一般在互联网上考虑的I/O分内存I/O,网络I/O,磁盘I/O,但是在互联网这个基于HTTP和TCP这类上层协议的应用,我们很少考虑内存的I/O,因为这个I/O远比网络和磁盘快多了,如果一定要用一个比喻来形容,就是北四环的堵车速度和贪污无数修建起来的高铁之间的区别….
总结1:关于I/O等待
在没有人访问的时候,服务器只能等待,比如这个是一个nginx的等待的过程 [root@centos ~]# strace -p 1248 Process 1248 attached - interrupt to quit gettimeofday({1302358935, 445379}, NULL) = 0 epoll_wait(15, {}, 512, 500) = 0 gettimeofday({1302358935, 445379}, NULL) = 0
其次是读磁盘的数据的时候,磁头移动速度有限,所以就有读取队列,也便有了阻塞。
向网卡发送数据的时候,数据需要复制到程序的内存空间、网卡缓冲区等操作,必然有一些等待时间。
总结2:几种I/O的模型
- 同步阻塞I/O:
- 同步非阻塞I/O:
- 多路I/O就绪通知:
- 直接I/O:
- sendfile:
- MMap
书上最直接的比喻:就是去中关村的大食代吃饭,点了饭之后,得等厨师做完吧,这段时间,你只能在那里等待。
一样是等吃饭,但是等饭这段时间,你可以去中关村的地下广场走一圈,但是又怕饭做好了被人领走或者冷掉,你需要2分钟回去看一下,累不累啊。
和阻塞I/O不同的是,它的调用不会等待数据就绪,如果数据不可读或者不可写,将直接返回给程序状态。比如用非阻塞的recv()接收网络数据的时候,如果网卡缓冲区莫有可以接收的数据,函数直接返回告诉进程没有可读数据了。好处在于可以防止进程阻塞,可以在一个进程中同时进行多个I/O操作,弊端,轮询,浪费CPU。
等饭的时候出去逛逛,但是中关村的地下商场电子化很先进,有一个大屏幕,你可以在上面看见你的饭好了没有,好了就回来。不用像同步I/O那样去轮询查看。
提供了对于大量文件描述符就绪检查的方案,允许进程不用通过轮询的方式来获取可用的文件描述符,可以快速通知进程就绪的文件描述符,进程可以只针对这些文件描述符访问数据。
最直接的理解,就是绕过内核缓冲区,在用户态空间实现并管理I/O缓冲区,提高效率,因为以前的数据需要复制两次(从磁盘到内核缓冲区,然后再重内核缓冲区到用户态内存),直接I/O只需要一次。如果是数据库,用直接I/O可以更加合理地的策略来提高歘徐缓存命中率。
这个的出现有一个问题,就是js,css,image之类的静态文件,他们的传输流程:
磁盘——>内核缓冲区——>用户内存空间(不需要任何计算)——>复制回内核缓冲区——>拷贝到网卡缓冲区
数据无缘无故在内核缓冲区复制了两次。
sendfile的作用就是 磁盘——>内核缓冲区——>网卡缓冲区
Apache 2.x 用sendfile 来发送大的静态文件
MMap是linux提供的一种磁盘文件访问方式,可以将内存中的某块地址映射到磁盘的某个文件,从而达到我们对这块内存的访问转换为对磁盘文件的访问。当然由于这个不进行read(),write()系统调用,效率很高。apache 2.x中使用了MMap来读取小静态文件。
相关推荐
- 唐山和汶川
- Posted on 09月12日
- 百度K掉了我的个人博客
- Posted on 07月11日
- 如何让网站打开更快第一弹—DNS篇【转载】
- Posted on 04月11日
- 凑热闹,写个微信5.0
- Posted on 08月05日