16岁上什么年级| 脾是起什么作用的| 喉咙干咳吃什么药| 什么叫甲状腺弥漫病变| 保家仙都有什么仙| 手震颤是什么原因引起的| 改良剂是什么| 时髦是什么意思| 一个三点水一个及念什么| 淀粉样变性是什么病| 布洛芬不能和什么一起吃| g6pd是检查什么的| 晟这个字读什么| 儿茶酚胺是什么| 佩戴狼牙有什么好处| 冬天吃什么| 五十坐地能吸土是什么意思| 叶酸有什么好处| 甘胆酸是查什么的| 如饥似渴是什么意思| 舍曲林是什么药| 什么的饭菜| 脾五行属什么| merry是什么意思| 双脚麻木是什么病的前兆| 骑马标志是什么牌子| 手脚冰凉什么原因| 麒麟飞到北极会变成什么| 舌尖发麻是什么原因引起的| 家里为什么有隐翅虫| 肝郁血虚吃什么中成药| 记忆力下降是什么原因引起的| 北京晚上有什么好玩的景点| 弱水三千是什么意思| 头发需要什么营养| 梦见很多蜘蛛是什么意思| 梦见前女友是什么预兆| 子宫直肠窝积液是什么意思| 口干口苦是什么原因| 牙膏洗脸有什么好处和坏处| 吃什么瘦肚子脂肪最快| 什么食物对眼睛视力好| 附件是什么| 血糖高什么不能吃| 什么样的伤口算开放性| 什么是骨折| 半夜容易醒是什么原因| 热水器什么牌子好| 一月八号是什么星座| 做梦掉粪坑什么征兆| 什么的山顶| 孕酮低吃什么补得快| 费气肿要吃什么药| 肌酐高不能吃什么| 强心剂是什么药| 八珍胶囊适合什么人吃| 为什么不能摸猫的肚子| rv医学上是什么意思| 二月十三是什么星座| 肝郁吃什么食物好| 黄芪和枸杞泡水喝有什么作用| 只羡鸳鸯不羡仙是什么意思| 芸豆长什么样子| 伪骨科是什么意思| 描述是什么意思| rush是什么| 云雾茶属于什么茶| 手术后吃什么最有营养| 膀胱钙化是什么意思| kj是什么意思| 臃肿是什么意思| 老鼠和什么属相最配对| 暴饮暴食容易得什么病| 连续打喷嚏是什么原因| 子宫切除对女人有什么影响| 什么动物的牙齿最多| 有鸟飞进屋是什么预兆| 心脏早博是什么意思| 孕酮低是什么原因造成的| 亥时是什么时候| 颇有是什么意思| 新生儿痤疮是什么引起的| 咳嗽痰中带血是什么原因| 唐伯虎属什么生肖| 人流后吃什么恢复快| 吊膀子是什么意思| 敏感肌肤用什么护肤品| 腹胀吃什么药| 七十岁是什么之年| 吃中药不能吃什么东西| 试管婴儿什么价格| 什么人靠别人的脑袋生活| 耳朵听不清楚是什么原因| z值是什么意思| 身体出汗是什么原因| 福建人喜欢吃什么| 举案齐眉是什么意思| 想吃辣是身体缺乏什么| 人参果吃了有什么好处| 水淀粉是什么| 大便暗红色是什么原因| 秀才相当于现在的什么学历| 高胆固醇血症是什么病| 耳廓有痣代表什么| 奥美拉唑什么时候吃最好| 肩袖损伤用什么药| 什么克金| 犯困是什么原因| 轻奢什么意思| 干咳嗓子痒吃什么药| 什么动物吃猫| 为什么会得抑郁症| 绿豆汤是什么颜色| 海澜之家是什么档次| 凝血高是什么原因| 皮包公司是什么意思| 只是女人容易一往情深是什么歌| 小孩晚上睡觉磨牙是什么原因| 槐花什么时候开花| 法兰克穆勒什么档次| pending是什么意思啊| 皮肤消炎用什么药最好| 气血不足什么原因引起的| 附属国是什么意思| 什么牌子的益生菌调理肠胃比较好| 鸟几念什么| 97年是什么年| 阴茎冰凉是什么原因| 张宇的老婆叫什么名字| 怡字属于五行属什么| mra检查是什么意思| 禳是什么意思| 办离婚证需要带什么证件| 冷藏是什么意思| 理性什么意思| 神龙见首不见尾是什么意思| 96年属什么的| 早上起床口臭是什么原因| 阴虚吃什么水果| 元气什么意思| 元朝是什么民族| 接骨木是什么| 猫抓病是什么病| 什么牙什么嘴| 淋巴肿了吃什么消炎药| 拉屎拉出血是什么原因| 脸色发黑发暗是什么原因| 舌头有问题看什么科| 猴子是什么动物| 邓紫棋和华晨宇什么关系| vivo是什么牌子的手机| 室上性心动过速是什么原因引起的| 一热就咳嗽是什么原因| 金刚杵是什么| 一什么白菜| 我知道你在想什么| 太阳穴长痘痘什么原因| 来大姨妈喝什么汤比较好| 肚脐眼左边疼是什么原因| 2018年生肖属什么| 54岁属什么的| acc是什么| 夏天吃姜有什么好处| 乳腺结节应该挂什么科| 肝内胆管结石吃什么药好| 同房后出血是什么原因| 任达华属什么生肖| 塑料袋是什么材质| 男人分手是什么感觉| 出淤泥而不染是什么意思| 1994年属什么| 湖南有什么好玩的| 儿童鼻炎挂什么科| 首重是什么意思| 女性下面长什么样| asmr是什么意思| 八方来财是什么意思| 气压是什么| 为什么感冒会全身酸痛| 争宠是什么意思| 高血压是什么症状| 吃什么补维生素D效果最好| 脱发用什么药最好| 肚子拉稀像水一样是什么情况| 鸭子什么意思| 不来事是什么原因| 蛛网膜囊肿是什么病| 赵本山什么时候死的| 空腹是什么意思| 百合与什么搭配最好| 奶篓子是什么意思| 的意思是什么| 嘎巴拉是什么| 花椒什么时候成熟| 看乳腺应该挂什么科| 小限是什么意思| 经常头疼什么原因| 乘载和核载是什么意思| 什么样的人容易得结石| 手掌心发红是什么原因| 牙龈经常发炎是什么原因| 心脏不好喝什么茶比较好| hm是什么| 虚岁是什么意思| 雌雄是什么意思| 耳朵后面痒是什么原因| 植发用什么头发| 呵呵是什么意思啊| 坚壁清野什么意思| 接骨木是什么| 吃什么都吐是什么原因| 毛主席女儿为什么姓李| 有冬瓜西瓜南瓜为什么没有北瓜| 慰安妇是什么| 胃幽门螺旋杆菌吃什么药| 一什么圆月| 中医为什么不让睡凉席| 玄关画挂什么图最好| 什么红酒好喝| 梦见自己离婚是什么预兆| 肾结水是什么原因造成的| 宋美龄为什么没有孩子| 属鸡在脖子上戴什么好| 有冬瓜西瓜南瓜为什么没有北瓜| 什么是象声词| 钠低是什么原因| onemore是什么牌子| 淋巴结用什么药效果好| 白斑不能吃什么| 攒是什么意思| 暂住证办理需要什么材料| 乌龟浮水是什么原因| 清晰是什么意思| 减肥期间适合吃什么| 大象灰配什么颜色好看| 1月23日是什么星座| 喝生鸡蛋有什么好处| 一饿就胃疼是什么原因| 例假少吃什么能让量多| 肺结核传染途径是什么| 鹌鹑蛋不能和什么一起吃| 吐血是什么原因引起的| sandals是什么意思| 布尔乔亚什么意思| 天道好轮回什么意思| 肌肉酸痛挂什么科| 老睡不醒是什么原因| 代沟是什么| as是什么病| 处女座前面是什么星座| o型血不能和什么血型的人生孩子| 黄油是用什么做的| 朱砂痣代表什么| 鸿字五行属什么| 肌肉酸痛是什么原因| 井泉水命什么意思| 早餐可以吃什么| 陌然是什么意思| 阳性阴性是什么意思| fda是什么意思| mep是什么意思| 奥美拉唑什么时候吃| 蚊虫叮咬涂什么药| 河汉是什么意思| 百度
Skip to content

面试官:Node性能如何进行监控以及优化??#173

@huihuiha

Description

@huihuiha

一、 是什么

Node作为一门服务端语言,性能方面尤为重要,其衡量指标一般有如下:

  • CPU
  • 内存
  • I/O
  • 网络

CPU

主要分成了两部分:

  • CPU负载:在某个时间段内,占用以及等待CPU的进程总数
  • CPU使用率:CPU时间占用状况,等于 1 - 空闲CPU时间(idle time) / CPU总时间

这两个指标都是用来评估系统当前CPU的繁忙程度的量化指标

Node应用一般不会消耗很多的CPU,如果CPU占用率高,则表明应用存在很多同步操作,导致异步任务回调被阻塞

内存指标

内存是一个非常容易量化的指标。 内存占用率是评判一个系统的内存瓶颈的常见指标。 对于Node来说,内部内存堆栈的使用状态也是一个可以量化的指标

// /app/lib/memory.js
const os = require('os');
// 获取当前Node内存堆栈情况
const { rss, heapUsed, heapTotal } = process.memoryUsage();
// 获取系统空闲内存
const sysFree = os.freemem();
// 获取系统总内存
const sysTotal = os.totalmem();

module.exports = {
  memory: () => {
    return {
      sys: 1 - sysFree / sysTotal,  // 系统内存占用率
      heap: heapUsed / headTotal,   // Node堆内存占用率
      node: rss / sysTotal,         // Node占用系统内存的比例
    }
  }
}
  • rss:表示node进程占用的内存总量。
  • heapTotal:表示堆内存的总量。
  • heapUsed:实际堆内存的使用量。
  • external :外部程序的内存使用量,包含Node核心的C++程序的内存使用量

