Почему apache вызывает recv () каждый раз по 15 секунд? - PullRequest
3 голосов
/ 05 июля 2010

У меня есть приложение на основе ZendFramework, которое использует связь XMLRPC с другим приложением ZendFramework.Оба находятся на одном сервере (для разработки).Это общение очень медленное, и я пытаюсь выяснить, почему.После профилирования я дошел до того, что в fgets () программы чтения XMLRPC ZF Lib наблюдается замедление.

Когда я запускаю PHP-приложение на основе ZendFramework, я получаю несколько шаблонов с 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

1 Ответ

1 голос
/ 12 июля 2010

Я мало знаю о 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 или, как вы это называете.получение 0 байтов после recv указывает, что сокет был полностью закрыт (в отличие от принудительного закрытия).Поэтому, когда вы выходите из опроса и входите в recv, ответ должен быть немедленным (в конце концов он читает только 0 байтов)

Флаг MSG_DONTWAIT, который я предполагаю, означает переход в неблокирующий режим, что означает, что независимо от данныхожидание должно немедленно вернуться, либо с данными, либо с ошибкой блокировки блоков, чтобы вернуться в цикл опроса.

Возможно, что-то еще замораживает поток, вызывая его блокировку.попробуйте разместить приложения на двух разных компьютерах, чтобы увидеть, если вы получаете ту же ошибку.это может быть какое-то странное взаимодействие.

DC

...