グラインダーで遊び始めたばかりですが(大好きです!)、次のような奇妙な動作に遭遇しました。
私は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