Tag: 性能

防止Javascript函数因内存太多而耗尽内存

我在nodeJS中构build了一个使用request和cheerio来parsingDOM的web刮板。 当我使用node ,我相信这是更一般的javascript问题。 tl; dr – 创build〜60,000 – 100,000个对象,耗尽了我所有的计算机的RAM,导致节点out of memory不足。 这是刮板的工作原理。 它是循环内的循环,我从来没有devise过这么复杂的东西,所以可能有更好的方法来做到这一点。 循环1:在数组中创build10个名为“sitesArr”的对象。 每个对象代表一个网站刮。 var sitesArr = [ { name: 'store name', baseURL: 'www.basedomain.com', categoryFunct: '(function(){ // do stuff })();', gender: 'mens', currency: 'USD', title_selector: 'h1', description_selector: 'p.description' }, // … x10 ] 循环2:循环“sitesArr”。 对于每个网站,通过“请求”访问主页,并获取一个分类链接列表,通常是30-70个url。 将这些URL附加到名称为“categories”的数组属性中的当前所属的“sitesArr”对象。 var sitesArr = [ { name: 'store name', […]

如何testing构build在node.js和socket.io上的聊天应用程序的负载?

这里是一个简单的聊天应用程序与房间概念的链接,我指的是学习如何创buildsocket.io应用程序 – https://github.com/mcantelon/chatrooms 。 我需要testing这个应用程序为socket.io带来多less负载。 我如何testing成功连接了多less个连接? 有没有任何工具或方法来实现这一目标?

file upload和浏览器(BROWSER)内存不足

在我的networking应用程序允许file upload,我注意到,继续使用几个file upload(每个约5MB到15MB)导致我的浏览器崩溃,看起来是一个“内存不足”的问题。 读入缓冲存储器后,每次上传文件后,是否需要执行任何清理任务? 另外我怎样才能看到我的networking应用程序中的浏览器内存中的内容?

node.js的内存使用量在做500k个mongodb插入时爆炸

我正在将数据从MySQL迁移到MongoDB。 MySQL根本没有优化(没有索引),所以我的操作,1个普通的sql查询和1个sql的sequelize查询每个约30秒,每个返回约300k个文档。 我不担心MySQL部分,但是关于节点/ mongo部分。 当他们插入到MongoDB,我已经尝试了几件事情: 使用本地驱动程序和数组插入,我没有看到任何问题,它是快速的。 我只是将查询结果聚合成几个中等大小的数组(<16MB)并插入它们。 但我想做upserts,而不是插入不破坏修改后的数据,并不支持批量操作。 使用mongoose和单一的upserts,节点进程缓慢地走向我给它的mem限制(3GB),然后似乎停在那里。 30分钟后,没有什么明显的进展,mongodb进程处于0%的CPU。 (我认为,如果它有足够的内存用于给定数量的数据,它通常会在很久以后完成。) 使用本地驱动程序和单个upserts,整个过程运行非常缓慢,但至less完成。 看到任务pipe理器(Windows系统)中的CPU使用情况,我可以看到,MySQL正在使用CPU,当它应该(当我开始2个查询,第二个第一个完成后,所有的结果已经插入到mongodb (至less从节点一方,因为他们到现在还没有到达)),并且Mongod在开始时显示CPU负载很短,但是它保持在0%,而node.js抓取越来越多的内存。 只是在很久之后,mongod似乎再次启动,并且在某个时刻,mongod也回到了0%的CPU时间点,节点的内存使用率反转并恢复正常。 奇怪的是,到那个时候,我所有的查询/插入都是很早以前完成的,而实际的工作(从CPU使用情况以及从mongodb中的实际数据中可以看出,预期的对象)只是在后来发生巨大的内存和CPU负载(在大多数操作期间,CPU负载节点进程最大1个核心)。 那么,上面的第三种情况对我来说是最有趣的,因为它正在工作,给我我想要的东西,它只是performance不太理解。 为什么这个“真正”的工作只是在我叫更新之后才做的? 为了加快这个过程,我也消除了写关注/callback,似乎有所帮助。 典型的upsert看起来像这样: connectionb.update({ isbn13: book.isbn13 }, { $addToSet: { ratedByUsers: insertuserrating } }, { w: 0 }); 和 connectionu.update(insertuser, { $addToSet: { ratedBooks: insertbookrating } }, { upsert: true, w: 0 }); 此外,我不认为我有内存泄漏,因为总体而言,后来我发现内存再次回落到几个100MB。 (不在这里 – 我把这个属性归咎于GC懒惰,但是我反复运行这个操作,并且看到内存再次大幅下降。) 我试图更好地说明行为:你可以看到MySQL […]

Nodejs Mongoose – 为客户端提供单个查询结果

我正在寻求实施一个解决scheme,我可以定期查询Mongoose数据库,然后将结果存储到我的客户端。 我假设这将减less我的用户拉动收集时的响应时间。 我试图通过创build一个空的全局对象,然后编写一个查询数据库的函数,然后将结果存储为前面提到的全局对象来实现这个计划。 在函数结束后,我将setTimeout设置为60秒,然后再次运行该函数。 当第一次运行应用程序时,我第一次调用这个函数。 然后,我设置我的客户端,以便当他们要求收集时,它会首先查看是否存在全局对象,如果是这样,则返回作为响应。 我想这会把我7-10秒的查询时间缩短到1秒以内。 在我的新手思维中,我认为Nodejs是“单线程”这样的东西可以工作得很好 – 但它似乎吃掉了我所有的RAM,并导致致命的错误。 我的思路是正确的,还是每次人们收集数据时都要查询数据库? 这是有问题的代码: var allLeads = {}; var getAllLeads = function(){ allLeads = {}; console.log('Getting All Leads…'); Lead.find().sort('-lastCalled').exec(function(err, leads) { if (err) { console.log('Error getting leads'); } else { allLeads = leads; } }); setTimeout(function(){ getAllLeads(); }, 60000); }; getAllLeads(); 提前感谢你的帮助。

在nodejs上的Sandbox JavaScript应用程序

是否有可能对运行在nodejs之上的JavaScript程序进行沙箱化,以便使用“process.hrtime()”报告的执行时间不会因执行而异?

我该如何提高MongoDB的批量性能?

我有这个对象与一些元数据和大量的项目。 我曾经用mongo来存储这个数据,并且通过$unwind数组来查询它。 但是,在极端情况下,arrays变得如此之大,以至于遇到了16MB的BSON限制。 所以我需要将数组的每个元素作为单独的文档存储。 为此,我需要将元数据添加到所有这些元数据,所以我可以找回它们。 build议我为此使用批量操作 。 但是,performance似乎很慢。 插入一个大文件几乎是瞬间的,这需要十秒钟 。 var bulk = col.initializeOrderedBulkOp(); var metaData = { hash : hash, date : timestamp, name : name }; // measure time here for (var i = 0, l = array.length; i < l; i++) { // 6000 items var item = array[i]; bulk.insert({ // Apparently, […]

Node.js Flame Graph note正常工作

我正在尝试在ubuntu 14.04上为node.js应用程序生成一个火焰图。 我使用这个指南(Brendan Gregg): http : //www.brendangregg.com/blog/2014-09-17/node-flame-graphs-on-linux.html 。 1)我运行我的node.js应用程序与一个web用户下的–perf-basic-prof ,并看到它在进程的临时文件夹中生成了一个perf映射文件。 2)一天之后,我尝试使用这些命令生成火焰graphics: $ sudo bash # perf record -F 99 -p <node_process_id> -g — sleep 30 # perf script > out.nodestacks01 # git clone –depth 1 http://github.com/brendangregg/FlameGraph # cd FlameGraph # ./stackcollapse-perf.pl < ../out.nodestacks01 | ./flamegraph.pl > ../out.nodestacks01.svg 它确实生成了一个火焰图,但看起来很奇怪,只有很less的条目,有些是未知的,看起来与代码中发生的事情很远。 为什么发生这种情况? 我在这里错过了什么? 它可能是相关的node.js运行承诺或发电机(我高度怀疑)。 难道是因为抽样是30秒,我的大部分活动大约在4小时前发生? 我会得到什么样的火焰图? 我需要做别的吗?

在节点> = 4.x中,伊斯坦布尔的性能很差

在节点4.x (和5.x)中运行伊斯坦布尔检测的JavaScript代码比在节点0.12.x上慢4倍。 具体来说,我有一个摩卡testing,需要约500毫秒完成非仪表代码。 相同的testing在节点0.12.x的检测代码上花费约5000毫秒。 同样的testing在节点5.x的检测代码上花费约20000毫秒。 在更高级的节点中性能如此糟糕的任何原因? 注意:为了隔离问题,我运行了istanbul instrument命令。 仪器需要1秒钟。 然后,我对仪表代码进行了Mochatesting, 没有生成伊斯坦布尔报告或检查报道 。

Visual Profiler for Node.js

我已经试过这么 多的节点分析器 ,我已经失去了计数。 我从来没有见过一个分析器给你这个 : 该图显示CPU(顶部和中心)和内存(底部)的秒用法。 我可以点击一个“框架”(一秒的红利)来查看在该框架上执行的function以及分配和释放的内存(GC'd)。 这是Adobe Scout for Flash / AS3。 我需要find一个鬼 (内存泄漏:),我已经成功地使用上述接口数百次,以消除不必要的分配,并debugging为什么内存不应该释放时,应该。 我如何find我的应用程序的哪一部分在视觉时间线上分配内存? 我需要一个时间表来具体查看我的应用程序的哪个部分正在分配内存以及为什么。 现在一切发生得如此之快我不能使用“目前在内存中的对象”面板做任何有用的事情。 比较“堆快照”比使用时间线更困难。 基于networking或应用程序是好的。 我使用Windows 7。