《性能优化与负载均衡》

1,300 阅读5分钟

1.代码性能优化

代码层里

 //求数组中最大的值
 var arr = [1, 44, 55, 6, 7, 8, 9]
 var max = arr[0];
 for(var i = 0; i < arr.length; i++) {
     if(arr[i]>max) {
         max = arr[i]
     }
 }
 console.log(max)
 
 // 优化点有
 var l = arr.length // 用个变量来保存长度,不用每次循环都计算
 var l = arr.length - 1 // 从编译角度,反向编译会快很多
 for(var i = l; i >= 0; i--) {
     if(arr[i] > max) {
         max = arr[i]
     }
 }
1.[css]将样式表放到页面顶部,不使用CSS表达式,使用不使用@import
2.[javasript]减少DOM的访问,删除不需要的脚本,压缩javascript和css,将它们从外部引入,将脚本放在页面底部
3.[图片方面]css spite精灵,不要在html中拉伸图片

重绘重排

1.函数中会经常用到全局变量,把它保存在局部变量中
2.使用事件代理/事件委托
3.批量修改DOM

加载资源调优

1.路由懒加载
// router.js

{
   path: '/about',
   name: 'AboutMe'
   component: () => import(/*webpackChunkName: "about"*/'@/components/about')
}
2.组件异步加载
// errorComponent.vue
import CompA from "@/compenents/compa.vue"
export default {
    components: {
        errorComponent: () => import(/*webpackChunkName: "CompA"*/'@/components/CompA')
    }
}
3.高级异步组件
import Loading from '@/components/Loading'
const AsyncCompC = () => {
    //需要加载的组件,是一个promise对象
    component: impornt('@/components/CompC.vue'),
    loading: Loading,
    delay: 300,
    timeout: 2000
}

2.http层面的优化

1.DNS 预解析 - DNS 缓存

2.TCP 连接 - 采用http2,tcp通道复用,头部压缩,

3.浏览器并发

4.http请求次数-合并文件, CSS精灵,inline Image

5.http压缩- Gzip

6.图片优化-小图标base64,图片预加载,webP

7.缓存--强缓存expires, cache-control与协商缓存Last Modified, Etag

8.浏览器的渲染-禁止使用iframe(阻塞父文档onload事件),禁止使用gif图片实现loading效果,使用css3代码代替js动画(避免重绘重排以及回流),空的href和src, 网页gzip, CDN托管,data缓存,图片服务器,DOM树,CSSOM树,布局渲染树,绘制渲染树;

3.服务器层面的优化[待补充]

1.使用CDN

2.配置Etag

3.压缩数据--Gzip压缩

4.通过反向代理来提高性能和增加安全性

5.添加负载平衡

6.缓存静态和动态的内容

7.优化SSL/TLS

8.使用HTTP2或SPDY

4.架构层面的优化

1.DNS解析优化--利用TTL(Time to Live), 拆分域名,DNS prefetch

2.TCP建联优化(即对rwnd, cwnd的处理)--流量控制,慢启动

3.CDN加速

4.请求合并(减少http请求)--gulp/grunt合并文件,css spite, base64.etc.

5.重定向优化

6.NS部署, Anycast

7.缓存--动态页面静态缓存,缓存查询结果

8.请求异步

9.http 2.0

10.负载均衡--web负载均衡、ip负载均衡、反向代理、dns等

5.node高并发负载均衡

垂直扩展

主要是提升单机硬件配置(cpu, 内存,网卡,硬盘)

水平扩展

目前在高并发高可用系统架构中,最优的方案还是水平扩展。 理论上,在系统能支持水平扩展的前提下,增加服务器数量,部署更多机器集群,能够带来无限的性能提升。 如何将网络请求分布给多个机器支处理?

1.负载均衡器--Nginx

Nginx是一个高性能的WEB服务器和反向代理服务,最常用的软件负载均衡器。 网易、淘宝、腾讯、新浪等等大小互联网公司 核心概念:用户请求先到Nginx,再由Nginx转发请求到后面的应用服务器(如:node)

# nginx.conf配置文件--负载均衡配置方式
events{
    #并发连接数
    worker_connections: 1024;
}
http{
    #Tomcat服务器集群
    upstream tomcat_servers{
        server 127.0.0.1:8081;
        server 127.0.0.1:8080;
    }
    server{
        #监听80端口
        listen 80;
        #将所有请求交给Tomcat集群处理
        location / {
            proxy_pass http://tomcat_servers;
        }
    }
}

Nginx一般做到10万并发,常用调优手法: Nginx参数: 进程与CPU绑定worker_cpu_affinity、 并发连接数、缓存区、超时时间、压缩、日志 操作系统网络参数: 能打开的最大文件数、net.ipv4.tcp_keepalive_time、tcp缓冲区/proc/sys/net/ipv4/tcp_mem、rmem、wmem 为什么说一般做到10W并发,难道不能继续优化嘛? Nginx通常用在Http反向代理的场景,在网络模型中,Http属于第7层应用层的协议; Http请求的处理包括解析和封装Http内容,要处理更多请求,需要更多的内存、CPU等资源。 高配置硬件太贵,通常组成????来获取更高的处理能力。

2.负载均衡器--LVS

LVS(Linux Virtual Server), linux虚拟服务器,中国人开发,目前绝大部分Linux发行版,都集成在内核了。实现基于第四层(传输层)的软件负载均衡方案。为了方便理解,初学者可以认为,安装使用了LVS的Linux服务器,等于快递中转。 核心理念:原本是请求LVS服务器的数据包,被LVS软件篡改了数据包的目的地,将流量转移到了Nginx所在机器IP,从而实现负载均衡。 为什么说LVS比Nginx快? 网络第四层所使用的协议(如TCP)内容比HTTP简单,解析和组装所消耗的CPU、内存等资源比Nginx要低。

3.硬件设备,例如F5

服务端终有上限

我们这里设定一个不同负载均衡方案的区间值
  • Nginx支撑1W~10W并发
  • LVS支撑10W~50W并发
  • F5支撑200W~1000W并发
超过服务器架构设备的上限后,如何实现无限水平拓展?

4.DNS-无限水平扩展的终极奥秘