Java 研磨机代理无法与多个工人的控制台通信

Java 研磨机代理无法与多个工人的控制台通信,java,jython,load-testing,grinder,Java,Jython,Load Testing,Grinder,我刚开始玩研磨机(喜欢!),但遇到了一些奇怪的行为,如下所示: 我一直在使用5名工作人员解析推文文本,并将其发送到我正在进行负载测试的URL。Grinder工作顺利,但我注意到Python URLENCDE在一些unicode或拉丁编码的东西上出现了故障(例如,一些线程因此过早死亡) 我想,既然Jython实际上是幕后的Java,我会尝试在可疑字符串上使用Java.net.URLEncoder,看看它是如何工作的 因此,在我的Jython脚本的顶部,我添加了 from java.net impo

我刚开始玩研磨机(喜欢!),但遇到了一些奇怪的行为,如下所示:

我一直在使用5名工作人员解析推文文本,并将其发送到我正在进行负载测试的URL。Grinder工作顺利,但我注意到Python URLENCDE在一些unicode或拉丁编码的东西上出现了故障(例如,一些线程因此过早死亡)

我想,既然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
这在我看来基本上是一个超时(管道断了,这意味着我猜要么控制台厌倦了监听,要么代理厌倦了尝试连接)。但我不知道为什么。(我也不知道在例外情况下看到“while”这个词我是什么感觉。Strewth,Hacker!你没看到吗 邪恶的内存泄漏?)

就目前的代码问题而言,我可以做得比Python urlencode的(当前实现的)默认行为更好——我确实知道一些改进的技巧,但它们往往会变得混乱,我猜其中一些将不会在Jython中工作

但我对这里的总体水平很好奇。Java URLENCDE在3个工人或更少的工人身上工作得很好——那么,如果有更多工人,为什么它会失败呢

猜测:

我的系统资源用完了吗

  • 恐怖-每个工人都在创建自己的JVM吗

    嗯,检查过了,是的,事实证明是这样。但这并没有停止 以前的事情。为什么是现在?我的mac电脑有两个处理器——我会的 如果这是问题所在,我们应该在3名工人中失败,但是,没有。四,五,, 是的

出于某种原因,在Jython中使用本机Java库不是一个好主意吗

我很欣赏你的见解

谢谢
JB

我不确定这是否适用于您的情况,但请尝试像这样运行grinder代理

java net.grinder.Grinder -daemon 2
该命令的作用是,当研磨机无法连接到控制台或由于某种原因失去连接时,它会休眠一段时间并尝试重新连接。我有预感这可能会解决你的问题

关于这方面的文档非常少,但这是我从哪里得到这个的来源