通过对服务器的压力测试,得知当并行超过了服务器处理的能力的时候,效果反而会使吞吐率下降,事得其反,只是因为服务器端的计算能力已经跟不上请求的速度了。
CPU并发计算
进程
多进程的好处并不仅仅在于CPU时间的轮流使用,还在于对CPU计算和io操作进行了很好的重叠利用,这里的io是指磁盘io和网络io,和cpu速度相比,大多数进程的时间都主要消耗在io操作上,
如果我们希望服务器支持较大的并发数,那么就要尽量减少上下文切换次数,最简单的做法是减少进程数,这样可以减少cpu的消耗
IOWait
当IOwait很高的时候,至少说明但前任务的cpu开销相对于io操作时间来说比较少。
系统调用
由于系统调用涉及从用户状态到内核的切换,导致一定的内存空间交换,这也是一定程度的上下文切换,所以系统调用开销通常认为是比较昂股的。
系统调用的减少对于降低请求处理时间有着不可忽视的作用。
通过关闭
AllowOverride 为none 来关闭open 系统调用,
这样就是关掉了.htaccess可见在关闭它对可以减少系统调用来提高性能,还有两次gettimeofday和times调用,可以同过关闭mod_status来关闭。
内存分配
内存的分配和释放会引发一定时间的内存整理,这本身影响了性能。内存池对于性能的弥补微不足道。
使用Nginx 因为它的设计初衷便在于支持较大的并发连接
持久连接
长链接对于密集型的图片或网页等小数据请求处理有着明显的减速作用,ie7默认超时为1分钟,apache默认超时为5秒钟
优点
尽量减少链接次数,尽量重用连接通道
缺点
如果超时时间过长,一旦并发用户较多,那么Apache将维护大量的空闲进程,严重影响了服务气的性能,
由于超时时间过长导致资源无效时间占有而引发的随时超过了重复链接的损失
IO模型
种类
内存IO、网络IO、磁盘IO
网络数据传输过程中的瓶颈往往在于带宽最低的交换节点,类似的计算机IO瓶颈往往并不在内存IO
pIO磁盘和内存之间的数据传输是需要cpu控制的,也就是说如果我们读取磁盘文件到内存中,数据要经过cpu存储转发。
DMA不经过cpu直接进行磁盘和内存的数据转换
同步阻塞IO 是指当进程调用某些涉及IO从操作的系统调用或库函数时,比如accept、send、recv等,进程便停下来,等待IO操作完成后再继续运行。他可以和多进程结合起来有效的利用cpu资源,但是其代价就是多进程的大量内存开销。
同步非阻塞IO 相比于阻塞IO这种非阻塞IO结合反复轮询来尝试数据是否就绪,最大的好处便在于可以在一个进程里同时处理多个IO操作。
非阻塞IO一般针对网络IO有效,我们只需要在socket的选项设置中使用O_NONEBLOCK即可,对于磁盘IO不产生效果
多路IO就绪通知
多路IO就绪通知的出现,他允许进程通过一种方法来同时监视所有文件描述符,并可以快速的获得所有就绪的文件描述符,然后只针对这些文件描述符进行数据访问
epoll
被公认为Linux2.6下性能最好的多路IO就绪统治方法,
epoll可以同时支持水平触发和边缘触发
直接IO
引入内核缓冲区的目的在于提高磁盘文件的访问性能,真正写入磁盘是通过一定的策略进行延迟的
另一方面,绕过内核缓冲区也可以减少系统内存的开销,因为内核缓冲区本身就在使用系统内存。
sendfile拓展对较大文件处理,而对于小文件处理不是很重要
异步IO
阻塞和非阻塞是指当进程访问的数据如果尚未就绪,进程是否需要等待,而同步和异步是指访问数据的机制,同步一般指主动请求并等待IO操作完毕的方式,当数据就绪后在读写的时候必须阻塞,异步则指主动请求数据后便可以继续处理其他任务,
同步阻塞,异步不阻塞
select对于大文件并发不适用,epoll只关注活跃链接,而不再死链接上浪费时间。
当存在大量非活跃链接的时候,epoll的优势不言而喻