Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Утечка памяти Postgres / 24 сообщений из 24, страница 1 из 1
22.03.2014, 19:44:40
    #38593697
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
Доброе время суток. Имеем PG 9.2.6 х64, собраный под Gentoo.
Есть специальная программка (С#, Npgsql), дергающая в несколько потоков определнную и довольно сложную функцию PG, которая в свою очередь дергает еще несколько весьма ресурсоемких функций (расчетная математика), писаных на plperl и plpgsql. В функциях активно пользуются временные таблички, но они в конце каждого вызова функции изничтожаются.

Каждые 100 вызовов в каждом потоке делается реконнект к БД. То есть все транзакции, какие могли быть - убиваются и на сервере должны очищаться (по идее). Однако этого не происходит - память на сервере течет по страшному (десяткам Мб/с). Мысли в голове закончились...

1) Течь памяти связана с тем, что после завершения транзакции не вся память высвободилась. Но по умолчанию одна команда - одна транзакция. Поэтому тут искать глухо. Или разработчики постреса в этом наврали
2) Подстраховывая предыдущий вариант - реконнект. Тут уж точно все должно убиваться однозначно. Однако не помогает.
3) Распускать мысли про то, что нужно параллелить и математикой сервер не грузить - не надо. Это делается, но не быстро, а результат нужен сейчас.

У кого нибудь конструктивные мысли или кто сталкивался с подобным?
...
Рейтинг: 0 / 0
22.03.2014, 20:45:51
    #38593727
buddy_ekb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakama,

можете уточнить, что значит "память на сервере течет по страшному (десяткам Мб/с)" ?

а также,
откуда берёте цифры об объёме утекающей памяти?
к чему приводит исчерпание [свободной] памяти?
...
Рейтинг: 0 / 0
22.03.2014, 20:54:44
    #38593731
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
buddy_ekb,

Элементарно - сервер нагружается только моей задачей, монитор ресурсов системы все это и показывает. Даже клиент, которые у меня все дергает, стоит на другой машине.
...
Рейтинг: 0 / 0
22.03.2014, 20:56:58
    #38593735
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
buddy_ekb,

А приводит это сначала к забиванию оперативки в 16 гигов, потом к забиванию свопа аналогичного размера ну и в конечном финале - отказу сервера по помяти (PG переходит в режим восстановления, из которго так и не поднимается). На все про все - 30 минут
...
Рейтинг: 0 / 0
22.03.2014, 23:14:22
    #38593773
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakama,

похоже, вам стоит еще посмотреть, как обстоят дела с высвобождением памяти в perl, точнее, в вашем коде на perl.
...
Рейтинг: 0 / 0
22.03.2014, 23:53:31
    #38593781
Гость_0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakama,

покажите вывод:
show shared_buffers;
select version ();

также покажите пример утечки, типа:

было:
ps axu

подключились, выполнили запрос, закрыли соединение и стало:
ps axu
...
Рейтинг: 0 / 0
23.03.2014, 10:11:28
    #38593840
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
Ы,

На переле написана только строковая обработка, конкретно - регулярки. Остальное -на plpgsql.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
create extension if not exists plperl;
--регулярки от перла!!!
drop function if exists perl_regex_matches(text, text);
CREATE OR REPLACE FUNCTION perl_regex_matches(text, text)
  RETURNS SETOF text[] AS
    /*$1 - где ищем
$2 - что ищем
*/

$BODY$
	my ($sentense, $regexp) = @_;
	my @values = $sentense =~ /$regexp/g;
	return [ \@values ];
$BODY$
  LANGUAGE plperl VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION perl_regex_matches(text, text)
  OWNER TO postgres;
drop function if exists perl_regex_matches_t(text, text);
CREATE OR REPLACE FUNCTION perl_regex_matches_t(text, text)
  RETURNS SETOF text AS
    /*$1 - где ищем
$2 - что ищем
*/
$BODY$
	my ($sentense, $regexp) = @_;
	my @values = $sentense =~ /$regexp/g;
	return \@values;
$BODY$
  LANGUAGE plperl VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION perl_regex_matches_t(text, text)
  OWNER TO postgres;
drop function if exists perl_regex_split_t(text, text);
CREATE OR REPLACE FUNCTION perl_regex_split(text, text)
  RETURNS SETOF text[] AS
