• ssr
  • vue.js

8.4k 次阅读  ·  读完需要 17 分钟

7

自从 Vue2 出正式版后, 就开始了 SSR 之旅, 不过之前用的都是虚拟主机, 部署不了 SSR, 所以也只是在本地写着玩, 双 11 的时候, 买了个某云主机, 正式开始了 SSR 之旅, 然后过程并不顺利, 部署, 运行都没问题, 但是发现内存泄漏严重, 1核1G内存的主机根本负担不了, 没什么访问量的情况下, 几个小时的时间, 1G 内存就用光, 明显有很严重的内存泄漏, 在本地环境压测, rps(每秒请求数) 无限接近于 1, 在云服务器更是压测都完成不了, 于是开始了优化之旅

1. 内存泄漏

经过查资料和测试, 发现 axios 和 vue-meta 都有内存泄漏之嫌

vue-meta

之前有写过一篇 Vue2 SSR渲染, 如何根据不同页面修改 meta?, 既然这个有内存泄漏的嫌疑, 只好先把代码恢复回去

axios

axios 的拦截器在 node 端也会导致内存泄漏, 因为之前版本是 SPA 版的, axios 配置也是针对 SPA 的配置, 里面有用到拦截器, 并且有大量的逻辑处理在里面, 包括加载进度, 错误处理等等, 这些逻辑在 node 端是没有任何意义的, 那么我们就需要对 node 端写个专门的 axios 配置文件

  • api/index-server.js (server端)
    https://github.com/lincenying...

  • api/index-client.js (client端)
    https://github.com/lincenying...

2. 缓存

缓存主要包括两个部分:

  • 服务端的 api 数据缓存

  • 组件的缓存

服务端的 api 数据缓存

昨天已经写了一篇文章: Vue2 SSR 缓存 Api 数据, 这里不再多说, 上面 axios 服务端配置文件中, 也有相关代码

组件的缓存

首先先安装lru-cache
然后在server.jscreateBundleRenderer的时候带上缓存的配置

