3

他の ZendFramework アプリとの XMLRPC 通信を使用している ZendFramework ベースのアプリケーションがあります。どちらも同じサーバー上にあります(開発用)。その通信は非常に遅く、その理由を突き止めようとしています。プロファイリングの後、ZF Lib XMLRPC リーダーの fgets() 内でスローダウンが発生するポイントに到達しました。

ZendFramework ベースの PHP アプリケーションを strace しているときに、recv() で 15 秒待機するパターンがいくつかありますか? なぜこれが起こっているのか誰にも分かりますか?

 0.000038 gettimeofday({1278333900, 86101}, NULL) = 0
 0.000037 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 32
 0.000035 fcntl64(32, F_GETFL)      = 0x2 (flags O_RDWR)
 0.000033 fcntl64(32, F_SETFL, O_RDWR|O_NONBLOCK) = 0
 0.000034 connect(32, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
 0.000076 poll([{fd=32, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLOUT}])
 0.000045 getsockopt(32, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 0.000036 fcntl64(32, F_SETFL, O_RDWR) = 0
 0.000113 send(32, "POST /r/?articleId=554&hpr=Pimpl"..., 1180, MSG_DONTWAIT) = 1180
 0.000148 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
 0.028020 recv(32, "HTTP/1.1 200 OK\r\nDate: Mon, 05 J"..., 8192, MSG_DONTWAIT) = 543
 0.000105 poll([{fd=32, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
 0.000050 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
15.012976 recv(32, "", 8192, MSG_DONTWAIT) = 0
 0.000123 close(32)                 = 0
4

1 に答える 1

1

私は ZendFramework についてほとんど知らないので、私のコメントは大目に見てください... しかし!

これを正しく理解すれば

0.000050 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
15.012976 recv(32, "", 8192, MSG_DONTWAIT) = 0

これは、ソケット (32) でポーリングしていることを意味し、シグナル POLLIN (受信データ) を取得し、recv に移動して 15 秒間 (タイムアウト) 待機し、0 バイトが返されます。

これはバグを示しています。おそらくzendframeworkで、またはおそらくあなたがそれをどのように呼んでいるのか。recv の後に 0 バイトを受信した場合は、ソケットが (強制的に閉じられたのではなく) きれいに閉じられたことを示します。したがって、ポーリングから出て recv に入ると、応答はすぐに返されます (結局、0 バイトしか読み取れません)。

MSG_DONTWAIT フラグは、非ブロッキング モードに移行することを意味すると想定しています。つまり、待機中のデータに関係なく、データまたは wouldblock エラーのいずれかですぐに返され、ポーリング ループに戻ります。

他の何かがスレッドをフリーズさせてロックアップを引き起こしている可能性があります。アプリを 2 つの異なるマシンに配置して、同じエラーが発生するかどうかを確認してください。奇妙な相互作用かもしれません。

DC

于 2010-07-12T03:05:01.250 に答える