Состояние существующих соединений при использовании передачи файлового дескриптора? - PullRequest
0 голосов
/ 21 августа 2010

Я играю с веб-сервером, используя сокет unix и sendmsg / recvmsg, чтобы передать дескриптор файла сокета новому процессу сервера без потери каких-либо запросов. При тестировании его с помощью ab я обнаружил, что клиентские соединения будут задерживаться, и apachebench (ab) отобразит ошибку: «apr_poll: истекло указанное время ожидания (70007)».

Я подозревал, что в адресе файлового дескриптора было изменено, что сделало бы открытые соединения бесполезными, однако проверка того, что соединения были закрыты в конце каждого запроса, не имела значения, пара запросов потерпеть неудачу.

Есть ли какая-то лишняя странность на уровне сокетов или это просто странно? Что-нибудь еще, что я должен принять во внимание?

Редактировать: Использование PHP в качестве клиента для выполнения запросов также останавливается во время цикла.

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

Это имеет смысл, если у вас есть главный сервер, который прослушивает сокет (принимает входящие соединения), и у вас есть несколько рабочих процессов.

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

0 голосов
/ 21 августа 2010

Это эквивалентно попытке отправить телефон по телефонной линии. Это не имеет никакого смысла. Сокет fd идентифицирует конечную точку соединения. Если другому хосту нужно соединение, ему придется создать свое собственное. Вы не можете дать ему один из ваших.

...