Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность,потоки зависают и "поедают" память, Потоки не "умирают" после отработки 
:(
    Опции темы
StealtH
Дата 3.9.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.9.2004

Репутация: нет
Всего: нет



Есть код:

Код


#!/usr/bin/perl -w

use strict;
use threads;
use threads::shared;
use Fcntl qw(:DEFAULT :flock);

my $max_threads = 20;
my $worksthreads : shared = 0;

open FILE, 'words';
chomp(my @words = <FILE>);

my @threads;

    for (my $j = 0; $j <$#words; $j++){

        if ($worksthreads <= $max_threads){

            $threads[$worksthreads++] =  threads->create(\&threads_sub, $words[$j]);
        } else {
            print $worksthreads . " thread work\n";
            sleep 1;

            while(my $th = shift @threads){

                print $th->tid, "\n";
                $th->join;
                $worksthreads--;
                $th = undef;

            }
        }
    }



sub thread_sub{


    my $word = shift;
    my $tid = shift;

    my $var = 0;

    for (0..450){

        $var += $_.$word;

    }
    sleep 1;
    $worksthreads--;
    print $filename, " => $worksthreads\n";
    undef $tid;
    return 1;
}




Суть проблемы такова, что потоки не умирают должным образом и остаются в памяти, с учетом того, что в среднем каждый поток весит примерно 10 метров, то на 300-350 итерации цикла на сервере не остается оперативки, а 400 итераций - это даже не 1% файла. 

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

OS - ASPLinux 10
Код

bash-3.00# perl -v

This is perl, v5.8.5 built for i386-linux-thread-multi

Copyright 1987-2004, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'.  If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.

PM MAIL   Вверх
Bulat
Дата 5.9.2007, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



StealtH, с многопоточностью работаю через fork, но думаю что в этом моенте разницы не будет. Для того чтобы убивать зомби использую

Код

use POSIX 'WNOHANG';

.....

$SIG{CHLD} = sub {
    while ( ( my $kid = waitpid( -1, WNOHANG ) ) > 0 ) {
        warn "Reaped child with PID $kid\n";
    }
};




--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
fray
Дата 5.9.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: 0
Всего: 0



Работать с тредами нужно очень аккуратно. Так как они капризные и могут возникать разные "эффекты" с памятью 
сделай хотяб так...

Код

my @threads;

for (1..THREADS) {
    my ($tid) = threads->create(\&child);
    if ( $tid ) {
        push @threads, $tid;
    } else {
        warn "Cannot create thread number $_";
        last;
    }
}
$_->join for @threads;

вот так !
потом зачем передавать $words[$j] ведь на то они и треды чтобы находится в одной области памяти к родителю сделай так чтобы, элемены массива выбирались  прям в сабе, хотя конечно мож я забыл что ты спрашивал. 

Это сообщение отредактировал(а) fray - 5.9.2007, 13:14
PM MAIL   Вверх
StealtH
Дата 6.9.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.9.2004

Репутация: нет
Всего: нет



Bulat, помогло, но не совсем, памяти стали потоки съедать меньше, но все же остается момент когда они ее поедают, постепенно объем занимаемой памяти растет :(


fray, насчет юзать переменные прямо в сабе - хорошая мысль, попробовал, мне понравилось  smile 
PM MAIL   Вверх
Bulat
Дата 9.9.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(StealtH @  6.9.2007,  22:51 Найти цитируемый пост)
но все же остается момент когда они ее поедают, постепенно объем занимаемой памяти растет

Все зависит от того чем ты занимаешься в дочерних процессах. Лично у меня дочерние процессы съедали не более 11,5 Mb. Но у меня шла работа с большими скалярами, объемом до нескольких сотен килобайт, может даже 1 мегабайт. Так вот при выполнении определенных операций, перл использует дополнительную память, которую впсоледствии не высвобождает. Пришлось переделать некоторые места кода, теперь несколько дочерних процессов съедают от 7,5 до 10,5 мегабайт. Немного для одного, но в целом не плохо.

Тут уже как бы сказать вопрос не к многопоточности относится, а немного к иному smile. Кстати была еще одна проблема, когда дочерние процы висели, т.е. рандомное время работали хорошо. а потом начниали подвисат загружая процессор, причем очень серьезно, могли висеть по долгу, при этом выполняли что-то. Думал, что может есть какая особенность, но для начала передала один фрагмент кода, и висеть перестали smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
StealtH
Дата 15.9.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.9.2004

Репутация: нет
Всего: нет



Bulat,  в "детях" происходит банальное скачивание контента, далее удаление тэгов и индексация по уникальным словам с подсчетом повторений в слов в тексте, т.е. прога по сути своей поисковый паук, была проблема с памятью, в среднем поток "весил" порядка 10-12 метров, но потом я отказался от LWP и переписал все на сокеты, в самой подпрограмме, из которой делается поток все переменные уничтожаются по мере их использования, старался оптимизировал код как мог, но все-таки остается проблема с зависшими процессами, количество которых накапливается, и соответственно количество свободной памяти уменьшается. 
Вот собственно и сама проблема, решения пока найти не могу.
PM MAIL   Вверх
Bulat
Дата 1.10.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(StealtH @  15.9.2007,  20:14 Найти цитируемый пост)
в среднем поток "весил" порядка 10-12 метров

У меня подобное было, но после оптимизации кода, я снизил до 9-10, немного конечно, но пара мегобайт умноженные хотя бы на 10 дочерних процессов уже ~20. 

Цитата(StealtH @  15.9.2007,  20:14 Найти цитируемый пост)
отказался от LWP 

я не стал отказыватся, видел как работают и на простых сокетах и с ЛВП, как-то не показалось, что настолько уж лучше smile

Цитата(StealtH @  15.9.2007,  20:14 Найти цитируемый пост)
но все-таки остается проблема с зависшими процессами

значит что-то не так с твоим кодом, после вышеприведенного куска кода, отработавшие свое дочерние процы не должны зависать. У меня код был написан так, что одновременно могли работать не более 10 дочерних процессов. Возможно, где-то у тебя происходит, что дочерние потоки порождают новые??? Не знаю, если ты нормально убиваешь дочерние процы, после этого еще и нормально убиваешь зомби, зависать не должны smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
G0rinich
Дата 2.10.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.8.2006

Репутация: нет
Всего: 1



POE спасет мир smile
Это если работаете с сетевой многозадачностью.

Добавлено через 7 минут и 37 секунд
Тут можно посмотреть пример хорошего такого паучка. Код конечно приведен для примера. Оптимизированный такой скрипт на самописных "боевых" компонентах способен выжимать 100 - 1К запросов в секунду ;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0923 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.