Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1smQTl-005dF3-EQ for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Sep 2024 04:21:50 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1smQTk-006Kxd-1p for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Sep 2024 04:21:48 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1smQTj-006KxV-Cs for pgsql-hackers@lists.postgresql.org; Fri, 06 Sep 2024 04:21:48 +0000 Received: from meldrar.postgresql.org ([2a02:c0:301:0:ffff::31]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1smQTg-000NjI-Az for pgsql-hackers@postgresql.org; Fri, 06 Sep 2024 04:21:46 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=postgresql.org; s=20171124; h=Content-Transfer-Encoding:Content-Type: Mime-Version:References:In-Reply-To:From:Subject:Cc:To:Message-Id:Date:Sender :Reply-To:Content-ID:Content-Description; bh=MtLn+GvI1c1bkcBKNjwDZix7lP2qjQHjef49rVFU/74=; b=1UY5t0A1bIwbqeD6sLwv2ZCMde nonEy5ovpbDSQR2l16lOBuJxvBQZ+TLc4kJZaBBYQKwaGf/3BoFpk/rmm0wTJkulemsUDNCjJnKrQ oFy5LYvOjhwSNlFMrgJZvdzdIAscrQVEC9+aBKgrSVd6MIsLAhh9pCXtbs60BGKLcAC+A9OJ39f6D 7giVmzvcmJMXMCvJHhuS7tJ9a1jW1OSbngTSWz4mFOSuhVeCU6c6HGYqY6AOr5Y+LEwjaq3du1Q3S qTo5u4uvJnRkewSk+hcOuvwI0d4OoQtEsWsGCH/4paIT8oA2hxrztLtXHcA39xl2D73E6izrpdcLF /5HhSYRA==; Received: from 185.184.178.217.shared.user.transix.jp ([217.178.184.185] helo=localhost) by meldrar.postgresql.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (Exim 4.94.2) (envelope-from ) id 1smQTa-000sR5-O8; Fri, 06 Sep 2024 04:21:42 +0000 Date: Fri, 06 Sep 2024 13:21:31 +0900 (JST) Message-Id: <20240906.132131.1196176059464159407.ishii@postgresql.org> To: dgrowleyml@gmail.com Cc: ashutosh.bapat.oss@gmail.com, pgsql-hackers@postgresql.org Subject: Re: Add memory/disk usage for WindowAgg nodes in EXPLAIN From: Tatsuo Ishii In-Reply-To: <20240905.143809.436581948007856565.ishii@postgresql.org> References: <20240710.183610.1211398886785110571.ishii@postgresql.org> <20240905.143809.436581948007856565.ishii@postgresql.org> X-Mailer: Mew version 6.8 on Emacs 26.3 Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Fri_Sep__6_13_21_31_2024_056)--" Content-Transfer-Encoding: 7bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk ----Next_Part(Fri_Sep__6_13_21_31_2024_056)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi David, >> I pushed the changes to WindowAgg so as not to call tuplestore_end() >> on every partition. Can you rebase this patch over that change? >> >> It would be good to do this in a way that does not add any new state >> to WindowAggState, you can see that I had to shuffle fields around in >> that struct because the next_parition field would have caused the >> struct to become larger. I've not looked closely, but I expect this >> can be done by adding more code to tuplestore_updatemax() to also >> track the disk space used if the current storage has gone to disk. I >> expect the maxSpace field can be used for both, but we'd need another >> bool field to track if the max used was by disk or memory. I have created a patch in the direction you suggested. See attached patch (v1-0001-Enhance-tuplestore.txt). To not confuse CFbot, the extension is "txt", not "patch". >> I think the performance of this would also need to be tested as it >> means doing an lseek() on every tuplestore_clear() when we've gone to >> disk. Probably that will be dominated by all the other overheads of a >> tuplestore going to disk (i.e. dumptuples() etc), but it would be good >> to check this. I suggest setting work_mem = 64 and making a test case >> that only just spills to disk. Maybe do a few thousand partitions >> worth of that and see if you can measure any slowdown. I copied your shell script and slightly modified it then ran pgbench with (1 10 100 1000 5000 10000) window partitions (see attached shell script). In the script I set work_mem to 64kB. It seems for 10000, 1000 and 100 partitions, the performance difference seems noises. However, for 10, 2, 1 partitions. I see large performance degradation with the patched version: patched is slower than stock master in 1.5% (10 partitions), 41% (2 partitions) and 55.7% (1 partition). See the attached graph. ----Next_Part(Fri_Sep__6_13_21_31_2024_056)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="v1-0001-Enhance-tuplestore.txt" From 4749d2018f33e883c292eb904f3253d393a47c99 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Thu, 5 Sep 2024 20:59:01 +0900 Subject: [PATCH v1] Enhance tuplestore. Let tuplestore_updatemax() handle both memory and disk case. --- src/backend/utils/sort/tuplestore.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/backend/utils/sort/tuplestore.c b/src/backend/utils/sort/tuplestore.c index 444c8e25c2..854121fc11 100644 --- a/src/backend/utils/sort/tuplestore.c +++ b/src/backend/utils/sort/tuplestore.c @@ -107,9 +107,10 @@ struct Tuplestorestate bool backward; /* store extra length words in file? */ bool interXact; /* keep open through transactions? */ bool truncated; /* tuplestore_trim has removed tuples? */ + bool inMem; /* true if maxSpace is for memory */ int64 availMem; /* remaining memory available, in bytes */ int64 allowedMem; /* total memory allowed, in bytes */ - int64 maxSpace; /* maximum space used in memory */ + int64 maxSpace; /* maximum space used in memory or disk */ int64 tuples; /* number of tuples added */ BufFile *myfile; /* underlying file, or NULL if none */ MemoryContext context; /* memory context for holding tuples */ @@ -262,6 +263,7 @@ tuplestore_begin_common(int eflags, bool interXact, int maxKBytes) state->eflags = eflags; state->interXact = interXact; state->truncated = false; + state->inMem = true; state->allowedMem = maxKBytes * 1024L; state->availMem = state->allowedMem; state->maxSpace = 0; @@ -1497,8 +1499,17 @@ static void tuplestore_updatemax(Tuplestorestate *state) { if (state->status == TSS_INMEM) + { state->maxSpace = Max(state->maxSpace, state->allowedMem - state->availMem); + state->inMem = true; + } + else + { + state->maxSpace = Max(state->maxSpace, + BufFileSize(state->myfile)); + state->inMem = false; + } } /* @@ -1509,7 +1520,7 @@ tuplestore_updatemax(Tuplestorestate *state) const char * tuplestore_storage_type_name(Tuplestorestate *state) { - if (state->status == TSS_INMEM) + if (state->inMem) return "Memory"; else return "Disk"; @@ -1517,8 +1528,7 @@ tuplestore_storage_type_name(Tuplestorestate *state) /* * tuplestore_space_used - * Return the maximum space used in memory unless the tuplestore has spilled - * to disk, in which case, return the disk space used. + * Return the maximum space used in memory or disk. */ int64 tuplestore_space_used(Tuplestorestate *state) @@ -1526,10 +1536,7 @@ tuplestore_space_used(Tuplestorestate *state) /* First, update the maxSpace field */ tuplestore_updatemax(state); - if (state->status == TSS_INMEM) - return state->maxSpace; - else - return BufFileSize(state->myfile); + return state->maxSpace; } /* @@ -1601,7 +1608,9 @@ writetup_heap(Tuplestorestate *state, void *tup) if (state->backward) /* need trailing length word? */ BufFileWrite(state->myfile, &tuplen, sizeof(tuplen)); - /* no need to call tuplestore_updatemax() when not in TSS_INMEM */ + /* update maxSpace */ + tuplestore_updatemax(state); + FREEMEM(state, GetMemoryChunkSpace(tuple)); heap_free_minimal_tuple(tuple); } -- 2.25.1 ----Next_Part(Fri_Sep__6_13_21_31_2024_056)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="bench.sh" dbname=test rows=10000 secs=10 ntests=3 psql -c "drop table if exists part_test;" $dbname psql -c "create table part_test (a int not null);" $dbname psql -c "insert into part_test select g.s from generate_series(1,$rows) g(s);" $dbname psql -c "vacuum freeze analyze part_test;" $dbname psql -c "alter system set work_mem = '64kB';" $dbname psql -c "alter system set jit = 0;" $dbname psql -c "select pg_reload_conf();" $dbname for c in 1 10 100 1000 5000 10000 do echo "SELECT a,count(*) OVER (PARTITION BY a / $c) FROM part_test OFFSET $rows" > bench.sql echo "Testing with $(($rows / $c)) partitions" for i in $(seq 1 $ntests) do pgbench -n -f bench.sql -M prepared -T $secs $dbname | grep latency done done ----Next_Part(Fri_Sep__6_13_21_31_2024_056)-- Content-Type: Image/Png Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="bench.png" 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 KKgiOd21+tpSHkXLqYzPJzpw2l8FC2W5cUxuPXVA++1H0em97Qe7+37Woh3pVLdBCaW2eCpd/prq Nm6gfvmmlf7Ydka28nFr9LS3WcrrE23YeFjWKnmunaGI1Lb1vyk8XUWVzeOmnxLYxrvXklDP3GE7 c3nIdjRclyxplC7NzbMYFzd8ru92RMtWNFZMvVa7R5HHVdL7Q61dt1/RVQtcPfyOWKd3nuqnv1t+ rlnt7jxOt3f7OovWrGDf7pl32O6jiVrD/fb7PYu8dNc+vVs/ftrkfsbaqsObN+uYtYKy3+jDP3Uh UX14pSvuyL2wqbEHgOSB4AUgebP4ys9XOv/HCi37LbsK5yyhvP5FVKaElz768XP9/EJR1UobqrUT B+v7Eynllvn6C93kt3em+rxbQMPaFJPn7i/1ypTtSt/oLT2ZWjeClyWgsV7s+I4aDuqgIRlGqG3Z 9IrY/5Mm9O2r2ZnH6LcfOyndri/Ur9lKVRoxQa8GFZG/TuvP7z7UiksF1OVxf1kstrg15miiF9u+ o0ajn9eIwu+rfYmU+vfXifrftEMq9uJnqp3ycoIBIDG15Ejgs0l32k6PEvYDcq8v9M3keWr2RgVF //GZBo0+o+p1UmnG7hBt+a+UUsSpvZF6tX5bjUZ10es5RujZ/JcV8tErenetlwaOzWU/GP/3Pgfy 9nXWzVVbme603d8XTNQaLBmb3le/3ytLbnto8vrq9n36b109nqnxHfvRIyDjPY61zf4/i3x3z1Cf 9/JraGt7H+75Sq9O3mrvw4F378OY9u62XenvXPP9jz0AJA8ELwDJmyWDgnp21KROU9SqXrC6fLFN 4+tmUuv3Jmptp0FqkmOy3DMWUu0eo/VOm+1quiRSUVde6K4cHQepxbF31bTUWh28lFaFA4fr2/GN 5W9ZGWsFfqo5erG+TTtAQ/5XWyOPXJB7QH5VbDJCC0d0vHrwW+89/TDpdb06votqvPKfLlj8lLVY DbX74nu9Xjrm13ACNY5drC/TvKR3ulTSkOORSpW9jBq88qNGv/y4fKxrbrOxiaglnjttp3121vYa P2mjOrzRXqVneitHhWc0aPIENTyYUmueHaNGTb30+csdVbhrrNrHLdJnqfrpnT71Ne60RRmKN9Ar 88apb8wlbPf9Tct3qtNyl+1em7hVWNKq3n31+72xBLS19+lvt+/TJt5a/OtA1b9TP97zWEcqMtJd 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 Ay7F4b0H2LRwAAAAAElFTkSuQmCC ----Next_Part(Fri_Sep__6_13_21_31_2024_056)----