>> хочется некоторых фич от 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: [email protected] jabber://[email protected]
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
signature.asc
Description: Digital signature

