今天有人问我一个问题,做离线爬虫服务,一次性发出 10000 以上的请求去拉取数据,会返回很多失败。
这是为什么?
于是写个两段代码实践了下。
其中一段代码就是起一个服务提供一个接口,同时记录下 libuv I/O 的 activeHandles 和 activeRequests.
activeHandles 是指事件循环队列中未处理的任务数,
activeRequests 是指未处理的请求数。
server.js另一段代码如下,
sendRequest.js果然报很多错误,
上网查下 EMFILE 错误,是因为打开了太多文件描述符,文件描述符包括磁盘文件,命名管道,网络套接字和由所有进程打开的设备。
解决方法一方面是将系统文件描述符的上限扩大,另一方面是限制并发数。
参考资料:
https://stackoverflow.com/questions/19981065/nodejs-error-emfile-too-many-open-files-on-mac-os
http://landcareweb.com/questions/7995/node-jszhong-de-lian-jie-emfile-cuo-wu
网友评论