|
|
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
Доброе время суток. Имеем PG 9.2.6 х64, собраный под Gentoo. Есть специальная программка (С#, Npgsql), дергающая в несколько потоков определнную и довольно сложную функцию PG, которая в свою очередь дергает еще несколько весьма ресурсоемких функций (расчетная математика), писаных на plperl и plpgsql. В функциях активно пользуются временные таблички, но они в конце каждого вызова функции изничтожаются. Каждые 100 вызовов в каждом потоке делается реконнект к БД. То есть все транзакции, какие могли быть - убиваются и на сервере должны очищаться (по идее). Однако этого не происходит - память на сервере течет по страшному (десяткам Мб/с). Мысли в голове закончились... 1) Течь памяти связана с тем, что после завершения транзакции не вся память высвободилась. Но по умолчанию одна команда - одна транзакция. Поэтому тут искать глухо. Или разработчики постреса в этом наврали 2) Подстраховывая предыдущий вариант - реконнект. Тут уж точно все должно убиваться однозначно. Однако не помогает. 3) Распускать мысли про то, что нужно параллелить и математикой сервер не грузить - не надо. Это делается, но не быстро, а результат нужен сейчас. У кого нибудь конструктивные мысли или кто сталкивался с подобным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 19:44:40 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakama, можете уточнить, что значит "память на сервере течет по страшному (десяткам Мб/с)" ? а также, откуда берёте цифры об объёме утекающей памяти? к чему приводит исчерпание [свободной] памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 20:45:51 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
buddy_ekb, Элементарно - сервер нагружается только моей задачей, монитор ресурсов системы все это и показывает. Даже клиент, которые у меня все дергает, стоит на другой машине. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 20:54:44 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
buddy_ekb, А приводит это сначала к забиванию оперативки в 16 гигов, потом к забиванию свопа аналогичного размера ну и в конечном финале - отказу сервера по помяти (PG переходит в режим восстановления, из которго так и не поднимается). На все про все - 30 минут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 20:56:58 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakama, похоже, вам стоит еще посмотреть, как обстоят дела с высвобождением памяти в perl, точнее, в вашем коде на perl. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 23:14:22 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakama, покажите вывод: show shared_buffers; select version (); также покажите пример утечки, типа: было: ps axu подключились, выполнили запрос, закрыли соединение и стало: ps axu ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 23:53:31 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
Ы, На переле написана только строковая обработка, конкретно - регулярки. Остальное -на 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2014, 10:11:28 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakama, похоже, что у вас действительно возникает утечка в perl'е в момент компиляции динамического регулярного выражения. можете ли вы переписать свой код на PHP/pcre ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:47:40 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakama, Вообще все что вы там делаете в перле - есть в нативном Пг. Через regex_replace и т.д. Насчет массивов - есть мнение что их не "отпускает". Надо посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 13:10:20 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
Warstone, нет, не все есть в нативном. Конкретно - нет пред и пост условий. Вида (?<=<meta content=['"])[А-Яа-я\s-«»'",\.A-Za-z:\r\n/—_\d]*(?=['"] property="og:image">) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:07:43 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
buddy_ekb, Вообще желания переписывать нет. А как можно изменить кода приведеных функций? С чисткой памяти. Просто сам с перлом не сильно знаком и эти функции писал не я ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:15:00 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakamaWarstone, нет, не все есть в нативном. Конкретно - нет пред и пост условий. Вида (?<=<meta content=['"])[А-Яа-я\s-«»'",\.A-Za-z:\r\n/—_\d]*(?=['"] property="og:image">) ну вам же предлагали 15292306 попользовать regexp_matches Код: sql 1. 2. хотя я не уверен, что руки у вас кривые только в одном месте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:41:58 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
qwwq, К сожалению, кривизна рук связана не только со мной, но и с принципиальной позицией отдельных разработчиков PG. То, что plperl имеет не самую лучшую реализацию (что растет из самой архитектуры перла) и то, что регулярки в исполнении plperl не делают явно то, что мне нужно привело к тому, что получилось. А то, что писать самому функцию на plperl, которая делает тоже самое, что и функция на plperl, лень - это что, кривизна? По хорошему, все это будет переписано на чем-то более правильном и более соотвествующем стандартам (С,С++), причем не только POSIX. Но сейчас имеем то, что имеем и вариантов немного. Итак, повторяю свой вопрос - есть ли возможность как нибудь зачищать память plperl принудительно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 15:08:10 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakamaqwwq, К сожалению, кривизна рук связана не только со мной, но и с принципиальной позицией отдельных разработчиков PG. То, что plperl имеет не самую лучшую реализацию (что растет из самой архитектуры перла) и то, что регулярки в исполнении plperl не делают явно то, что мне нужно привело к тому, что получилось. А то, что писать самому функцию на plperl, которая делает тоже самое, что и функция на plperl, лень - это что, кривизна? По хорошему, все это будет переписано на чем-то более правильном и более соотвествующем стандартам (С,С++), причем не только POSIX. Но сейчас имеем то, что имеем и вариантов немного. Итак, повторяю свой вопрос - есть ли возможность как нибудь зачищать память plperl принудительно? да конечно..... коннект закройте к базе и память освободится (вместе с процессом который коннект обслуживал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 15:13:25 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakamaqwwq, К сожалению, кривизна рук связана не только со мной, но и с принципиальной позицией отдельных разработчиков PG. <...> Итак, повторяю свой вопрос - есть ли возможность как нибудь зачищать память plperl принудительно? дык, а вы уверены, что проблема у вас именно с перлом ? то-то и оно, что вы начинаете решать задачу, до того, как её осознали. я только об этом. так вы многое нарешаете. если бы у вас стояла задача использовать перл (например вы тестером plperl-а были бы) -- все с вашим подходом было бы в порядке. но у вас стояли какие-то другие задачи - распарсить нечто (даже не обязательно - регулярками). для этого в постгресе почти всё есть. а желание ваше пользоваться таким же, но непременно "с перл-амутровыми пуговками" -- это ваша блажь. возможно, она (эта блажь) и виновата в чём-то, а возможно - и нет. вы же ещё не отдиагностировали нормально ситуацию берётесь за первый попавшийся бубен а например настройки постгреса тут расписать, и соотвествующие параметры системы - даже не утрудились. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 15:24:35 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Экспериментировали, не помогает. Каждые 50 запросов реконнект. Для чистоты эксперимента делали даже новый объект коннекта. так что скорее всего дело именно в перле. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 15:40:11 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
[quot qwwq]kamakamaто-то и оно, что вы начинаете решать задачу, до того, как её осознали. я только об этом. так вы многое нарешаете. если бы у вас стояла задача использовать перл (например вы тестером plperl-а были бы) -- все с вашим подходом было бы в порядке. но у вас стояли какие-то другие задачи - распарсить нечто (даже не обязательно - регулярками). для этого в постгресе почти всё есть. а желание ваше пользоваться таким же, но непременно "с перл-амутровыми пуговками" -- это ваша блажь. возможно, она (эта блажь) и виновата в чём-то, а возможно - и нет. вы же ещё не отдиагностировали нормально ситуацию берётесь за первый попавшийся бубен а например настройки постгреса тут расписать, и соотвествующие параметры системы - даже не утрудились. К сожалению, уже написано много метакода, которые описывает действия именно регулярками. И именно в Perl - нотации. Переводить это все в другую нотацию - практически нереально. Дело именно в почти . Кстати, приведенные Вами пример SELECT regexp_matches('Республика Беларусь','(.*)(ка)(.*)','ig') разобьет мне на 'Республи' и 'Беларусь'. Мне же нужно именно 'Республик' и 'Беларусь'. Если более общо - выделить гласные на конце слова. Если 1, то 1, если их 2 - то 2. Это не единственная задача, просто наиболее часто встречающаяся. Так что скорее всего буду писать сервис на компилирумом языке. Там хоть глаза меньше будут разбегаться. Но проблема в том, что в ближайшем будущем на это не будет времени, а результат нужен сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 15:48:32 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
kamakamaMaxim Boguk, Экспериментировали, не помогает. Каждые 50 запросов реконнект. Для чистоты эксперимента делали даже новый объект коннекта. так что скорее всего дело именно в перле. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. perl живет внутри процесса коннекта к базе при закрытии коннекта - он 100% и без вариантов освобождается... а вот закрывает ли Npgsql нормально коннект - вопрос отдельный... вы за PID в pg_stat_activity последите... если он меняется то все ок... если нет значит никакого реального закрытия коннекта не происходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 15:49:42 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, мысль хорошая, тоже посещала (может, он кэширует что-нибудь у себя), если бы не одно но: я давал аналогичную нагрузку на сервак в окне PGAdmin. Там то всяко никакого NpgSql. Память уходит так же, с той лишь разницей что работает только один процессор вместо 4х - соответсвенно, примерно в 4 раза медленне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 15:55:37 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, О, а вот Вы оказались правы. PID после реконнекта не менялся. То есть был коннект от NpgSql, но он некорректно отработал и на сервере коннект не закрыл. Буду ковырять документацию на библиотеку. Спасибо за идею!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 16:07:59 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В таком сочетаннии работает!!! Спасибо огромное !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 16:17:56 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
1. я рад ,что максим оказался вам полезен. но вот это вот: kamakamaпропущено... Дело именно в почти . Кстати, приведенные Вами пример SELECT regexp_matches('Республика Беларусь','(.*)(ка)(.*)','ig') разобьет мне на 'Республи' и 'Беларусь'. Мне же нужно именно 'Республик' и 'Беларусь'. и в чем проблема ? Код: sql 1. kamakama Если более общо - выделить гласные на конце слова. Если 1, то 1, если их 2 - то 2. Это не единственная задача, просто наиболее часто встречающаяся. это уже другая задача. и к ней как-раз первый подход логичнее прилаживается: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 16:25:29 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 18:25:20 |
|
||
|
Утечка памяти Postgres
|
|||
|---|---|---|---|
|
#18+
Как всегда... Забыли основной посыл "обновитесь до последней минорной"... Люблю Пг за это... "Ой а я на грабли наступил. Пг - говно. А вы поставьте свежую версию. Там грабли убрали. Извините, что разложили, но у нас нету такого разветвленного тестового отдела, как в Оракле". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 14:15:57 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38593727&tid=1998777]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
203ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 260ms |
| total: | 546ms |

| 0 / 0 |
