当前位置: 首页 > 后端技术 > Node.js

qcon线节点总结

时间:2023-04-03 17:17:11 Node.js

前后端业务:前端用于展示交互;后台功能服务数据一致性等环境:前台浏览器webview单机;后端集群高并发思维差异:前端快速开发、视觉效果快速渲染等;返回服务稳定性、性能、内存泄漏等V8内存介绍首先可以通过memoryUsage查看node进程的使用情况。具体介绍如下:process.memoryUsage();查看node进程内存占用的单位是bytes{rss:20725760,(residentsetsize)进程常驻内存heapTotal:7376896,申请堆内存heapUsed:3881280,当前使用堆内存external:8772,c++内存占用,managedbyv8}上面的api用法我写了一个相关的例子letshowMem=function(){varmem=process.memoryUsage();varformat=function(bytes){return(bytes/1024/1024).toFixed(2)+'MB';}console.log('Process:heapTotal'+format(mem.heapTotal)+'heapUsed'+format(mem.heapUsed)+'rss'+format(mem.rss));console.log("----------------------------------")}varuseMem=function(){变量大小=200*1024*1024;//每次构造200MB的对象varbuffer=newBuffer(size);for(vari=0;ivoidinit(){intarr[5]={};for(inti=0;i<5;i++){arr[i]=i;}}voidtest(){intarr[5];for(inti=0;i<5;i++){printf("%d\n",arr[i]);}}intmain(intargc,charconst*argv[]){初始化();测试();返回0;}//01234#java代码publicclassTest{publicstaticvoidmain(String[]args){init();测试();}publicstaticvoidinit(){int[]arr=newint[]{0,1,2,3,4};//for(inti=0;i<5;i++){//System.out.println(arr[i]);//}}publicstaticvoidtest(){int[]arr=newint[5];for(inti=0;i<5;i++){System.out.println(arr[i]);}}}//00000上面的例子说明c语言栈执行过程中,函数执行栈释放,如果程序员不注意释放过程,会出现一些问题,但是js而java不会,因为内存是自动分配的,垃圾是自动回收的,不需要考虑脏数据擦除。内存泄漏首先什么是内存泄漏?应用程序不再使用对象,但垃圾收集器无法删除它们,因为它们正在被引用。如果node进程运行时垃圾没有回收,那肯定是内存泄漏。关于这个定义的讨论是在节点进程退出或崩溃之后。我的理解是,如果有一些内存比如共享内存(用于进程间通信),如果不释放,仍然是内存泄漏,而且内存泄漏不仅仅是进程级别的。内存泄漏有多种原因。ppt里有的,就不一一列举了。分享过程中,有同学提出了一个问题,为什么使用exports会导致泄露。我印象深刻。可能我当时没有解释清楚。下面记下具体的例子进行详细的解释。//A.jsvarleakAry=[];exports.leak=function(){leakAry.push('leak'+"gcy"+newDate());}//B.jsvarobj=require('./a');for(vari=0;i<10;i++){obj.leak();}在node中,为了加快模块访问速度,所有模块都会被编译缓存。上述代码泄露的原因是模块。缓存的局部变量被重复访问,因为没有初始化,导致内存占用增加。其次,平时如何定位内存泄漏的具体问题。varhttp=require('http');varheapdum=require('heapdump');varleakArray=[];varleak=function(){for(vari=0;i<100000;i++){leakArray.push("leak"+Math.random());}};vari=0;http.createServer(function(req,res){leak();//泄漏触发位置i++;res.writeHead(200,{'Content-Type':'text/plain'});res.end("helloworldgcy"+i);}).listen(1337);console.log(process.pid);console.log("serverstartgcy");-------------------------------------------------------------for((i=1;i<=10000;i++));docurl-v--header"Connection:keep-alive""http://127.0.0.1:1337/"做Batch100和10000个请求,记录heapdump镜像,通过查看变化比较大的地方比较视图,通过分析定位具体泄漏位置。、字符串、连接字符串和数组对象增长。点击查看对象的引用,可以发现原因是执行了leak,leakArray没有初始化,所以里面的字符串没有被清除,导致内存泄漏。关于异步处理的问题:不适合处理复杂的状态机。解决方案:采用队列结构实现可控的异步并发。对于这一点的理解和分享,有人持异议。我的理解是逻辑上有大量的promise需要处理。一旦逻辑多了,我们就没法控制了。我们无法从宏观上了解具体的执行情况。但是通过队列,在高并发请求下,可以通过队列管理来管理大量的状态机promise。我们可以控制消费哪些,可以统计状态机所在的某个进程所占的比例。一旦我们有了这些统计信息,我们就可以进行相应的处理。为证。什么是弱计算IO密集型?什么是控制器繁忙的CPU密集型?可以使用node生成分析弱计算的profile文件,然后通过chrome或者webstrome自带的v8profiling进行分析,可以得到一系列的函数执行时间统计和调用栈过程耗时统计,根据这些信息,我们在做相应的优化。图中显示的是示例test2的结果。deploychild_process//一般情况,仅作为用法示例varfork=require('child_process').fork;varcpus=require('os').cpus();for(vari=0;i