/*$1 - где ищем
$2 - что ищем
*/

$BODY$
	my ($sentense, $regexp) = @_;
	my @values = split /$regexp/, $sentense;
	return [ \@values ];
$BODY$
  LANGUAGE plperl VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION perl_regex_split(text, text)
  OWNER TO postgres;
drop function if exists perl_regex_split_t(text, text);
CREATE OR REPLACE FUNCTION perl_regex_split_t(text, text)
  RETURNS SETOF text AS
  /*$1 - где ищем
$2 - что ищем
*/
$BODY$
	my ($sentense, $regexp) = @_;
	my @values = split /$regexp/, $sentense;
	return \@values;
$BODY$
  LANGUAGE plperl VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION perl_regex_split_t(text, text)
  OWNER TO postgres;  
drop function if exists perl_regex_replace(text, text);
CREATE OR REPLACE FUNCTION perl_regex_replace(text, text, text)
  RETURNS text AS
/*$1 - где ищем
$2 - что ищем
$3 - чем меняем
*/
  $BODY$
my ($sentense, $pattern, $replace) = @_;
$sentense =~ s/$pattern/$replace/g;
return $sentense;
$BODY$
  LANGUAGE plperl VOLATILE
  COST 100;
ALTER FUNCTION perl_regex_replace(text, text, text)
  OWNER TO postgres;
...
Рейтинг: 0 / 0
24.03.2014, 12:47:40
    #38594424
buddy_ekb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakama,

похоже, что у вас действительно возникает утечка в perl'е в момент компиляции динамического регулярного выражения.

можете ли вы переписать свой код на PHP/pcre ?
...
Рейтинг: 0 / 0
24.03.2014, 13:10:20
    #38594459
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakama,

Вообще все что вы там делаете в перле - есть в нативном Пг. Через regex_replace и т.д.

Насчет массивов - есть мнение что их не "отпускает". Надо посмотреть.
...
Рейтинг: 0 / 0
24.03.2014, 14:07:43
    #38594584
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
Warstone,

нет, не все есть в нативном. Конкретно - нет пред и пост условий.
Вида (?<=<meta content=['"])[А-Яа-я\s-«»'",\.A-Za-z:\r\n/—_\d]*(?=['"] property="og:image">)
...
Рейтинг: 0 / 0
24.03.2014, 14:15:00
    #38594601
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
buddy_ekb,

Вообще желания переписывать нет. А как можно изменить кода приведеных функций? С чисткой памяти. Просто сам с перлом не сильно знаком и эти функции писал не я
...
Рейтинг: 0 / 0
24.03.2014, 14:41:58
    #38594661
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakamaWarstone,

нет, не все есть в нативном. Конкретно - нет пред и пост условий.
Вида (?<=<meta content=['"])[А-Яа-я\s-«»'",\.A-Za-z:\r\n/—_\d]*(?=['"] property="og:image">)
ну вам же предлагали 15292306 попользовать regexp_matches

Код: sql
1.
2.
SELECT -- regexp_split_to_array('Республика Беларусь','(?<=к)а');
regexp_matches('Республика Беларусь','(.*)(ка)(.*)','ig')




хотя я не уверен, что руки у вас кривые только в одном месте
...
Рейтинг: 0 / 0
24.03.2014, 15:08:10
    #38594710
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
qwwq,

К сожалению, кривизна рук связана не только со мной, но и с принципиальной позицией отдельных разработчиков PG. То, что plperl имеет не самую лучшую реализацию (что растет из самой архитектуры перла) и то, что регулярки в исполнении plperl не делают явно то, что мне нужно привело к тому, что получилось. А то, что писать самому функцию на plperl, которая делает тоже самое, что и функция на plperl, лень - это что, кривизна?

По хорошему, все это будет переписано на чем-то более правильном и более соотвествующем стандартам (С,С++), причем не только POSIX. Но сейчас имеем то, что имеем и вариантов немного.

Итак, повторяю свой вопрос - есть ли возможность как нибудь зачищать память plperl принудительно?
...
Рейтинг: 0 / 0
24.03.2014, 15:13:25
    #38594719
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakamaqwwq,

