temporary table a únik paměti ?

20 views
Skip to first unread message

marian krucina

unread,
May 23, 2013, 5:46:00 AM5/23/13
to postgr...@googlegroups.com
Ahoj,

narazili jsme u dlouhotrvajících spojení na db server (sql dotaz co sekundu), že procesu na straně serveru pomalu ale stále roste paměť. Podle testů na 9.2.4 a 9.3beta1 jsme došli k temporary table, kdy jednoduchý 12 hodinový test vybral 150MB RAM. Nastavení postgresu vygenerováno přes initdb.

V příloze posílám testovací skripty.


Je to vlastnost/chyba postgresu, nebo děláme něco blbě?

díky
marian

postgres-leak-test.py
postgres-leak-test-bez-funkce.py

Pavel Stěhule

unread,
May 24, 2013, 10:10:37 AM5/24/13
to PostgreSQL-cz
Ahoj
>  postgres-leak-test.py
> 1KZobrazitStáhnout
>
>  postgres-leak-test-bez-funkce.py
> 1KZobrazitStáhnout

Osobně si myslím, že se jedná o vlastnost a spíš než o memory leak,
podle toho, co jsem zkoušel a jak různě rychle roste alokovaná paměť.
Pokud vím, tak proces nikdy nevrací paměť OS, takže z hlediska OS
alokace jenom roste. Interně, ale PG tuto paměť může používat.
Opakované vytvíření a rušení tabulek silně cvičí s tabulkou
pg_attribute a potažmo i ze systémovou cache, která jenom roste a
jednou za čas při vacuuu se resetuje, nicméně paměť se alokuje
rychleji a ve větším objemu než zabírá na disku.

V Postgresu je dočasná tabulka (ohledně uložení metadat) více-méně
normální tabulkou - a opakované vytváření a rušení tabulek (u mne cca
100 tab za sec) nepokryje autovacuum. Určitě nedoporučuji používat
dočasné tabulky tak, jak je ukázáno v testovacích příkladech. V
Postgresu je ideální dočasnou tabulku vytvořit na začátku session a
pak při používání ji, když je potřeba, truncatnout (u větších objemů)
nebo vymazat DELETEm (u menších tabulek). Truncate zbytečně zatěžuje
File System a navíc modifikuje systémové tabulky.

Performace:

cycle: CREATE TABLE, DROP TABLE ... 6300 iterací/min
CREATE TABLE, cycle: TRUNCATE ... 6600 iterací/min
CREATE TABLE, cycle: DELETE ... 36000 iterací/min

Pavel

marian krucina

unread,
May 27, 2013, 7:04:09 AM5/27/13
to postgr...@googlegroups.com
Děkuji za informaci. Budeme s tím počítat.

Pokud jde o vykon (pg9.2, temp tabulka s 10 řádky):
cycle: function(CREATE TABLE IF EXISTS, TRUNCATE) 2026 iterací/s
cycle: function(CREATE TABLE IF EXISTS, DELETE) 2665 iterací/s
CREATE TABLE IF EXISTS, cycle: function(TRUNCATE) 2039 iterací/s
CREATE TABLE IF EXISTS, cycle: function(DELETE) 2741 iterací/s
CREATE TYPE, cycle: function(ARRAY_AGG, UNNEST) 8674 iterací/s


(pg9.2, temp tabulka s 100 řádky):
cycle: function(CREATE TABLE IF EXISTS, TRUNCATE) 1837 iterací/s
cycle: function(CREATE TABLE IF EXISTS, DELETE) 407 iterací/s
CREATE TABLE IF EXISTS, cycle: function(TRUNCATE) 1828 iterací/s
CREATE TABLE IF EXISTS, cycle: function(DELETE) 409 iterací/s
CREATE TYPE, cycle: function(ARRAY_AGG, UNNEST) 2380 iterací/s


(pg9.2, temp tabulka s 1000 řádky):
cycle: function(CREATE TABLE IF EXISTS, TRUNCATE) 786 iterací/s
cycle: function(CREATE TABLE IF EXISTS, DELETE) 68 iterací/s
CREATE TABLE IF EXISTS, cycle: function(TRUNCATE) 749 iterací/s
CREATE TABLE IF EXISTS, cycle: function(DELETE) 69 iterací/s
CREATE TYPE, cycle: function(ARRAY_AGG, UNNEST) 270 iterací/s


marian



2013/5/24 Pavel Stěhule <pavel....@gmail.com>

Pavel

--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
Pokud chcete zrušit odběr skupiny, aby vám z ní již nechodily e-maily, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Další možnosti najdete na adrese https://groups.google.com/groups/opt_out.



Pavel Stěhule

unread,
May 28, 2013, 4:07:14 AM5/28/13
to PostgreSQL-cz


On 27 kvě, 13:04, marian krucina <marian.kruc...@gmail.com> wrote:
> Děkuji za informaci. Budeme s tím počítat.
>
> Pokud jde o vykon (pg9.2, temp tabulka s 10 řádky):
> cycle: function(CREATE TABLE IF EXISTS, TRUNCATE) 2026 iterací/s
> cycle: function(CREATE TABLE IF EXISTS, DELETE) 2665 iterací/s
> CREATE TABLE IF EXISTS, cycle: function(TRUNCATE) 2039 iterací/s
> CREATE TABLE IF EXISTS, cycle: function(DELETE) 2741 iterací/s
> CREATE TYPE, cycle: function(ARRAY_AGG, UNNEST) 8674 iterací/s
>
> (pg9.2, temp tabulka s 100 řádky):
> cycle: function(CREATE TABLE IF EXISTS, TRUNCATE) 1837 iterací/s
> cycle: function(CREATE TABLE IF EXISTS, DELETE) 407 iterací/s
> CREATE TABLE IF EXISTS, cycle: function(TRUNCATE) 1828 iterací/s
> CREATE TABLE IF EXISTS, cycle: function(DELETE) 409 iterací/s
> CREATE TYPE, cycle: function(ARRAY_AGG, UNNEST) 2380 iterací/s
>
> (pg9.2, temp tabulka s 1000 řádky):
> cycle: function(CREATE TABLE IF EXISTS, TRUNCATE) 786 iterací/s
> cycle: function(CREATE TABLE IF EXISTS, DELETE) 68 iterací/s
> CREATE TABLE IF EXISTS, cycle: function(TRUNCATE) 749 iterací/s
> CREATE TABLE IF EXISTS, cycle: function(DELETE) 69 iterací/s
> CREATE TYPE, cycle: function(ARRAY_AGG, UNNEST) 270 iterací/s
>

Vidite to take - v pg lze nekdy vyhodne pouzit pole misto docasnych
tabulek.

Pavel



> marian
>
> 2013/5/24 Pavel Stěhule <pavel.steh...@gmail.com>
Reply all
Reply to author
Forward
0 new messages