1. 为什么会出现EMFILE,too many open files?
对文件系统进行大量并发调用,操作系统的文件描述符数量会被瞬间用光,抛出EMFILE,too many open files。
异步I/O和同步I/O的显著差距:同步I/O因为每个I/O都是彼此阻塞的,在循环体中,总是一个接着一个调用,不会出现耗用文件描述符太多的情况,同时性能也是低下的;
对于异步I/O,虽然并发容易实现,但是还是需要给予一定的过载保护,防止过分压榨底层系统的性能。
解决方案
1.1 bagpipe解决方案
通过一个队列来控制并发量,如果当前活跃(指调用发起但未执行回调)的异步调用量小于限定值,从队列中取出执行。
如果活跃调用达到限定值,调用暂时存放在队列中。
每个异步调用结束时,从队列中取出新的异步调用执行。
bagpipe的API主要暴露了一个push()方法和一个full事件,示例代码如下:
var Bagpipe = require('bagpipe');
// 设定最大并发数为10
var bagpipe = new Bagpipe(10);
for (var i=0; i<100; i++) {
bagpipe.push(async, function () {
// 异步回调执行
});
}
bagpipe.on('full', function (length) {
console.warn('队列拥堵,目前队列长度为:' + l