gpt4 book ai didi

linux - 千个并发请求 - EAI_AGAIN/ECONNRESET 错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:53:07 25 4
gpt4 key购买 nike

我需要在一个小时内执行一百万次 API 调用(服务器可以处理这么多流量),为此,我使用 Node 并行运行多个请求,但是当我尝试运行约 1000 个并发请求时我不断收到这些错误:

EAI_AGAIN

{ [Error: getaddrinfo EAI_AGAIN google.com:80]
code: 'EAI_AGAIN',
errno: 'EAI_AGAIN',
syscall: 'getaddrinfo',
hostname: 'google.com',
host: 'google.com',
port: 80 }

ECONN复位

{
[Error: read ECONNRESET] code: 'ECONNRESET',
errno: 'ECONNRESET',
syscall: 'read'
}

如何在不将请求减少到 500 的情况下防止这种情况发生?

以下代码示例在一次运行 500 个请求时完美运行,但在限制超过 1000 时失败。(您的限制可能不同)。

"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 个请求

enter image description here

1000 个请求

enter image description here

附加信息:

我在 ubuntu 14.04 和 15.04 上运行测试,我修改了 file-maxtcp_fin_timeouttcp_tw_reuseip_local_port_range 默认值在 /etc/sysctl.conf 中,如本 post 中所述

  • 最大文件数: 100000
  • tcp_fin_timeout: 15
  • tcp_tw_reuse: 1
  • ip_local_port_range: 10000 65000

在/etc/security/limits.conf 中添加了以下几行

*     soft    nofile          100000
* hard nofile 100000

使用这个值,我仍然收到错误。

我已经阅读了所有其他类似的帖子:

有没有办法知道我的系统可以管理的并发请求的确切数量?

最佳答案

这是我根据@jfriend00 的输入解决它的方法。

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

"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();

输出:

Failed: 0
Success: 500
Requests: 6295.799ms

关于linux - 千个并发请求 - EAI_AGAIN/ECONNRESET 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36533349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com