我已经使用gorrilla / mux框架和cassandra数据库编写了一个Web API。当我使用jmeter对API运行负载测试时,它会传递大约1000个并发用户,并在用户增加时开始提供此错误:
非HTTP响应代码:java.net.SocketException,非HTTP响应消息:Socket关闭
根据我的理解,这种情况正在发生,因为线程已超时。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
JMeter使用您在HTTP采样器字段中指定的连接超时和接收超时。
如果您还没有指定任何值,它可能会等待很长时间才能打开套接字并接收响应。如果您为这些字段配置了一个值,请尝试稍微增加它们以观察它是否有帮助。但这只是一个故障排除步骤,而且大多数时候都是一个坏主意。您需要确定您的测试机器(JMeter)与目标系统之间的网络连接是否良好且没有任何问题。要确认这一点,请在Excel中打开结果文件,然后查看“已过去”,“等待”和“等待”。并连接时间字段。要将连接时间添加到结果文件,必须使用选项-Jjmeter.save.saveservice.connect_time = true启动JMeter
您还应该使用卷曲或类似的工具来验证Jmeter以外的这个工具,这些工具可以让您全面了解所花费的时间。
curl -s -w '\nDNS time:\t%{time_namelookup}\nTCP Connect time:\t%{time_connect}\nAppCon Protocol time:\t%{time_appconnect}\nRedirect time:\t%{time_redirect}\nPreXfer time:\t%{time_pretransfer}\nStartXfer time:\t%{time_starttransfer}\n\nTotal time:\t%{time_total}\n' http://www.google.com
这可以为您提供以下格式的输出,其中TCP连接时间提供终点建立连接所花费的时间
DNS时间:0.002
TCP连接时间:0.003
AppCon协议时间:0.000
重定向时间:0.000
PreXfer time:0.003
StartXfer时间:0.070
总时间:0.071
如果没有网络问题,您需要找到应用程序无法处理套接字创建请求的原因。我可以想象许多问题,包括缺少足够的线程来处理工作负载,减少max_clients和为进程分配的max_processes等。可以通过捕获两侧的wireshark转储来解决许多问题。
答案 1 :(得分:0)
我在jmeter中启用了keep-alive选项。这解决了我的问题。 但我仍然不知道如何使用go框架。
答案 2 :(得分:0)
每个网络都有一些有限的套接字大小分配给每个设备来传输数据。如果你在一台机器上使用1000个用户,那么它肯定只允许有限的请求数(根据通道大小)。
它就像“通过1000人的大门,你希望在10秒内通过所有人”
解决方法是:如果你使用Master-Slave并从一台机器使用Max 200-250用户(Ex-4 Slaves 1 Master),你就不会得到SocketException
希望这有帮助!