【问题标题】:The Grinder agent fails to communicate with Console with more than a few workersGrinder 代理无法与多个工作人员与控制台通信
【发布时间】: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


    【解决方案1】:

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

    java net.grinder.Grinder -daemon 2
    

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

    这方面的文档非常少,但这是我得到这个的来源。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多