服务器的并发处理能力可以用我们一般来说的吞吐率来形容,我们可以随时通过mod_status来查看lighttpd的实时吞吐率
吞吐率的前提包括以下几点
并发用户数(某一时刻同时向服务器请求的用户总数)
总请求数(一个用户可以有多个请求)
请求资源描述
在进行服务器压力测试时,常用的测试软件是apache自带的ab,除此之外还有LoadRunner,Jmeter等,利用压力测试可以得到用户的平均请求等待时间,吞吐率,IOwait等有效信息来制定并发策略。
对于cpu来说最重要的就是并发计算,相关的有I/O,系统调度,内存设置
I/O
此处I/O指的是高速的cpu处理与慢速的I/O之间的匹配。
BIO(同步阻塞IO)当进程调用某些涉及I/O操作的系统调用或库函数时进程便暂停下来,等待io操作完成之后再继续进行,需要消耗大量内存
同步非阻塞I/O不会等待数据就绪,这种非阻塞I/O结合反复轮询的方式来尝试数据是否就绪,防止进程被阻塞,在一个进程中可以处理多个I/O。
多路I/O就绪通知提供了对大量文件描述符就绪检查的高性能方案,允许进程通过一种方法来同时监视所有的文件描述符,快速获得就绪的文件描述符。此种方式下访问数据依然要选取阻塞和非阻塞。
select与poll都是通过监视文件描述符数组来进行数据就绪查看,select有最大限制,poll没有。select与poll将就绪文件告诉进程之后,如果本次没有处理那么下次还会继续报告,不会丢失。缺点每次返回所有监视的文件描述符
epoll也是采用了就绪通知的方式,优点就是每次只返回就绪的文件描述符。
直接I/O绕过内核缓冲区
sendfile()直接进行静态文件传输
异步I/O(AIO)是指在主动请求数据后就可以去处理其他任务,随后等待I/O操作完毕的通知即可。
系统调度
可以设置进程调度的优先级pr(进程调度偏爱I/O密集型的进程),可以通过/proc/loadavg、top或者w等工具来查看系统负载。减少不必要的系统调用(降低内核态与用户态的切换次数)可以有效的提高服务器的处理能力。
内存设置
nginx是一个在内存方面表现比较良好的轻量级服务器,可以使用多线程来处理请求,并在多个线程之间可以共享内存资源。
内存上可以采用内存映射的方式直接将内存与磁盘文件进行对应直接访问(mmap())
以上这些优化方式的宗旨就是尽可能减少用户态和内核态的交互开销。在进行服务器并发设计时可以一个进程处理一个连接(prefork模型,上下文开销很大),可以一个线程处理一个连接(worker模型,没有比prefork优化很多本质上依然需要处理多次上下文开销),一个进程处理多个连接(当存在大量非活跃用户连接时,epoll具有很明显的优势),一个线程处理多个连接