Nodejs 程序的占用请教下

发布于 1周前 作者 yuanlaile 来自 nodejs/Nestjs

Nodejs 程序的占用请教下

最近重拾 nodejs, 照抄了个简单的签到程序, 挂在服务器上用, 使用 pm2 启动, 但发现为啥内存占用那么高 就这和 hello word 一样简单的代码, 显示内存占用 63.6mb, 到底是我写的问题, 还是什么原因. 看了眼 docker 里跑的其他几个签到服务, 大多在十几 M 左右, 用 chatgpt 把这段代码转下, 同样用 pm2 启动, 也是占用非常少.

const schedule = require('node-schedule')
const axios = require('axios')
const profiles = require('./config')

const getNowTime = () => {
  return new Date()['toLocaleDateString']()
}

const request = () => {
  profiles.forEach(async item => {
    const {url, headers} = item
    console.log(`\n\n------${getNowTime()} - ${url}:开始签到------\n`)

    const res = await axios({
      url,
      method: 'post',
      headers,
    })

    if (res && res.data) {
      console.log(`------ ${getNowTime()} 签到成功 ------\n`)
      console.log(JSON.stringify(res.data))
    } else {
      console.log(`------ ${getNowTime()} 签到失败 ------\n`)
      console.log(res)
    }
  })
}

const checkin = () => {
  schedule.scheduleJob('0 0 7 * * *', () => {
    setTimeout(() => {
      request()
    }, Math.random() * 10 * 60 * 1000)
  })
}

console.log(`开始执行任务-${getNowTime()}`)
checkin()

3 回复

发完就发现自己写了个 bug, 不该用 forEach 的


感觉自己犯蠢了, 写个最简单的 setInterval + console.log()不就可以验证了吗?
51.9mb

v8.getHeapStatistics() 打印

{
total_heap_size: 7430144,
total_heap_size_executable: 524288,
total_physical_size: 6549504,
total_available_size: 4339934392,
used_heap_size: 4521952,
heap_size_limit: 4345298944,
malloced_memory: 139368,
peak_malloced_memory: 246160,
does_zap_garbage: 0,
number_of_native_contexts: 1,
number_of_detached_contexts: 0,
total_global_handles_size: 8192,
used_global_handles_size: 2368,
external_memory: 408283
}

关于 Node.js 程序的内存和CPU占用问题,这里有几个关键的方面需要注意和优化:

  1. 内存管理: Node.js 使用 V8 引擎,它有自动垃圾回收机制。但不当的内存使用(如全局变量、未释放的回调函数等)会导致内存泄漏。

    // 避免全局变量
    function processData(data) {
        let temp = data; // 使用局部变量
        // ...处理数据
    }
    
  2. 事件循环: Node.js 是基于事件驱动的,确保你的异步操作(如文件读写、网络请求)不会阻塞事件循环。

    const fs = require('fs').promises;
    
    async function readFile() {
        try {
            const data = await fs.readFile('example.txt', 'utf8');
            console.log(data);
        } catch (err) {
            console.error(err);
        }
    }
    
    readFile();
    
  3. 性能监控: 使用工具如 Node.js 自带的 --inspect 标志、clinicpm2 监控内存和CPU使用情况。

    node --inspect your_script.js
    
  4. 优化算法和数据结构: 确保你的算法和数据结构是高效的。例如,对于大量数据处理,使用合适的数据结构(如链表、哈希表)和算法(如快速排序)。

  5. 集群模式: 对于CPU密集型任务,可以使用 Node.js 的 cluster 模块来充分利用多核CPU。

    const cluster = require('cluster');
    const numCPUs = require('os').cpus().length;
    
    if (cluster.isMaster) {
        for (let i = 0; i < numCPUs; i++) {
            cluster.fork();
        }
    } else {
        // 工作进程代码
        require('./your_script.js');
    }
    

通过以上方法,你可以有效地管理和优化 Node.js 程序的资源占用。

回到顶部