NodeJS异步IO原理浅析及优化方案

NodeJS项目架构与优化 - 图1

  1. CPU时钟
  2. 处理器
  3. 操作系统

node异步实现

特殊api

  1. setTimeout和setInterval
  2. process.nextTick()
  3. setImmediate() 比 process.nextTick() 优先级低
  4. sleep

函数式编程在Node中的应用

常用的Node控制异步技术手段
1.Step、wind(提供等待的异步库)、Bigpipe、Q.js
2.Async、Await
3.Promise/Defferred是一种先执行异步调用,延迟传递的处理方式。Promise是
高级接口,事件是低级接口。低级接口可以构建更多复杂的场景,高级接口一
旦定义,不太容易变化,不再有低级接口的灵活性,但对于解决问题非常有效
4.由于Node基于V8的原因,目前还不支持协程。协程不是进程或线程,其执行
过程更类似于子例程,或者说不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我
们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受
系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由
当前协程切换到其他协程由当前协程来控制。

NodeJS内存管理机制及内存优化

V8垃圾回收机制
Node使用JavaScript在服务端操作大内存对象受到了一定的限制(堆
区),64位系统下约为1.4GB,栈区32位操作系统下是0.7G.
新生代64位是32M 32位是16M
node —max-new-space-size app.js:
-max-old-space-size app.js
Process.memoryUsage->rss、heaptTotal、heapUsed
V8的垃圾回收策略主要基于分代式垃圾回收机制。在自动垃圾回收
的演变过程中,人们发现没有一种垃圾回收算法能够胜任所有场景。
V8中内存分为新生代和老生代两代。新生代为存活时间较短对象,
老生代中为存活时间较长的对象。
一句话表示:小孩子尽管玩,到处丢东西大人收

Scavenge算法

Mark-Sweep & Mark-compact

何时启动GC?

引用计数DEMO(快照查看)

常见内存泄露问题
Case1:无限制增长的数组
Case2:无限制设置属性和值
Case3:任何模块内的私有变量和方法均是永驻
内存的 a = null
Case4: 大循环,无GC机会

内存泄露分析
node-inspector
console.log(“Server PID”, process.pid);
top -pid 2322
sudo node —inspect app.js
while true;do curl “http://localhost:1337/“; done

大规模Node站点结构原理分析


MVC框架

几种常见架构

服务器集群管理与Node集群的应用

前端工程化的搭载动态文件的MAP分析压缩打
包合并至CDN
单测、压测 性能分析工具发现Bug
编写nginx-conf实现负载均衡和反向代理
PM2启动应用程序小流量灰度上线,修复BUG
上线前的不眠夜,你见过凌晨5点的北京么?

多线程
Master进程均为主进程,Fork可以创造主从进程。
通过child_process可以和NET模块组合,可以创建多个线程并监
听统一端口。通过句柄传递完成自动重启、发射自杀信号、
限量重启、负载均衡。
Node默认的机制是采用操作系统的抢占式策略。闲着的进程争
抢任务,但是会造成CPU闲置的IO暂时并未闲置。Node后来引
入了Round-Robin机制,也叫轮叫调度。主进程接受任务,在发
每个子进程做好自己的事,然后通过进程间通信来将他们连
接起来。这符合Unix的设计理念,每个进程只做一件事,并做
好。将复杂分解为简单,将简单组合成强大

PM2
pm2 是一个带有负载均衡功能的Node应用的进程管理器.
当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,
0秒的重载。
1.内建负载均衡(使用Node cluster 集群模块)
2.后台运行
3.0秒停机重载
4.具有Ubuntu和CentOS 的启动脚本
5.停止不稳定的进程(避免无限循环)
6.控制台检测
7.提供 HTTP API
8.远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )
测试过Nodejs v0.11 v0.10 v0.8版本,兼容CoffeeScript,基于Linux 和MacOS

Node站点真身