[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: inetd хочется странного



>> хочется некоторых фич от 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


Reply to: