假设硬件具有无限的性能,Linux机箱是否支持> 65536个开放的TCP连接?
据我所知,短暂端口的数量(<65536)限制了从一个本地IP到一个远程IP上的一个端口的连接数.
元组(本地ip,本地端口,远程ip,远程端口)是唯一定义TCP连接的东西; 这是否意味着如果这些参数中有多个是免费的,则可以支持超过65K的连接.例如,从多个本地IP连接到多个远程主机上的单个端口号.
系统中还有另外16位的限制吗?或许文件描述符的数量?
我有一个非常简单的程序,在5分钟内编写,打开一个服务器套接字并循环遍历请求,并将发送给它的字节打印到屏幕.
然后我尝试对可以使用多少个连接进行基准测试,以试图找出我可以用这个程序支持多少并发用户.
在另一台机器上(它们之间的网络没有饱和)我创建了一个简单的程序,它进入循环并连接到服务器机器并发送字节"hello world".
当循环为1000-3000时,客户端完成所有发送的请求.当循环超过5000时,在完成第一个X个请求后开始超时.为什么是这样?我确保在循环中关闭我的套接字.
你能在一段时间内创建这么多连接吗?
这个限制是否仅适用于同一台机器,我不必担心生产中5000多个请求都来自不同的机器?
我们有一个node.js Web服务器,它向外部API发出一些传出的http请求.它使用dokku在docker中运行.
经过一段时间的加载(30req/s)后,这些传出请求不再得到响应.
这是我用常量req/s测试时的图表:
incoming并且outgoing是并发请求的数量(不是初始化请求的数量).(在图表中很难看到,但每次约10次请求时它相当稳定.)
response time仅适用于外部请求.你可以清楚地看到他们突然失败了(达到1000毫秒超时).
我们发送的req/s越多,我们遇到这个问题的速度就越快,所以我们必须有一些限制,我们越来越接近每个请求.
我netstat -ant | tail -n +3 | wc -l在主机上用来获取开放连接的数量,但它只有~450(大多数TIME_WAIT).这不应该达到套接字限制.我们也没有达到任何RAM或CPU限制.
我也尝试在docker之外的同一台机器上运行相同的应用程序,它只发生在docker中.
我正遭受臭名昭着npm install(更新)悬挂问题的困扰.
到目前为止,我发现了以下食谱:
npm cache cleannpm config set registry http://registry.npmjs.org/--loglevel=verbose旗帜npm install但它仍然悬而未决.它挂起的位置似乎是随机的.它可以
npm verb get saving gulp-traceur to /home/me/.npm/registry.npmjs.org/gulp-traceur/.cache.json; 或者在安装npm verb afterAdd /home/me/.npm/q/0.9.7/package/package.json下载的最后一个包时非常随机.
版本是:
npm info使用npm@2.7.5 npm info使用node@v0.12.0
所以问题是我能做些什么吗?
使用Node.js通过HTTP请求查询某些公共API.因此,我正在使用该request模块.我正在测量我的应用程序中的响应时间,并看到我的应用程序从API查询返回的结果比通过curl或浏览器中的"直接"请求慢2-3倍.此外,我注意到与启用HTTPS的服务的连接通常比纯HTTP服务更长,但这可能是巧合.
我试图优化我的request选择,但无济于事.例如,我查询
https://www.linkedin.com/countserv/count/share?url=http%3A%2F%2Fwww.google.com%2F&lang=en_US
我正在使用request.defaults设置所有请求的总体默认值:
var baseRequest = request.defaults({
pool: {maxSockets: Infinity},
jar: true,
json: true,
timeout: 5000,
gzip: true,
headers: {
'Content-Type': 'application/json'
}
});
Run Code Online (Sandbox Code Playgroud)
实际请求是通过
...
var start = new Date().getTime();
var options = {
url: 'https://www.linkedin.com/countserv/count/share?url=http%3A%2F%2Fwww.google.com%2F&lang=en_US',
method: 'GET'
};
baseRequest(options, function(error, response, body) {
if (error) {
console.log(error);
} else {
console.log((new Date().getTime()-start) + ": " + response.statusCode);
}
});
Run Code Online (Sandbox Code Playgroud)
有人看到优化潜力吗?我做错了什么吗?提前感谢任何建议!
我正在研究在带有4G内存的Ubuntu机器上运行的Python应用程序的问题.该工具将用于审核服务器(我们更喜欢使用自己的工具).它使用线程连接到许多服务器,并且许多TCP连接失败.但是,如果我在开始每个线程之间添加1秒的延迟,那么大多数连接都会成功.我用这个简单的脚本来调查可能发生的事情:
#!/usr/bin/python
import sys
import socket
import threading
import time
class Scanner(threading.Thread):
def __init__(self, host, port):
threading.Thread.__init__(self)
self.host = host
self.port = port
self.status = ""
def run(self):
self.sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sk.settimeout(20)
try:
self.sk.connect((self.host, self.port))
except Exception, err:
self.status = str(err)
else:
self.status = "connected"
finally:
self.sk.close()
def get_hostnames_list(filename):
return open(filename).read().splitlines()
if (__name__ == "__main__"):
hostnames_file = sys.argv[1]
hosts_list = get_hostnames_list(hostnames_file)
threads = []
for host in hosts_list:
#time.sleep(1)
thread = Scanner(host, 443)
threads.append(thread)
thread.start()
for thread in threads: …Run Code Online (Sandbox Code Playgroud) 我正在使用rest-client来POST一个非常慢的Web服务.我设置timeout为600秒,我已经确认它正在传递给Net :: HTTP @read_timeout和@open_timeout.
但是,大约两分钟后,我得到一个低级超时错误,Errno::ETIMEDOUT: Connection timed out - connect(2):
回溯的相关部分是
Operation timed out - connect(2) for [myhost] port [myport]
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `initialize'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `open'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in `block in connect'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:88:in `block in timeout'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:98:in `call'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/timeout.rb:98:in `timeout'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:878:in `connect'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:863:in `do_start'
/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:852:in `start'
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:766:in `transmit'
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:215:in `execute'
/Users/dmoles/.rvm/gems/ruby-2.2.5/gems/rest-client-2.0.0/lib/restclient/request.rb:52:in `execute'
Run Code Online (Sandbox Code Playgroud)
看起来抛出错误的代码行是
TCPSocket.open(conn_address, conn_port, @local_host, @local_port)
Run Code Online (Sandbox Code Playgroud)
好像底层connect(2)系统调用的超时时间大约是两分钟,而传递给Net :: HTTP的超时参数只能缩短它,而不能延长它.有没有办法修改套接字参数来设置更长的超时?
编辑添加:这似乎只是我们的AWS Linux服务器上的问题 - 在我的MacOS开发机器上,十分钟超时工作.我假设connect()MacOS/BSD上的默认超时时间更长,但我真的不知道.
我有 3 个 Nodejs 应用程序在带有 Nginx 反向代理的 GCP 计算引擎实例(2cpu、2GB 内存、ubuntu 20.04)上运行。其中之一是 socket.io 聊天服务器。socket.io 应用程序@socket.io/cluster-adapter使用所有可用的 CPU 核心。\n我按照本教程更新了 Linux 设置以获得最大连接数。这是命令的输出ulimit,
core file size (blocks, -c) 0\ndata seg size (kbytes, -d) unlimited\nscheduling priority (-e) 0\nfile size (blocks, -f) unlimited\npending signals (-i) 7856\nmax locked memory (kbytes, -l) 65536\nmax memory size (kbytes, -m) unlimited\nopen files (-n) 500000\npipe size (512 bytes, -p) 8\nPOSIX message queues (bytes, -q) 819200\nreal-time priority (-r) 0\nstack size (kbytes, -s) 8192\ncpu time (seconds, -t) unlimited\nmax …Run Code Online (Sandbox Code Playgroud) 我正在建立一个面向服务的Web应用程序.UI部分(Web应用程序)正在使用我正在编码的REST Web服务.所以我在服务器端和客户端都有.
我只是想知道在这种情况下设置HTTP keep-alive是否有意义.如果是的话,我很好奇为什么.
提前致谢.
我将开发一个TCP服务器应用程序.我在"选择服务器"步骤.我的TCP服务器将拥有2000多个客户端和一个套接字到每个客户端.
根据操作系统的不同,创建的套接字数量是否有限制?哪个操作系统允许在给定时间更多的开放套接字?
我有一个 Scala 应用程序,它使用 Finagle HTTP 客户端每秒向代理后面的 10 个外部 HTTP API 发出多达 2k 个请求。
我已将每个外部主机的连接池大小配置为 2000*10(10 秒是请求超时),但我不确定这是否是有效的配置。
我没有深入的 TCP/IP 知识,但我想知道 JVM 应用程序可以与一台远程主机建立多少个 HTTP 连接以及它可以建立多少个总体传出连接是否有最大限制?限制背后的因素是什么?我有一个模糊的记忆,它可能与可用的 TCP 端口有关,但不太确定。