node 进程管理问题?
发布于 10 年前 作者 liangwenle 4358 次浏览 最后一次编辑是 8 年前 来自 问答

本人写了一个爬虫,每天定时爬取指定网站的内容,挺方便的。问题来了:我的爬虫运行几天感觉服务器会好卡, top看它耗去的内存,居然跟一个b2b网站耗的内存差不多,后来有人跟我说用child.process的exec执行,这样一个任务结束时,会释放内存。 我对这方面不太了解,希望大牛指点一下,顺便分享一下大家用什么方法来处理这些问题的(进程、内存、回收等)。有图更好。谢谢!!

3 回复

node闭包很容易内存泄露, 仔细检查下?

首先检查一下是否有内存泄露,也就是说是否保持着一些随时间增加的数据的引用,导致这部分内存没法被垃圾回收释放。 当然,一般这种情况都是很隐蔽不易发现的,所以一个简单的办法就是用 forever, supervisor 这类进程管理工具运行,然后在程序中加一句 setTimeout(process.exit, 3600 * 1000) 定时重启。

谢谢大牛的意见。 求讨伐!! 我用 pm2 start do_timer.js 启动

do_timer.js 文件 require(‘iced-coffee-script’).register(); require(’./timer.iced’);

timer.iced 文件 later = require “later” later.date.localTime()

Health = require './iced.crawler/health'
health_composite = [{dw: [1], h: [3], m: [1]}]
health_sched = {schedules:health_composite}
console.log "health:"+JSON.stringify(health_sched)

t = later.setInterval ->
await health.do_page health_url, defer()
, health_sched

health.iced 文件

do_page: (page_url, cb)->
	console.log '\n进入do_page,获取单个 :', page_url

	await read page_url,
		headers:
			cookie:"bdshare_firstime=123abc; "
	, defer err, article, meta
	console.error err if err

	await jsdom.env article.html, [jquery], defer errors, window
	$ = window.$

	for a ,i in Array::slice.apply $(".new_article li a")
		item_url = $(a).attr('href')
		console.log item_url
		await [@fetch_item](/user/fetch_item) item_url, defer()
	cb()
回到顶部