4

グラインダーで遊び始めたばかりですが(大好きです!)、次のような奇妙な動作に遭遇しました。

私は5人のワーカーを使用してツイートテキストを解析し、負荷テストを行っているURLに送信していました。グラインダーは問題なく動作していましたが、Python urlencodeが一部のUnicodeまたはラテン語でエンコードされたもので失敗していることに気付きました(つまり、一部のスレッドが結果として早すぎる死を遂げていました)。

Jythonは実際には内部でJavaであるため、疑わしい文字列に対してjava.net.URLEncoderを使用して、その動作を確認しようと思いました。

そのため、Jythonスクリプトの先頭に追加しました

from java.net import URLEncoder

そして、Pythonurlencodeをtry/ catchでラップし、UrlEncoder.encode(myString、'UTF-8')にフォールバックしました。

そして、1人のワーカーを使用してテストしたところ、問題なく動作しているように見えました。しかし、ワーカーの数を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

これは基本的に私にはタイムアウトのように見えます(パイプが壊れているため、コンソールがリッスンにうんざりしているか、エージェントが接続しようとしてうんざりしていると思います)。しかし、理由はわかりません。(例外として「ながら」という言葉を見るとどう思うかわかりません。ストリュース、ハッカー!あなたは不吉な記憶の漏れを見たことがありますか?)

手元にあるコードの問題に関しては、Python urlencodeの(現在実装されている)デフォルトの動作よりもうまくいくことができます-これを改善するためのいくつかのトリックを知っていますが、それらは厄介になる傾向があり、いくつかは推測していますそのうちの1つはJythonで動作しません。

しかし、私はここで一般的なレベルで興味があります。Java URLEncodeは、3人以下のワーカーで問題なく動作します。それでは、ワーカーが多いと失敗するのはなぜですか。

推測:

システムリソースが不足していませんか?

  • ホラー-各ワーカーは独自のJVMを作成していますか?

    さて、チェックしました、そしてそうです、それは結局のところそうです。しかし、これは以前は物事を止めませんでした。なぜ今なのか?私のMacには2つのプロセッサがあります。これが問題だったとしたら、3人のワーカーで失敗するはずですが、違います。4または5、うん。

JythonでネイティブJavaライブラリを使用しているのは、何らかの理由で、良い考えではありませんか?

洞察に感謝します。

ありがとうJB

4

1 に答える 1

0

これがあなたのケースで機能するかどうかはわかりませんが、このようにグラインダー エージェントを実行してみてください。

java net.grinder.Grinder -daemon 2

コマンドが行うことは、グラインダーがコンソールへの接続に失敗した場合、または何らかの理由で接続が失われた場合、しばらくスリープ状態になり、再接続を試みることです。これで問題が解決するかもしれないという予感があります。

これに関するドキュメントはほとんどありませんが、これを入手したソースは次のとおりです。

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

于 2013-11-01T05:41:46.510 に答える