服务器并发处理能力 - 2
系统调用
进程有两种运行模式:用户态和内核态。进程通常在用户态,这时可以使用CPU和内存,而当进程需要对硬件外设进行操作的时候(如读取磁盘文件、发送网络数据),就必须切换到内核态,当在内核态的任务完成后,进程又切回到用户态。
由于系统调用涉及进程从用户态到内核态的切换,导致一定的内存空间交换,这也是一定程度上的上下文切换,所以系统调用的开销通常是比较昂贵的。
减少不必要的系统调用,也是Web服务器性能优化的一个方面。
我们使用 strace 来跟踪 Nginx 的一个子进程,获得某次请求处理的一系列系统调用,如下所示:

内存分配
Apache在运行时的内存使用量是非常惊人的,这主要归咎于它的多进程模型,该模型使得Apache在运行开始便一次性申请大片的内存作为内存池。而Nginx的内存分配策略,它使用多线程来处理请求,这使得多线程之间可以共享内存资源,从而令它的内存总体使用大大减少,Nginx维持10000个非活跃HTTP持久连接只需要2.5MB内存。
持久连接
持久连接(Keep-Alive)也称为长连接。HTTP/1.1对长连接有了完整的定义,HTTP请求数据投中包含关于长连接的生命:
Connection : Keep-Alive
长连接的有效使用可以减少大量重新建立连接的开销,有效的加速性能。对于Apache这样的多进程模型来说,如果长连接超时时间过长,那么即便是浏览器没有任何请求,而Apache仍然维持着连接的子进程,一旦并发用户数较多,那么Apache将维持着大量空闲进程,严重影响了服务器性能。
I/O模型
有人说,比特天生就是用来别复制的,数据的生命意义便在于输入输出。
事实上,如何让高速的CPU和慢速的I/O设备更好的协调工作,这是从现代计算机诞生到现在一直探索的话题。
PIO与DMA
很早以前,磁盘和内存之间的数据传输是需要CPU控制的,也就是说如何读取磁盘文件到内存,数据要经过CPU存储转发,这种方式称为PIO。
后来,DMA(直接内存访问,Direct Memory Access)取代了PIO,它可以不经过CPU而直接进行磁盘和内存的数据交换。在DMA模式下,CPU只需要向DMA下达指令,由DMA来处理数据的传送即可,DMA通过系统总线来传输数据,传送完毕通知CPU,这样降低了CPU占有率。
同步阻塞I/O - BIO

阻塞是指当前发起I/O操作的进程被阻塞,而不是CPU被阻塞。
举个例子,比如你去逛街,饿了,你看到小吃城,就在一家面馆买了一碗面,交了钱,可面条做起来需要时间,你知不知道什么时候可以做好,只好坐在那里等,等面条做好吃完再继续逛街。—— 这里吃面条便是I/O操作。
This chapter requires login to view full content. You are viewing a preview.
Login to View Full Content