Bleeding Edge版V8引擎的内存使用评测

标签: 杂七杂八 | 发表时间:2011-10-12 21:50 | 作者:handaoliang yinwm
出处:http://www.showmuch.com/article

编者注:本文章为“搜狐NodeJS团队”的投稿,搜狐技术部在使用NodeJS方面,有着丰富的经验,本文也是他们的一份经验总结,很值得一看。原创投稿文章,版权归“搜狐技术部NodeJS团队”所有,未经允许严禁转载。

作为无阻塞事件驱动的后端框架,nodejs非常适合于处理具有海量web请求的应用。最近一段时间,我们团队一直在尝试用nodejs构建webIM服务。在使用node的过程中我们体会到了nodejs无阻塞事件驱动的优点,也遇到了一些让我们很头疼的问题,其中最让我们抓狂的问题莫过于node的内存限制以及它的GC(Garbage Collection)机制。

1.实例占用内存大小限制和GC
nodejs是基于google的v8引擎编写的。我们知道V8对单个node实例做了内存限制,在32位的系统上默认限制为512mb,在64位的系统上默认限制为1gb。对于一个tab页来说,1gb的内存显然绰绰有余,但是对于web应用来说可能并不够。node为我们提供了一个执行参数用于改变这一限制,你可以在执行node实例时加这样写”node test.js –max-old-space-size=1000 “。但是这样做仍然是有限制的,32位系统和64位系统能够设置的上限值分别是1gb和1.7gb。当然也可以采用限制接入的请求数或者开启更多实例的办法。 但是,如果你真的希望一个node实例能够占用2G以上的内存,现在的node恐怕要让你失望了。
像python、ruby此类的脚本语言一样,Node的v8引擎也是由系统进行内存回收的操作。但是程序员无法控制v8发起GC,只能标记不再使用的对象,使得下次gc回收该对象的内存空间。v8的GC采用的是stop the world的机制,在mark-sweep期间,实例会暂停运行,也就是说在某个随机的时刻所有发向该实例的请求都会被忽略掉。当你用一个node建立一个服务器监听请求,当不可控的GC发生时,你就会发现客户端只能收到502 Bad Gateway了。

2.换个发动机
在实际中,我们团队确实遇到了无法用其他方法绕过的Node内存限制以及GC机制的情况,所以我们一直在关注v8引擎在gc方面的更新。Bleeding Edge是google v8的实验性分支。最新的Bleeding Edge合并了v8的GC分支,它去除了node实例占用内存的限制并对GC的性能做了优化。对我们来说,这个版本的v8无疑具有极大的吸引力。
于是我们萌发了用新版的Bleeding edge的v8引擎升级node的想法。废话少说,看看我们是怎么给node换引擎的吧。替换v8引擎的步骤如下:
A.获取v8的bleeding版本, svn checkout http://v8.googlecode.com/svn/branches/bleeding_edge/ v8。
B.获取node-0.4.12(目前的稳定版node)
C.将node和v8的压缩包都放到服务器上,解压,将node自带的v8替换,node内置的v8位置如下:
nodejs

D编译:先修改源码,因为貌似是v8抛弃(或者重命名)了string的一个枚举值。我从网上搜索这个枚举值,它对应的是0,因此我做了一个替换.
nodejs

3.动力测试
更换了新引擎以后的node动力如何呢?我们拿原始版和改进版进行了的对比测试。
测试程序:
nodejs

测试一:实例占用最大内存值
测试一的目标很简单,就是用程序不停申请内存,直到出现进程内存溢出,观察node的GC日志,看两个版本的node谁支持的内存更大。执行如下命令:
nodejs