К сожалению, кривизна рук связана не только со мной, но и с принципиальной позицией отдельных разработчиков PG. То, что plperl имеет не самую лучшую реализацию (что растет из самой архитектуры перла) и то, что регулярки в исполнении plperl не делают явно то, что мне нужно привело к тому, что получилось. А то, что писать самому функцию на plperl, которая делает тоже самое, что и функция на plperl, лень - это что, кривизна?

По хорошему, все это будет переписано на чем-то более правильном и более соотвествующем стандартам (С,С++), причем не только POSIX. Но сейчас имеем то, что имеем и вариантов немного.

Итак, повторяю свой вопрос - есть ли возможность как нибудь зачищать память plperl принудительно?

да конечно..... коннект закройте к базе и память освободится (вместе с процессом который коннект обслуживал)
...
Рейтинг: 0 / 0
24.03.2014, 15:24:35
    #38594747
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakamaqwwq,

К сожалению, кривизна рук связана не только со мной, но и с принципиальной позицией отдельных разработчиков PG.
<...>

Итак, повторяю свой вопрос - есть ли возможность как нибудь зачищать память plperl принудительно?
дык, а вы уверены, что проблема у вас именно с перлом ?


то-то и оно, что вы начинаете решать задачу, до того, как её осознали.
я только об этом.
так вы многое нарешаете.

если бы у вас стояла задача использовать перл (например вы тестером plperl-а были бы) -- все с вашим подходом было бы в порядке.

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

для этого в постгресе почти всё есть.
а желание ваше пользоваться таким же, но непременно "с перл-амутровыми пуговками" -- это ваша блажь.

возможно, она (эта блажь) и виновата в чём-то, а возможно - и нет.
вы же ещё не отдиагностировали нормально ситуацию
берётесь за первый попавшийся бубен
а например настройки постгреса тут расписать, и соотвествующие параметры системы - даже не утрудились.
...
Рейтинг: 0 / 0
24.03.2014, 15:40:11
    #38594773
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
Maxim Boguk,

Экспериментировали, не помогает. Каждые 50 запросов реконнект. Для чистоты эксперимента делали даже новый объект коннекта. так что скорее всего дело именно в перле.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
           
            {
                _counter++;
                if (_counter > 50)
                {
                    _log.Write("Реконнект для профилактики памяти...");
                    _conn.Close();
                    _conn = new NpgsqlConnection(_connectionString);
                    _cmd.Connection = _conn;
                    _conn.Open();
                    index = WaitForReconnect();
                    _log.WriteLine("ОК");
                    _counter = 0;
                }
                _cmd.CommandText = cmdText;
                if (this.Debug) _log.WriteLine("Команда "+cmdText);
                index = Convert.ToInt64(_cmd.ExecuteScalar());

            }
...
Рейтинг: 0 / 0
24.03.2014, 15:48:32
    #38594788
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
[quot qwwq]kamakamaто-то и оно, что вы начинаете решать задачу, до того, как её осознали.
я только об этом.
так вы многое нарешаете.

если бы у вас стояла задача использовать перл (например вы тестером plperl-а были бы) -- все с вашим подходом было бы в порядке.

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

для этого в постгресе почти всё есть.
а желание ваше пользоваться таким же, но непременно "с перл-амутровыми пуговками" -- это ваша блажь.

возможно, она (эта блажь) и виновата в чём-то, а возможно - и нет.
вы же ещё не отдиагностировали нормально ситуацию
берётесь за первый попавшийся бубен
а например настройки постгреса тут расписать, и соотвествующие параметры системы - даже не утрудились.


К сожалению, уже написано много метакода, которые описывает действия именно регулярками. И именно в Perl - нотации. Переводить это все в другую нотацию - практически нереально.

Дело именно в почти . Кстати, приведенные Вами пример SELECT regexp_matches('Республика Беларусь','(.*)(ка)(.*)','ig') разобьет мне на 'Республи' и 'Беларусь'. Мне же нужно именно 'Республик' и 'Беларусь'. Если более общо - выделить гласные на конце слова. Если 1, то 1, если их 2 - то 2. Это не единственная задача, просто наиболее часто встречающаяся.

Так что скорее всего буду писать сервис на компилирумом языке. Там хоть глаза меньше будут разбегаться. Но проблема в том, что в ближайшем будущем на это не будет времени, а результат нужен сейчас.
...
Рейтинг: 0 / 0
24.03.2014, 15:49:42
    #38594792
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakamaMaxim Boguk,