require('vue-server-renderer').createBundleRenderer(bundle, {cache: require('lru-cache')({max: 1000, // 缓存最大数量maxAge: 1000 * 60 * 15, // 缓存时间 15分钟})
})

在组件里申明 key

serverCacheKey: () => {return `aside::account`
}

组件缓存的相关用法, 请参考官方文档:
https://github.com/vuejs/vue/...

注意: 一般情况下, 我们不要给容器型组件, 只给展示型组件加缓存, 如一个组件是静态组件, 如组件的数据是通过 props 传进去的

3. 配置 nginx

一般情况我们都需要用 nginx 或者 apache 做端口转发,

server {listen 80;server_name mmxiaowu.com www.mmxiaowu.com ssr.mmxiaowu.com;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host  $http_host;proxy_set_header X-Nginx-Proxy true;proxy_set_header Connection "";proxy_pass http://127.0.0.1:8080;}
}

我们可以修改下配置文件, 让静态文件直接走 nginx, 不再经过 nodejs

server {listen 80;server_name mmxiaowu.com www.mmxiaowu.com ssr.mmxiaowu.com;location ~ ^/(static|upload)/  {root /your/webroot/mmf-blog-vue2-ssr/dist;expires 30d;}location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host  $http_host;proxy_set_header X-Nginx-Proxy true;proxy_set_header Connection "";proxy_pass http://127.0.0.1:8080;}
}

经过以上一些优化后, 再进行一次压测:

E:\web\webpack\mmf-blog-vue2-ssr>loadtest -n 2000 http://localhost:8080/
[Sat Dec 31 2016 14:12:17] INFO Requests: 0 (0%), requests per second: 0, mean latency: 0 ms
[Sat Dec 31 2016 14:12:22] INFO Requests: 246 (12%), requests per second: 49, mean latency: 20.3 ms
[Sat Dec 31 2016 14:12:27] INFO Requests: 508 (25%), requests per second: 52, mean latency: 19 ms
[Sat Dec 31 2016 14:12:32] INFO Requests: 773 (39%), requests per second: 53, mean latency: 18.8 ms
[Sat Dec 31 2016 14:12:37] INFO Requests: 1036 (52%), requests per second: 53, mean latency: 19 ms
[Sat Dec 31 2016 14:12:42] INFO Requests: 1296 (65%), requests per second: 52, mean latency: 19.2 ms
[Sat Dec 31 2016 14:12:47] INFO Requests: 1548 (77%), requests per second: 50, mean latency: 19.9 ms
[Sat Dec 31 2016 14:12:52] INFO Requests: 1776 (89%), requests per second: 46, mean latency: 21.8 ms
[Sat Dec 31 2016 14:12:57] INFO
[Sat Dec 31 2016 14:12:57] INFO Target URL:          http://localhost:8080/
[Sat Dec 31 2016 14:12:57] INFO Max requests:        2000
[Sat Dec 31 2016 14:12:57] INFO Concurrency level:   1
[Sat Dec 31 2016 14:12:57] INFO Agent:               none
[Sat Dec 31 2016 14:12:57] INFO
[Sat Dec 31 2016 14:12:57] INFO Completed requests:  2000
[Sat Dec 31 2016 14:12:57] INFO Total errors:        0
[Sat Dec 31 2016 14:12:57] INFO Total time:          39.933183222 s
[Sat Dec 31 2016 14:12:57] INFO Requests per second: 50
[Sat Dec 31 2016 14:12:57] INFO Mean latency:        19.9 ms
[Sat Dec 31 2016 14:12:57] INFO
[Sat Dec 31 2016 14:12:57] INFO Percentage of the requests served within a certain time
[Sat Dec 31 2016 14:12:57] INFO   50%      16 ms
[Sat Dec 31 2016 14:12:57] INFO   90%      27 ms
[Sat Dec 31 2016 14:12:57] INFO   95%      43 ms
[Sat Dec 31 2016 14:12:57] INFO   99%      57 ms
[Sat Dec 31 2016 14:12:57] INFO  100%      133 ms (longest request)

效果非常不错, rps 已经能达到 50 了, 内存使用也大弧度下降了, 不过在云服务器上依然不够理想, 因为可能是云服务器上数据比本地的多, 另外云服务器的配置太烂...但是随着运行时间的增加, 内存肯定也会上升, 毕竟缓存也是需要占用内存的, 不过这个是属于合理开支...

过了差不多一天的时间, 内存只涨了 7M 左右...

Vue2 SSR 的优化之旅相关推荐

  1. Vue SSR 性能优化实践

    齐云雷,微医云服务团队前端工程师,本文是作者在<第二届缤纷前端技术沙龙>分享主题的文字版. 估计大部分读者对标题中的性能优化更感兴趣,可惜我分享的重点其实更多在于实践.实践有深有浅,下面介 ...

  2. 【Vuejs】971- Vue SSR 性能优化实践

    齐云雷,微医云服务团队前端工程师,本文是作者在<第二届缤纷前端技术沙龙>分享主题的文字版. 估计大部分读者对标题中的性能优化更感兴趣,可惜我分享的重点其实更多在于实践.实践有深有浅,下面介 ...

  3. 下一代 TGW 从13Mpps到50Mpps性能优化之旅

    本文作者:janmeshe,腾讯 TEG 后台开发工程师 0 导语 性能优化是一条既充满挑战又充满魔力的道路,非常幸运如今基于 X86 的性能优化方法及工具已经比较成熟,在 TGW 产品架构即将变革之 ...

  4. 手动创建 vue2 ssr 开发环境

    前言 手动搭建 vue ssr 一直是一些前端开发者的噩梦,因为其中牵扯到很多依赖包之间的配置以及webpack在node中的使用.就拿webpack配置来说,很多前端开发者还是喜欢用webpack- ...

  5. Docker玩法 — 镜像优化之旅

    Docker玩法 - 镜像优化之旅 开门见山地说,如果你已经来着这里,肯定发现了这个问题,我们在做镜像的时候,仅仅几K的源文件打出来居然百兆以上!更有甚者能到1个G,这无疑在后期运用时产生较大影响,所 ...

  6. Android 性能优化之旅5--电量优化

    转载自 Android 性能优化之旅5–电量优化 2.屏幕保持常亮 为了防止屏幕唤醒一瞬间耗电过多,有一些应用,比如游戏.支付页面,需要保持屏幕常亮来节省电量: getWindow().addFlag ...

  7. 记一次Vue全页面SSR深坑之旅 - 微弱的内存/CPU泄漏

    如果我跟你说,我面试来这家的时候,面试题就是这个问题你会作何感想?估计一般人是不会进坑的.然而,我进来了.因为我觉得这种技术问题很好玩.仅此而已.否则工作会很无聊. 前言 其实你没啥必要解决这个bug ...

  8. 带你重走 TiDB TPS 提升 1000 倍的性能优化之旅

    今天我们来聊一下数据库的性能优化,第一部分简单介绍一下性能优化的通用的方法,第二部分我们讲一个实际案例. 性能优化这个事情核心只有一句话,用户响应时间去哪儿了?性能优化很困难的原因在于,为了定位用户响 ...

  9. 趁热打铁-一次.Net WebService的性能优化之旅

    原文写于:八月 9 2011 11:08 上午 公司里新上了一个项目,在做性能测试的时候发现一个奇怪的问题,跑同一个流程,在一个48核(HP580 G7 PC server)的服务器上耗时120秒,而 ...

最新文章

  1. 14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽
  2. 打包解决方案后,安装时提示只能在IIS5.1以上运行解决方法
  3. 视窗宽高offset、client、scroll
  4. struts2 kindeditor teatarea拿不到值问题。
  5. Apache的架构师总结出30条架构设计原则
  6. 采用无线网桥做监控有什么优势?无线网桥的组网模式有哪些?
  7. 安装配置 radicale
  8. 大数据技术 思维导图
  9. java源代码加密+使用proguard混淆java web项目代码+自定义Classloader
  10. ES11新特性_String.prototype.matchAll方法---JavaScript_ECMAScript_ES6-ES11新特性工作笔记063
  11. 揭秘一份集团公司的三方数据对接情况
  12. POJ 1004:Financial Management
  13. python把工作簿拆分为工作表_如何批将Excel的多个Sheet工作表拆分为独立的工作簿?...
  14. ARM920T的MMU与Cache ——转载
  15. CorelDRAW2023安装下载教程精简版矢量绘图软件
  16. 刘天佐加盟《经济适用男》 变身木讷IT精英_0
  17. java poi替换word_利用POI 技术动态替换word模板内容
  18. 限定性定语从句和非限定性定语从句的区别
  19. 苹果联通 VoLTE 来了!
  20. 预测大盘最准确的指标_一辈子死记一个指标,完全弄透彻,即可预测一个月的股市升跌!...

热门文章

  1. 计算机学渣娃,学渣表示看不懂!WIN10中一个小小计算器都如此牛逼
  2. SSL双向认证以及证书的制作和使用
  3. 如何在计算机上查中考成绩,2018中考查询成绩网址 怎么查询中考成绩
  4. 万象OL免刷 云百度免刷
  5. SolidWorks 错误:找不到标准数据库 C:\SOLIDWORKS Data
  6. TDW千台Spark千亿节点对相似度计算
  7. linux acl库编译与使用,acl_cpp 的编译与使用
  8. vmlite和vmware_使用VMLite插件通过VirtualBox安装XP模式
  9. 研招网显示服务器错误,研招网2019考研调剂系统常见问题(一)
  10. pytorch实现GoogLeNet