图中第一项scavenge和mark-sweep(感兴趣对的同学可以看一下这篇文章http://www.jiangmiao.org/blog/2247.html)是v8在进行标记回收内存,第二项的“400 –> 380 MB”这样显示是表示此次内存回收将占用内存从400MB减少到380MB,回收了20M内存,第三项“20ms”代表的是本次回收花费的时间;FATAL ERROR的出现表明内存被用尽。由于我们截的图是node实例将内存几乎耗尽的最后时刻,已经没有空闲内存能够供node进行GC,所以最后几次内存回收没有能够让占用内存量减少。
图三最后一行出现了乱码,猜测是发生了段错误,造成错误的原因可能是系统寻址的问题,232最多能表示4G的地址空间,感兴趣的童鞋可以继续研究。
结论为Bleeding Edge版node-0.4.12解除了对实例占用内存的限制,在默认配置下,内存分配可达3100MB;在指定–max-old-space-size的情况下,内存至少可以分配到4200MB。此后仅仅依靠改变–max-old-space-size参数无法继续增加内存分配,推测是寻址空间的原因,是否增加更多内存分配需要进一步的测试。

测试二:达到相同内存占用所花费的时间
测试程序同测试一,执行如下命令,记录GC花费时间:
nodejs

测试二的目的是验证Bleeding Edge版node和原版node的GC性能对比。如图4所示,内存消耗为相同数量时,Bleeding Edge版的node运行时间要长,换句话说,Bleeding版由于GC性能的优化,使得GC的效率提高了。

测试三:buffer和string的内存使用对比
我们知道在bleeding edge版本出现之前,可以通过使用node的扩展数据类型buffer(http://code.google.com/p/v8/issues/detail?id=847#c8)绕过node本身堆内存限制,获得更多内存,那么Bleeding Edge版的v8引擎对string和buffer类型变量的内存回收会不会有区别呢?我们编写了如下程序尝试测试原版和改造版的node对buffer和string的GC性能。两个程序分别循环定义buffer型变量和string型变量,用node的trace-gc参数来观察内存使用情况。
程序代码:

nodejs

我们把这两段代码分别用原版和Bleeding Edge版node运行。可以看到trace gc的结果如下。由于Scavenge内存回收量远远小于Mark-sweep 方式,且Scavenge持续时间非常短,所以我们在表中省略了Scavenge内存回收的数据。

nodejs

由表2我们可以看出,原版的node对buffer类型和string类型变量内存回收处理性能完全一致。

nodejs

由表3我们可以看出,Bleeding Edge版的node对Buffer类型和string类型变量GC效果略有区别。原生的string类型变量的GC性能略优于Buffer型变量。单位时间回收内存方面string类型相比buffer类型有2.40%的性能提升。看来尽管buffer能够绕过node的内存限制,但是它也付出了一定的性能代价。

4.结论如下:
1)Bleeding Edge确实解除了node实例的内存限制,目前通过对–max-old-space-size的设置,至少可以达到4200MB。或许对node的源码进行改写后,能够让64位系统支持给node分配超过4G的内存。
2)Bleeding Edge在GC方面有优化,在不降低计算性能的前提下,增加了内存回收的数量,提高了GC效率。
3)Bleeding Edge对string类型变量的GC性能略强于buffer类型。

相关 [bleeding edge v8] 推荐:

ZZ: Bleeding Edge版V8引擎的内存使用评测

- netcasper - BT的花 blogs
哈哈,所以我只转载一个链接: 秀码趣:Bleeding Edge版V8引擎的内存使用评测. 这篇文章背后是我们暑期实习生训练营的成果,非常高兴看到他们的成长. 以后俺们如果开始发布 sohu developer blog 的话,除了 linux@SOHU 之外,看来可以增加一个 NodeJS 的专栏.

Bleeding Edge版V8引擎的内存使用评测

- yinwm - 秀码趣 - ShowMuch.com
编者注:本文章为“搜狐NodeJS团队”的投稿,搜狐技术部在使用NodeJS方面,有着丰富的经验,本文也是他们的一份经验总结,很值得一看. 原创投稿文章,版权归“搜狐技术部NodeJS团队”所有,未经允许严禁转载. 作为无阻塞事件驱动的后端框架,nodejs非常适合于处理具有海量web请求的应用. 最近一段时间,我们团队一直在尝试用nodejs构建webIM服务.

Adobe Edge使用了jQuery

