我们在 Elastic Beanstalk 上运行 Node API 应用程序,并在数据库中使用 Dynamo,在 Elastic Cache 中使用 Redis。我正在加载测试,通过运行针对 Node API 的请求调用循环,模拟大约 20,000 个同时进行调用的用户。
它运行了一段时间。总调用量超过 30,000 次。然后我开始无法连接到 dynamo 和 redis。我得到以下信息:
“无法访问的主机:dynamodb.us-west-2.amazonaws.com'。此服务可能在
us-west-2' 地区不可用。\”,\“code\":\"UnknownEndpoint\",\"stack\":\"UnknownEndpoint: 不可访问的主机:`dynamodb.us-west-2.amazonaws.com'。"
“与 xxxxxx-lt-001.19atpm.0001.usw2.cache.amazonaws.com:6379 的 Redis 连接失败 - getaddrinfo ENOTFOUND”
但那时它已经运行得很愉快了很长一段时间。
我看到应用服务器上有大约 20,000/30,000 个连接。到那时为止,我看到我的调用的响应时间不到 200 毫秒,并且突然间它们的长度跳跃,变得越来越长。我已将应用服务器上的打开文件数增加到 100,000, Node 的最大连接数增加到 50,000。
应用服务器是 C4.xlarge。 CPU 未达到 30%。 Dynamo 和 Redis 都没有接近它们的极限,甚至还远未达到极限。网络输出峰值为 40,000,000,网络输入峰值为 100,000,000。
我现在完全被难住了。有什么建议吗?
/etc/security/limits.conf 文件:
- 软文件 100000
- 硬文件 100000
ulimit -a 的结果
核心文件大小( block ,-c)0 数据段大小(千字节,-d)无限制 调度优先级 (-e) 0 文件大小( block ,-f)无限制 挂起信号 (-i) 59742 最大锁定内存(千字节,-l)64 最大内存大小(千字节,-m)无限制 打开文件 (-n) 100000 管道大小(512 字节,-p)8 POSIX 消息队列(字节,-q)819200 实时优先级 (-r) 0 堆栈大小(千字节,-s)8192 CPU 时间(秒,-t)无限制 最大用户进程 (-u) 59742 虚拟内存(千字节,-v)无限制 文件锁 (-x) 无限制
更多信息 - 我在消息日志中发现了一些关于“nf_conntrack:表已满,丢弃数据包”的错误。所以我按照以下网页中的建议增加了表格的大小。这让我更进一步,多达 45,000 个左右的电话。然后它真的从 table 上掉下来了。从亚秒级响应时间立即变为 25 秒响应时间。
最佳答案
在这种情况下,几个较小的盒子似乎会在导致网络爆炸之前用完它们的 CPU。 c4.xlarge 没有。部分原因可能是 Node 集群在 Node 的 v 12 之前的版本中工作的方式不佳,其中循环没有平等地使用所有 CPU。
关于linux - Beanstalk/Node.Js/网络问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28974682/