>> хочется некоторых фич от inetd, однако не знаю реализовывал ли их >> кто-нибудь. >> >> в частности хочется опции prefork=n (вернее даже preexec), чтобы >> сократить время отклика на время форка и старта/инициализации >> приложения. PP> Хмм, а что прикажете на file descriptor 0 новому процессу отдасть? PP> Нормально - там inet/Unix socket связи с клиентом стоит; чего подать PP> новому серверному процессу при preexec? PP> Prefork на ниво inetd не даст премного доброго, если после того PP> exec надо делать, когда client connection придет. тут получается некоторый оверхед. то есть 1. процесс принимает соединение 2. процесс его обрабатывает в случае pre-fork/pre-exec 1 исключить нельзя. однако если поисследовать немного ситуацию, то оказывается что на обработку соединения процесс тратит сильно меньше времени чем на запуск/инициализацию. и несмотря на оверхед с промежуточным процессом гонящим данные можно все равно иметь массу профита. Кроме всего прочего в libc или ядре (уж не помню) были прямо функции, которые гонят данные из дескриптора в дескриптор. можно погуглить, но это уже вопрос оптимизации. то есть в чем суть: берем perl и пишем сервер, который отвечает на запросы, ну допустим echo: package ModuleName; sub process_request { while(<STDIN>) { print $_; } return 0; } теперь кладем его в inetd 128 stream tcp nowait username /usr/bin/perl /usr/bin/perl /path/to/script.pl и ваяем скрипт который делает 10000 запросов подряд на порт. видим, что запрос обрабатывается N мс. Затем берем этот же модуль и биндим его функцию process_request на порт 129 при помощи Net::Server. И видим, что время отклика на порту 129 где-то раз в 5-10 меньше чем на порту с inetd. Связано это, очевидно, с компиляцией скрипта перед обработкой каждого соединения. Ну и вот отсюда и возникли "странные желания": взять и приделать к inetd prefork с pre-exec. то есть слушалка держит наготове N предварительно запущенных программ. в качестве stdin/stdout на них смотрит сокет. Все они спят на этом сокете (каждый на своем). Затем приходит соединение, процесс форкается и в форке тупо гонятся данные из/в одного сокета в/из другой. а можно еще и на место этих форков префорки сделать. как-то так. -- ... mpd is off . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Attachment:
signature.asc
Description: Digital signature