《构建高性能web站点》–服务器并发处理能力–I/O

作者:heyue 时间:2011-04-09 分类:互联网技术 评论:0条 浏览:3130

网络流量作为互联网最重要的部分,广义上说最重要的是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的模型

  1. 同步阻塞I/O:
  2. 书上最直接的比喻:就是去中关村的大食代吃饭,点了饭之后,得等厨师做完吧,这段时间,你只能在那里等待。

  3. 同步非阻塞I/O:
  4. 一样是等吃饭,但是等饭这段时间,你可以去中关村的地下广场走一圈,但是又怕饭做好了被人领走或者冷掉,你需要2分钟回去看一下,累不累啊。

    和阻塞I/O不同的是,它的调用不会等待数据就绪,如果数据不可读或者不可写,将直接返回给程序状态。比如用非阻塞的recv()接收网络数据的时候,如果网卡缓冲区莫有可以接收的数据,函数直接返回告诉进程没有可读数据了。好处在于可以防止进程阻塞,可以在一个进程中同时进行多个I/O操作,弊端,轮询,浪费CPU。

  5. 多路I/O就绪通知:
  6. 等饭的时候出去逛逛,但是中关村的地下商场电子化很先进,有一个大屏幕,你可以在上面看见你的饭好了没有,好了就回来。不用像同步I/O那样去轮询查看。

    提供了对于大量文件描述符就绪检查的方案,允许进程不用通过轮询的方式来获取可用的文件描述符,可以快速通知进程就绪的文件描述符,进程可以只针对这些文件描述符访问数据。

  7. 直接I/O:
  8. 最直接的理解,就是绕过内核缓冲区,在用户态空间实现并管理I/O缓冲区,提高效率,因为以前的数据需要复制两次(从磁盘到内核缓冲区,然后再重内核缓冲区到用户态内存),直接I/O只需要一次。如果是数据库,用直接I/O可以更加合理地的策略来提高歘徐缓存命中率。

  9. sendfile:
  10. 这个的出现有一个问题,就是js,css,image之类的静态文件,他们的传输流程:

    磁盘——>内核缓冲区——>用户内存空间(不需要任何计算)——>复制回内核缓冲区——>拷贝到网卡缓冲区

    数据无缘无故在内核缓冲区复制了两次。

    sendfile的作用就是 磁盘——>内核缓冲区——>网卡缓冲区

    Apache 2.x 用sendfile 来发送大的静态文件

  11. MMap
  12. MMap是linux提供的一种磁盘文件访问方式,可以将内存中的某块地址映射到磁盘的某个文件,从而达到我们对这块内存的访问转换为对磁盘文件的访问。当然由于这个不进行read(),write()系统调用,效率很高。apache 2.x中使用了MMap来读取小静态文件。

总结3:sellect poll epoll 等实现
select :通过一个系统调用select()来监视包含多个文件描述符在数组,当select()返回后,该数组就绪的文件描述符便会被修改标志位,进程可以获得这些文件描述从而进行后续的的读写操作。不好的地方:通常存在监视文件描述符不能超过1024这个限制,而且每次用select()对socket进行线性扫描,增加了开销。
epoll:这个是2.6内核下公认的最好的多路I/O就绪通知的实现方法,分为边缘处罚和水平触发。
一个形象的比喻,就是在你先去商场注册一个手机号码,等饭的时候你出去逛逛,一旦饭好了,商场自动短信提醒…这个是不是很高效啊。
标签:

相关推荐
更多