首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >千次并发请求-EAI_ of /ECONNRESET错误

千次并发请求-EAI_ of /ECONNRESET错误
EN

Stack Overflow用户
提问于 2016-04-10 17:52:01
回答 1查看 1.4K关注 0票数 1

我需要在一个小时内执行一百万次API调用(服务器可以处理这么多通信量),为此,我使用节点并行运行多个请求,但是当我试图运行~1000个并发请求时,我仍然得到以下错误:

EAI_AGAIN

代码语言:javascript
复制
{ [Error: getaddrinfo EAI_AGAIN google.com:80]
  code: 'EAI_AGAIN',
  errno: 'EAI_AGAIN',
  syscall: 'getaddrinfo',
  hostname: 'google.com',
  host: 'google.com',
  port: 80 }

ECONNRESET

代码语言:javascript
复制
{
    [Error: read ECONNRESET] code: 'ECONNRESET',
    errno: 'ECONNRESET',
    syscall: 'read'
}

如果不将请求减少到500,我如何才能防止这种情况发生呢?

这里有一个代码示例,它在每次运行500个请求时运行得很好,但是当限制超过1000时就失败了。(您的限制可能有所不同)。

代码语言:javascript
复制
"use strict";
const http = require('http');
http.globalAgent.maxSockets = Infinity;
const async = require('async');
const request = require("request");

let success = 0;
let error = 0;

function iterateAsync() {
    let rows = [];
    for (let i = 0; i < 500; i++) {
        rows.push(i);
    }

    console.time("Requests");
    async.each(
        rows, 
        (item, callback) => get(callback), 
        (err) => {
            console.log("Failed: " + error);
            console.log("Success: " + success);
            console.timeEnd("Requests");
    });
}


function get(callback) {

    request("http://example.com", (err, response, body) => {
        if (err) {
            console.log(err);
            error++;
            return callback();
        }

        success++;
        callback();
    });
}

iterateAsync();

我添加了http.globalAgent.maxSockets = Infinity;,尽管它是默认值。

500请求

1000请求

相关信息:

我正在ubuntu14.04和15.04上运行测试,我在/etc/sysctl.conf中修改了file-maxtcp_fin_timeouttcp_tw_reuseip_local_port_range默认值,如本帖子所述

  • 文件-max: 100000
  • tcp_fin_timeout: 15
  • tcp_tw_reuse: 1
  • ip_local_port_range: 10000 65000

在/etc/security/ lines s.conf中添加了以下行

代码语言:javascript
复制
*     soft    nofile          100000
*     hard    nofile          100000

有了这个值,我仍然会得到错误。

我读过其他类似的文章:

有什么方法可以知道系统可以管理的并发请求的确切数量吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-20 00:20:32

下面是我如何在@jfriend00输入之后解决这个问题。

我使用dns.resolve4解析主机IP地址,然后使用IP执行请求,这样错误就消失了,我可以在更短的时间内执行更多的请求。

代码语言:javascript
复制
"use strict";

const dns = require("dns");
const http = require('http');

http.globalAgent.maxSockets = Infinity;

const async = require('async');
const request = require("request");

let success = 0;
let error = 0;

function iterateAsync() {
    let rows = [];
    for (let i = 0; i < 500; i++) {
        rows.push(i);
    }

    console.time("Requests");

    dns.resolve4("example.com", (err, addresses) =>{ //Resolve host and obtain IP address

        if(err) //Handle error
            return false;

        async.each(
            rows,
            (item, callback) => get(`http://${addresses[0]}`, callback),
            (err) => {
                console.log("Failed: " + error);
                console.log("Success: " + success);
                console.timeEnd("Requests");
            });

    });


}

function get(host, callback) {

    request(host, (err, response, body) => {
        if (err) {
            console.log(err);
            error++;
            return callback();
        }

        success++;
        callback();
    });
}


//Start requests
iterateAsync();

输出:

代码语言:javascript
复制
Failed: 0
Success: 500
Requests: 6295.799ms
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36533349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档