The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Мультипоточное чтение из STDIN perl"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Мультипоточное чтение из STDIN perl"  
Сообщение от pentarh email(ok) on 24-Ноя-08, 19:08 
Доброго времени суток!

У меня есть задача - принимать пайпом в перл-скрипт лог апача (по другому никак) и там уже производить некие операции.

Написал скрипт, который принимает в один поток - работает, но много процессов апача висят в состоянии L (Logging) - нагрузка очень тяжелая.

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

Делаю примерно следующим образом по аналогии с обычным префорковым аццептом (много кода упущено для простоты):

=================================

# Ловим сигналы
$SIG{TERM} = sub { $please_die = 1; };
$SIG{INT} = sub { $please_die = 1; };
$SIG{CHLD} = \&terminator;
$SIG{PIPE} = sub { $please_die = 1; };

# Префорковый цикл родителя
PARENT: while (1) {
    &killall if ($please_die);
    if (scalar(keys %children) < $children) {
        my $pid = fork;
        die "$0: fork failed: $!\n" unless defined $pid;
        last PARENT if $pid == 0;
        $children{$pid} = 1;
    }
    select(undef, undef, undef, 0.1);
    &killall if ($please_die);
}

# Здесь инициализируются потомки
$SIG{TERM} = sub { exit; };
$SIG{PIPE} = sub { exit; };
$SIG{INT} = sub { exit; };

# Собственно, МНОГО потомков читают один и тот же пайп
while (<>) {
    if (/^(\d+\.\d+\.\d+\.\d+) ([a-zA-Z0-9_\-.]+) \[([^\]]+)\] "[a-zA-Z]+ ([^"]+) HTTP\/\d\.\d" (\d+) (\d+|\-) "([^"]*)" "([^"]*)"/) {
        if ($itr++ > $maxperchild) {
            exit;
        }
        # Здесь анализируем прочитанную строку
    }
}

=================================

Я так понимаю, чтение из STDIN существенно отличается от accept() :) И по этому читать надо как то по другому, ибо все дико глючит.

Вопрос. Как правильно передавать потомкам родительский STDIN, чтобы один из потомков его читал по мере того как освободится?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Мультипоточное чтение из STDIN perl"  
Сообщение от NuINu (??) on 25-Ноя-08, 15:22 
>[оверквотинг удален]
>
>У меня есть задача - принимать пайпом в перл-скрипт лог апача (по
>другому никак) и там уже производить некие операции.
>
>Написал скрипт, который принимает в один поток - работает, но много процессов
>апача висят в состоянии L (Logging) - нагрузка очень тяжелая.
>
>Я сделал вывод, что читать из пайпа нужно в несколько потоков. И
>тут появились грабли.
>

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Мультипоточное чтение из STDIN perl"  
Сообщение от pentarh email(ok) on 25-Ноя-08, 15:29 
>вывод не правильный! с чего вы взяли что чтение в несколько потоков
>файла будет быстрее работать чем чтение того же файла в одном?
>

Ну не совсем файла, а пайпа STDIN.

Потому что между чтениями одной и следующей строки из STDIN происходит обработка этой строки вместе с сетевыми взаимодействиями, на что уходит некоторое время. Это время очень незначительно, но в пайп пишут 1600+ процессов апача (нагрузка высокая). В результате небольшой их процент, но существенный в абсолютном значении, находится в состоянии блокировки.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Мультипоточное чтение из STDIN perl"  
Сообщение от angra (ok) on 26-Ноя-08, 05:41 
А разделение мух и котлет, то бишь чтения с хендлера и обработки результатов вам в голову не приходило? Если по уму, то один процесс(поток, если хочется именно многопотоковый скрипт) читает на максимальной скорости и запускает другие процессы/треды на обработку, причем этим процессам/тредам абсолютно без разницы откуда взялись данные.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Мультипоточное чтение из STDIN perl"  
Сообщение от Pahanivo email(ok) on 26-Ноя-08, 09:00 
>А разделение мух и котлет, то бишь чтения с хендлера и обработки
>результатов вам в голову не приходило? Если по уму, то один
>процесс(поток, если хочется именно многопотоковый скрипт) читает на максимальной скорости и
>запускает другие процессы/треды на обработку, причем этим процессам/тредам абсолютно без разницы
>откуда взялись данные.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Мультипоточное чтение из STDIN perl"  
Сообщение от ACCA (ok) on 10-Фев-09, 09:26 
>Я так понимаю, чтение из STDIN существенно отличается от accept() :) И
>по этому читать надо как то по другому, ибо все дико
>глючит.
>
>Вопрос. Как правильно передавать потомкам родительский STDIN, чтобы один из потомков его
>читал по мере того как освободится?

Ответ - никак. Apache отдаёт в логи *строки*, а из STDIN приходят *блоки* размера PIPE_BUF из limits.h (4K в Linux).

Родитель должен разобрать STDIN на строки и отдавать их [по одной] на обработку потомкам. В ином случае потомки будут случайно хватать блоки с огрызками строк.


Под большой нагрузкой задача становится сложной - нужно поддерживать очередь потомков, чтобы тупо не ждать одного, зарывшегося с обработкой. Потом вылезет обработка ошибок, распределение памяти, балансирование загрузки между стадиями... Была когда-то фирма Orchestrate, под эту задачу сделала софтинку под названием Orchestrate Shell. Сейчас это компонент ублюдочного IBM InfoSphere DataStage.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру