Grinder代理无法与控制台与多个工作人员进行通信



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

我一直在使用5个工作人员来解析推文文本,并将它们发送到我正在进行负载测试的URL。Grinder工作顺利,但我注意到Python urlencode在一些unicode或拉丁编码的东西上失败了(即,一些线程因此英年早逝)。

我想,既然Jython实际上是Java,我会尝试在可疑字符串上使用Java.net.URLEncoder,看看它的表现如何。

所以在Jython脚本的顶部,我添加了

from java.net import URLEncoder

并将python urlencode封装在try/catch中,该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 URLEncode在3个或更少的工作人员上工作得很好——那么,既然有更多的工作人员,为什么它会失败呢?

猜测:

我的系统资源用完了吗?

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

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

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

见解值得赞赏。

谢谢JB-

我不确定这是否适用于您的情况,但试着像这样运行研磨机代理。

java net.grinder.Grinder -daemon 2

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

目前的文档很少,但这是我得到它的来源。

http://grinder.sourceforge.net/g3/agents-and-workers.html

相关内容

最新更新