目前主流浏览器通常可以存在2-6个并发。
连接和请求,占据了服务器的大量CPU和内存等资源。在资源数目超过100+的网站页面中,使用更多的下载连接,非常有必要。
缓解“高并发”的压力的手段。
一. Web前端优化,降低服务器压力
1. 减少Web请求
常用的实现方法是通过Http协议头中的expire或max-age来控制,将静态内容放入浏览器的本地缓存,在之后的一段时间里,不再请求Web服务器,直接使用本地资源。在HTML5中的本地存储技术(LocalStorage),也被作为一个数据本地缓存。
2. 减轻Web请求
通过Http协议的Last-Modified或Etag来控制。 这个时候请求服务器,如果是内容没有发生变化,服务器会放回304 Not Modified。这样的话,就不需要每次请求web服务器都做复杂的传输完整数据文件的工作,只是简单的http应答就可以达到相同的效果。
3. 合并页面请求
3.1 合并HTML展示内容。将CSS和JS直接嵌套入HTML页面中,不通过连接的方式引入
3.2 Ajax动态内容合并请求。对于动态内容,将10次Ajax请求合并为1次的批量信息查询。
3.3 小图片合并, 通过CSS的偏移量技术Sprites, 将很多小图片合并为一张。这个优化方式, 在PC端的Web优化中,非常常见。
二. 节约Web服务器端的内存
前端的优化完成,我们就需要着眼于Web服务器端本身。内存是Web服务器非常重要的资源,更多的内存通常意味着可以同时放入更多的工作任务。就Web服务占用内存而言,可以粗略划分:
1. 用来维持连接的基本内存,进程初始化时,会载入一些基础模块到内存。
2. 被传输的数据内容载入到各个缓冲区,占用的内存。
3. 程序执行过程中,申请和使用的内存。
Apache(httpd)的工作模式中,优化内存的方法如下:
1. prefork MPM, 多进程工作模式 。
原理:主进程生成后,它先完成基础的初始化工作,然年,通过fork预先产生一批子进程(子进程复制父进程的内存空间,不需要再做基础的初始化工作),然后等待工作。 之所以预先生成,是为了减少频繁创建和销毁进程的开销。多进程的好处, 是进程之间的内存数据不会相互干扰,同时,某个进程异常终止也不会影响其他进程。但是,就内存而言,每个httpd子进程占用了很多的内存,因为子进程的内存数据是复制父进程的。我们可以粗略认为,这里存在大量的“重复数 据”被放在内存中。最终,导致我们能够生成的子进程最大数量是很有限。在面对高并发时,因为有不少Keep-alive的长连接,将这些子进程“霸占”住,很可能导致可用子进程耗尽。因此,prefork并不太适合高并发场景。
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
缺点:一个服务进程占用很多的内存。
2. worker MPM,多进程和多线程的混合模式
worker模式比起prefork,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量很少),然后每个子进程创建一些线程(其中包括一个监听线程)。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会 共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork更省内存,因此会有更多的可用线程。
3. event MPM,多进程和多线的混合模式,引入Epoll
这个是Apache中比较新的模式,在现在的版本(Apache 2.4.10)已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些 keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。它减少了“占据”连接而又不使用的资源浪费,增强了高并发场景下的请求处理能力。因为减少了“闲等”的线程,线程的数量减少,同等场景下,内 存占用会下降一些。
4. 使用比较轻量的Nginx作为Web服务器
5. sendfile节约内存
四. 节约Web服务器的CPU
1. select/poll
2. Epoll(新版的Apache的event MPM,Nginx等支持)
Reference: http://www.admin10000.com/document/6190.html