![]() | 1 jiangzhuo 2018-05-22 21:25:18 +08:00 via iPhone 能上生产服务器的话,看看当前堆栈不就好了 |
![]() | 2 Enivel 2018-05-22 21:26:01 +08:00 via iPhone 同遇到 |
![]() | 3 airyland 2018-05-22 21:43:24 +08:00 如果暂时不能确定到具体问题,可以在一个或者多个抓取任务结束后,直接 process.exit(1),pm2 会自动重启,还也可以定义 restart delay。 |
4 dreamer2020 OP @jiangzhuo 弱问一下,怎么样查看当前状况下的堆栈啊? |
![]() | 5 jiangzhuo 2018-05-22 21:45:14 +08:00 via iPhone @dreamer2020 就是平时调试用的那些工具的 pstack 啊 strace 啊找到问题再 gdb 啊 |
6 dreamer2020 OP @jiangzhuo 哦,明白了。感谢! |
7 dreamer2020 OP @airyland 这确实是一个当前的解决办法! |
8 gabon 2018-05-22 22:00:47 +08:00 via Android 死锁? |
![]() | 9 whypool 2018-05-22 22:06:31 +08:00 ![]() 遇到过,解决如下: 1,主动释放内存,虽然会自动 gc,但是爬取很快的时候,内存直接飙到 2G+,然后直接卡死 2,爬取频率,不要用阻塞的迭代,比如 for map each 什么的,如果有迭代最好用递归,放 settimeout 延迟执行 目前爬取了某云歌曲 80w+,内存占用稳定 90M,运行一个多月了 |
![]() | 10 ETiV 2018-05-22 23:22:05 +08:00 pm2 start 命令前加「 DEBUG=*」,看有没有输出 |
![]() | 12 shiny 2018-05-22 23:28:24 +08:00 分享下我的经验: 使用 eggjs 的 schedule 设置定时任务,使 Kue 或者 async.js 创建队列,设置好并发数,控制进队列的数量(比如用数据库储存任务,分批读取送进队列抓取),内存和 CPU 使用非常稳定。有问题建议使用 alinode 跟踪诊断。 |
![]() | 13 LeungJZ 2018-05-22 23:35:38 +08:00 我也遇到了。 我的问题:抓取数据后,更新数据库( mongodb,bulkWrite 更新),更新时长 12000 个文档需要 60000ms。 最后解决办法:使用 egg.js 的定时任务和 mongodb 的插件,更新方式是先查询是否存在,存在的一个个更新,save,不存在的批量插入,insertAll。12000 个文档耗时 1s 不到。 服务器:2C4G。 |
![]() | 14 qfdk PRO 你 mongo 插了多少数据? |
15 dreamer2020 OP @whypool 内存这个问题之前我也注意到了,确实需要释放,我现在最多是 300M 左右。 迭代用得比较多,主要是 for,用了 async/await 控制异步,用 Promise.map 做了多并发。大佬说的递归,应该是在函数里面使用 setTimeout 延迟调用自己吧? 另外,关于 Promise.map 有什么改进建议么? |
16 dreamer2020 OP @gabon node 不是单线程的么?没有考虑过锁的问题 |
17 dreamer2020 OP @qfdk 一次最多会塞 4 万条数据 |