- Wick - Solidot
Adobe发布了Edge Preview 1,允许Web开发者使用HTML5、JavaScript和CSS3等Web标准,为网站开发动画和交互内容. Adobe Edge使用了开源JavaScript库jQuery. jQuery是Edge的重要组件,Edge Preview 1使用jQuery 1.4.2,后续版本将使用较新版的jQuery,Adobe发布的下一个版本预计将使用jQuery 1.6.2.

《侍魂·闪》(Samurai Shodown Edge of Destiny)完整硬盘版[压缩包]

- biAji - VeryCD电驴大全 - 电驴资源订阅
英文名称: Samurai Shodown Edge of Destiny. 发行时间: 2011年8月6日. 制作发行: SNK Playmore. 引用转自3DMGAME引用SSED.rar说明:. 启动后黑屏的下载附件中的文件全部解压到游戏安装目录,删除目录下原来的d3d9.dll文件,然后运行SSED_Launcher.exe游戏名称:侍魂·闪.

Adobe 发布 HTML5 网页动画工具 Adobe Edge

- Joji - ITeye资讯频道
    Flash VS HTML5之争似乎即将见分晓. Adobe刚刚发布了一个新的工具Adobe Edge,允许设计师通过HTML5、CSS和JavaScript制作网页动画,无需Flash.     Adboe Edge的目的是帮助专业设计师制作网页动画乃至简单游戏. 目前该工具的重点放在动画引擎上,但未来将增加更多HTML5功能,比如Canvas、HTML5音频/视频标签等.

Adobe发布HTML5网页动画工具{Adobe Edge}

- Zen - 36氪
Flash VS HTML5之争似乎即将见分晓. Adobe刚刚发布了一个新的工具{Adobe Edge},允许设计师通过HTML5、CSS和JavaScript制作网页动画. Adboe Edge的目的是帮助专业设计师制作网页动画乃至简单游戏. 目前该工具的重点放在动画引擎上,但未来将增加更多HTML5功能,比如Canvas、HTML5音频/视频标签等.

Adobe发布HTML5网页动画工具Adobe Edge

- XcessLeo - GeekPark 捕风捉影
Flash VS HTML5之争似乎即将见分晓. Adobe刚刚发布了一个新的工具{Adobe Edge},允许设计师通过HTML5、CSS和JavaScript制作网页动画. Adboe Edge的目的是帮助专业设计师制作网页动画乃至简单游戏. 目前该工具的重点放在动画引擎上,但未来将增加更多HTML5功能,比如Canvas、HTML5音频/视频标签等.

微软Edge浏览器内置VPN功能

- - donews
DoNews 5月2日消息(刘文轩)苹果在 macOS Monterey 与 iOS/iPadOS 15 开始推出名为“Private Relay”的 VPN 服务,与之相对的,作为 Windows 系统的开发商,微软也在自家的浏览器中推出类似服务,确保用户上网安全. 这项服务由微软与 Cloudflare 合作完成,名为“Microsoft Edge Secure Network”,宣称可确保经由Edge送出的数据通过加密通道传送,即使用户访问的是使用HTTP、较不安全的网站也是如此.

HTC Edge 可能会是市面上第一部四核心智能手机唷!

- PS - Engadget 中国版
我们只是说「可能」,这个「可能」包含究竟这支手机是不是叫「Edge」. 不过确定的是,它应该是第一支有 Tegra 3 处理器的智能型手机. 根据 Pocketnow 网站的消息,这款手机将会有四核心 1.5GHz 处理器、4.7 寸 720p HD 显示屏幕、1GB 内存、28mm f/2.2 800 万像素后镜头和 Beats 音乐支持.

微软正式宣布!桌面版Edge浏览器将采用Chromium内核

- - IT之家
IT之家12月7日消息 当地时间12月6日上午9点,微软在其官方博客发表了一篇题为《Microsoft Edge: Making the web better through more open source collaboration》的博文. 在文章中,微软宣布,他们打算采用Chromium开源项目开发桌面版的Microsoft Edge浏览器.