Node中,一个进程的最大内存容量为1.5GB。因此我们需要减少内存泄露

磁盘 I/O

硬盘的 IO 开销是非常昂贵的,硬盘 IO 花费的 CPU 时钟周期是内存的 164000 倍

内存 IO 比磁盘 IO 快非常多,所以使用内存缓存数据是有效的优化方法。常用的工具如 redismemcached

并不是所有数据都需要缓存,访问频率高,生成代价比较高的才考虑是否缓存,也就是说影响你性能瓶颈的考虑去缓存,并且而且缓存还有缓存雪崩、缓存穿透等问题要解决

二、如何监控

关于性能方面的监控,一般情况都需要借助工具来实现

这里采用Easy-Monitor 2.0,其是轻量级的 Node.js 项目内核性能监控 + 分析工具,在默认模式下,只需要在项目入口文件 require 一次,无需改动任何业务代码即可开启内核级别的性能监控分析

使用方法如下:

在你的项目入口文件中按照如下方式引入,当然请传入你的项目名称:

const easyMonitor = require('easy-monitor');
easyMonitor('你的项目名称');

打开你的浏览器,访问 http://localhost:12333 ,即可看到进程界面

关于定制化开发、通用配置项以及如何动态更新配置项详见官方文档

三、如何优化

关于Node的性能优化的方式有:

  • 使用最新版本Node.js
  • 正确使用流 Stream
  • 代码层面优化
  • 内存管理优化

使用最新版本Node.js

每个版本的性能提升主要来自于两个方面:

  • V8 的版本更新
  • Node.js 内部代码的更新优化

正确使用流 Stream

Node中,很多对象都实现了流,对于一个大文件可以通过流的形式发送,不需要将其完全读入内存

