Nodejs 程序的占用请教下
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()
发完就发现自己写了个 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占用问题,这里有几个关键的方面需要注意和优化:
-
内存管理: Node.js 使用 V8 引擎,它有自动垃圾回收机制。但不当的内存使用(如全局变量、未释放的回调函数等)会导致内存泄漏。
// 避免全局变量 function processData(data) { let temp = data; // 使用局部变量 // ...处理数据 }
-
事件循环: 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();
-
性能监控: 使用工具如
Node.js
自带的--inspect
标志、clinic
或pm2
监控内存和CPU使用情况。node --inspect your_script.js
-
优化算法和数据结构: 确保你的算法和数据结构是高效的。例如,对于大量数据处理,使用合适的数据结构(如链表、哈希表)和算法(如快速排序)。
-
集群模式: 对于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 程序的资源占用。