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

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

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

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

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

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

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

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

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

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

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

было:
ps axu

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

На переле написана только строковая обработка, конкретно - регулярки. Остальное -на 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
Утечка памяти Postgres
    #38594424
buddy_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kamakama,

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

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

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

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

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

Вообще желания переписывать нет. А как можно изменить кода приведеных функций? С чисткой памяти. Просто сам с перлом не сильно знаком и эти функции писал не я
...
Рейтинг: 0 / 0
Утечка памяти Postgres
    #38594661
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Утечка памяти Postgres
    #38594710
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

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

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

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

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

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

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

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

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

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


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

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

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

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

возможно, она (эта блажь) и виновата в чём-то, а возможно - и нет.
вы же ещё не отдиагностировали нормально ситуацию
берётесь за первый попавшийся бубен
а например настройки постгреса тут расписать, и соотвествующие параметры системы - даже не утрудились.
...
Рейтинг: 0 / 0
Утечка памяти Postgres
    #38594773
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Утечка памяти Postgres
    #38594788
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot qwwq]kamakamaто-то и оно, что вы начинаете решать задачу, до того, как её осознали.
я только об этом.
так вы многое нарешаете.

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

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

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

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


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

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

Так что скорее всего буду писать сервис на компилирумом языке. Там хоть глаза меньше будут разбегаться. Но проблема в том, что в ближайшем будущем на это не будет времени, а результат нужен сейчас.
...
Рейтинг: 0 / 0
Утечка памяти Postgres
    #38594792
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Утечка памяти Postgres
    #38594802
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

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

О, а вот Вы оказались правы. PID после реконнекта не менялся. То есть был коннект от NpgSql, но он некорректно отработал и на сервере коннект не закрыл. Буду ковырять документацию на библиотеку. Спасибо за идею!!!
...
Рейтинг: 0 / 0
Утечка памяти Postgres
    #38594827
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Утечка памяти Postgres
    #38594837
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Утечка памяти Postgres
    #38595010
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Утечка памяти Postgres
    #38595740
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как всегда... Забыли основной посыл "обновитесь до последней минорной"...
Люблю Пг за это... "Ой а я на грабли наступил. Пг - говно. А вы поставьте свежую версию. Там грабли убрали. Извините, что разложили, но у нас нету такого разветвленного тестового отдела, как в Оракле".
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Утечка памяти Postgres
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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