Экспериментировали, не помогает. Каждые 50 запросов реконнект. Для чистоты эксперимента делали даже новый объект коннекта. так что скорее всего дело именно в перле.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
           
            {
                _counter++;
                if (_counter > 50)
                {
                    _log.Write("Реконнект для профилактики памяти...");
                    _conn.Close();
                    _conn = new NpgsqlConnection(_connectionString);
                    _cmd.Connection = _conn;
                    _conn.Open();
                    index = WaitForReconnect();
                    _log.WriteLine("ОК");
                    _counter = 0;
                }
                _cmd.CommandText = cmdText;
                if (this.Debug) _log.WriteLine("Команда "+cmdText);
                index = Convert.ToInt64(_cmd.ExecuteScalar());

            }



perl живет внутри процесса коннекта к базе
при закрытии коннекта - он 100% и без вариантов освобождается...

а вот закрывает ли Npgsql нормально коннект - вопрос отдельный...
вы за PID в pg_stat_activity последите... если он меняется то все ок... если нет значит никакого реального закрытия коннекта не происходит
...
Рейтинг: 0 / 0
24.03.2014, 15:55:37
    #38594802
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
Maxim Boguk,

мысль хорошая, тоже посещала (может, он кэширует что-нибудь у себя), если бы не одно но: я давал аналогичную нагрузку на сервак в окне PGAdmin. Там то всяко никакого NpgSql. Память уходит так же, с той лишь разницей что работает только один процессор вместо 4х - соответсвенно, примерно в 4 раза медленне.
...
Рейтинг: 0 / 0
24.03.2014, 16:07:59
    #38594816
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
Maxim Boguk,

О, а вот Вы оказались правы. PID после реконнекта не менялся. То есть был коннект от NpgSql, но он некорректно отработал и на сервере коннект не закрыл. Буду ковырять документацию на библиотеку. Спасибо за идею!!!
...
Рейтинг: 0 / 0
24.03.2014, 16:17:56
    #38594827
kamakama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
Maxim Boguk,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                if (_counter > 50)
                {
                    _log.Write("Реконнект для профилактики памяти...");
                    _conn.Close();
                    _conn.ClearPool();
                    _conn.Dispose();
                    _conn = new NpgsqlConnection(_connectionString);
                    _cmd.Connection = _conn;
                    _conn.Open();
                    index = WaitForReconnect();
                    _log.WriteLine("ОК");
                    _counter = 0;
                }



В таком сочетаннии работает!!! Спасибо огромное !!!
...
Рейтинг: 0 / 0
24.03.2014, 16:25:29
    #38594837
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
1. я рад ,что максим оказался вам полезен.



но вот это вот:
kamakamaпропущено...

Дело именно в почти . Кстати, приведенные Вами пример SELECT regexp_matches('Республика Беларусь','(.*)(ка)(.*)','ig') разобьет мне на 'Республи' и 'Беларусь'.
Мне же нужно именно 'Республик' и 'Беларусь'.

и в чем проблема ?

Код: sql
1.
SELECT regexp_matches('Республика Беларусь','(.*к)[аие] *(.*)','ig')


kamakama Если более общо - выделить гласные на конце слова. Если 1, то 1, если их 2 - то 2. Это не единственная задача, просто наиболее часто встречающаяся.

это уже другая задача. и к ней как-раз первый подход логичнее прилаживается:
Код: sql
1.
SELECT regexp_matches('Республикой Беларусь','(.*к)([аеиоыэюяй]*) *(.*)','ig')
...
Рейтинг: 0 / 0
24.03.2014, 18:25:20
    #38595010
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
kamakama, попробуйте обновиться, в 9.2.8 исправили утечку в plperl:

http://www.postgresql.org/docs/9.2/static/release-9-2-8.html
• Fix memory leak in PL/Perl when returning a composite result, including multiple-OUT-parameter cases (Alex Hunsaker)
...
Рейтинг: 0 / 0
25.03.2014, 14:15:57
    #38595740
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти Postgres
Как всегда... Забыли основной посыл "обновитесь до последней минорной"...
Люблю Пг за это... "Ой а я на грабли наступил. Пг - говно. А вы поставьте свежую версию. Там грабли убрали. Извините, что разложили, но у нас нету такого разветвленного тестового отдела, как в Оракле".
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Утечка памяти Postgres / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]