目前主流浏览器一般能够存在2-6个并发。html
链接和请求,占据了服务器的大量CPU和内存等资源。在资源数目超过100+的网站页面中,使用更多的下载链接,很是有必要。 前端
缓解“高并发”的压力的手段。web
一. 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