【发布时间】:2012-11-04 13:46:07
【问题描述】:
我刚开始玩 Grinder(喜欢它!)但遇到了一些奇怪的行为,如下所示:
我一直在使用 5 个工作人员来解析推文文本并将它们发送到我正在负载测试的 URL。 Grinder 工作顺利,但我注意到 Python urlencode 在某些 unicode 或 latin 编码的东西上失败了(即,一些线程因此过早死亡)。
我想,由于 Jython 是真正的 Java,我会尝试在可疑字符串上使用 java.net.URLEncoder 并查看它的行为。
所以我在 Jython 脚本的顶部添加了
from java.net import URLEncoder
并将 python urlencode 包装在一个 try/catch 中,它依赖于 UrlEncoder.encode(myString,'UTF-8')
当我使用一名工人对其进行测试时,它似乎完美无缺。但是一旦我将工作人员的数量增加到 2 或 3 以上,工作人员将启动,但随后无法与控制台通信,在加载时间过长后抛出以下错误:
2012-11-15 15:59:04,287 ERROR worker-bootstrap: Error running worker process
net.grinder.communication.CommunicationException: Exception whilst sending message
at net.grinder.communication.AbstractSender.send(AbstractSender.java:57) ~[grinder-core-3.11.jar:na]
at net.grinder.communication.QueuedSenderDecorator.flush(QueuedSenderDecorator.java:60) ~[grinder-core-3.11.jar:na]
at net.grinder.engine.process.GrinderProcess.sendStatusMessage(GrinderProcess.java:638) ~[grinder-core-3.11.jar:na]
at net.grinder.engine.process.GrinderProcess.run(GrinderProcess.java:430) ~[grinder-core-3.11.jar:na]
at net.grinder.engine.process.WorkerProcessEntryPoint.run(WorkerProcessEntryPoint.java:86) [grinder-core-3.11.jar:na]
at net.grinder.engine.process.WorkerProcessEntryPoint.main(WorkerProcessEntryPoint.java:59) [grinder-core-3.11.jar:na]
Caused by: java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.6.0_37]
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) ~[na:1.6.0_37]
at java.net.SocketOutputStream.write(SocketOutputStream.java:136) ~[na:1.6.0_37]
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) ~[na:1.6.0_37]
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) ~[na:1.6.0_37]
at java.io.ObjectOutputStream$BlockDataOutputStream.flush(ObjectOutputStream.java:1793) ~[na:1.6.0_37]
at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:699) ~[na:1.6.0_37]
at net.grinder.communication.AbstractSender.writeMessageToStream(AbstractSender.java:90) ~[grinder-core-3.11.jar:na]
at net.grinder.communication.StreamSender.writeMessage(StreamSender.java:70) ~[grinder-core-3.11.jar:na]
at net.grinder.communication.AbstractSender.send(AbstractSender.java:53) ~[grinder-core-3.11.jar:na]
... 5 common frames omitted
这对我来说基本上看起来像是一个超时(管道破裂,这意味着我猜要么控制台厌倦了聆听,要么代理厌倦了尝试连接)。但我不确定为什么。 (我也不确定在例外中看到“虽然”这个词是什么感觉。Strewth,Hacker!你没看到 险恶的内存泄漏? )
就手头的代码问题而言,我可以比 Python urlencode 的(当前实现的)默认行为做得更好 - 我确实知道一些改进这一点的技巧,但它们往往会变得混乱,我有点猜测其中一些不会在 Jython 中工作。
但我对这里的总体水平感到好奇。 Java URLEncode 工作得很好 - 在 3 个或更少的工作人员上 - 那么为什么它会在更多工作人员的情况下失败呢?
猜测:
我的系统资源用完了吗?
-
恐怖——每个工人都在创建自己的自己的 JVM吗?
嗯,检查过,是的,事实证明确实如此。但这并没有停止 以前的事情。为什么现在?我的 Mac 中有 2 个处理器 - 我会 认为如果这是问题所在,我们应该在 3 个工人处失败,但是,不。 4个或5个, 是的。
出于某种原因,在 Jython 中使用本机 Java 库不是一个好主意吗?
感谢您的见解。
谢谢 JB
【问题讨论】:
标签: java jython load-testing grinder