const http = require('http');
const fs = require('fs');

// bad
http.createServer(function (req, res) {
    fs.readFile(__dirname + '/data.txt', function (err, data) {
        res.end(data);
    });
});

// good
http.createServer(function (req, res) {
    const stream = fs.createReadStream(__dirname + '/data.txt');
    stream.pipe(res);
});

代码层面优化

合并查询,将多次查询合并一次,减少数据库的查询次数

// bad
for user_id in userIds 
     let account = user_account.findOne(user_id)

// good
const user_account_map = {}   // 注意这个对象将会消耗大量内存。
user_account.find(user_id in user_ids).forEach(account){
    user_account_map[account.user_id] =  account
}
for user_id in userIds 
    var account = user_account_map[user_id]

内存管理优化

在 V8 中,主要将内存分为新生代和老生代两代:

  • 新生代:对象的存活时间较短。新生对象或只经过一次垃圾回收的对象
  • 老生代:对象存活时间较长。经历过一次或多次垃圾回收的对象

若新生代内存空间不够,直接分配到老生代

通过减少内存占用,可以提高服务器的性能。如果有内存泄露,也会导致大量的对象存储到老生代中,服务器性能会大大降低

如下面情况:

const buffer = fs.readFileSync(__dirname + '/source/index.htm');

app.use(
    mount('/', async (ctx) => {
        ctx.status = 200;
        ctx.type = 'html';
        ctx.body = buffer;
        leak.push(fs.readFileSync(__dirname + '/source/index.htm'));
    })
);

const leak = [];

leak的内存非常大,造成内存泄露,应当避免这样的操作,通过减少内存使用,是提高服务性能的手段之一

而节省内存最好的方式是使用池,其将频用、可复用对象存储起来,减少创建和销毁操作

例如有个图片请求接口,每次请求,都需要用到类。若每次都需要重新new这些类,并不是很合适,在大量请求时,频繁创建和销毁这些类,造成内存抖动

使用对象池的机制,对这种频繁需要创建和销毁的对象保存在一个对象池中。每次用到该对象时,就取对象池空闲的对象,并对它进行初始化操作,从而提高框架的性能

参考文献

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      满文军现在在干什么 吃什么补黄体酮最快 肺心病吃什么药 左耳疼痛什么原因引起 人黄是什么原因
      什么叫天干 喝葡萄汁有什么好处 04年属什么 fl是什么意思 紫苏长什么样子图片
      browser什么意思 白带多用什么药效果好 灰指甲是什么症状 发烧有什么症状 拜金是什么意思
      早泄吃什么好 什么什么斑斓 中医把脉能看出什么 一个日一个处一个口念什么 属虎男和什么属相最配
      男人脚底发热是什么病hcv8jop7ns0r.cn 肝脏的作用是什么xianpinbao.com plus什么意思hcv9jop8ns1r.cn 猴与什么属相相配最好hcv8jop2ns6r.cn 孕妇梦见洪水是什么意思jinxinzhichuang.com
      一个点是什么意思xinjiangjialails.com 没腿毛的男人代表什么hcv9jop3ns8r.cn 玉兰油属于什么档次hcv9jop0ns3r.cn 乙基麦芽酚是什么hcv8jop3ns7r.cn 为什么会有霉菌性阴道炎hcv9jop6ns5r.cn
      鼻基底填充用什么材料比较好hcv9jop2ns4r.cn 胃属什么五行hcv8jop3ns0r.cn 612是什么星座hcv8jop7ns5r.cn 罗姓男孩取什么名字好hcv8jop5ns9r.cn 女人性冷淡吃什么药效果好hcv7jop6ns1r.cn
      气血不足什么原因引起的hcv9jop1ns1r.cn 濡湿是什么意思hcv8jop4ns2r.cn 什么花草hcv9jop0ns1r.cn 心气虚吃什么食物补hcv9jop0ns4r.cn 什么是卵巢囊肿fenrenren.com
      百度