Here is the list of tmp files:

postgres@pg-101a:~/17/main/base/pgsql_tmp$ ls -la
total 5422297
drwx------ 2 postgres postgres          9 Feb  3 04:08 .
drwx------ 8 postgres postgres          8 Jan 29 01:27 ..
-rw------- 1 postgres postgres 1073741824 Feb  3 04:05 pgsql_tmp196534.0
-rw------- 1 postgres postgres 1073741824 Feb  3 04:05 pgsql_tmp196534.1
-rw------- 1 postgres postgres 1073741824 Feb  3 04:05 pgsql_tmp196534.2
-rw------- 1 postgres postgres 1073741824 Feb  3 04:06 pgsql_tmp196534.3
-rw------- 1 postgres postgres 1073741824 Feb  3 04:07 pgsql_tmp196534.4
-rw------- 1 postgres postgres 1073741824 Feb  3 04:08 pgsql_tmp196534.5
-rw------- 1 postgres postgres  819396608 Feb  3 04:08 pgsql_tmp196534.6

With work_mem=4GB, all those files *on the destination node* seemed to
appear immediately with 4GB size and keep growing since then, while COPY
progresses on the source node (i.e. it looked like PG tried hard to utilize
work_mem, but after reaching the limit, dumped everything to pgsql_tmp
still).

The table structure being copied (just 1 index there):

CREATE TABLE mytable (
    id bigint NOT NULL PRIMARY KEY,
    snippet bytea,
    title bytea,
    updated_at timestamp with time zone,
    rich_snippet bytea
);

Directories sizes on the destination node while tablesync is working (it's
copied in to an almost empty database):

$ watch du -sh 17/main/base/* 17/main/pg_wal
2.2M    17/main/base/1
14G     17/main/base/16385
2.3M    17/main/base/16387
2.2M    17/main/base/4
2.3M    17/main/base/5
12G     17/main/base/pgsql_tmp
6.3G    17/main/pg_wal

So the question, why does it use temp files. Why not just writes directly
to WAL+data.


On Mon, Feb 3, 2025 at 3:04 AM Dmitry Koterov <dmitry.kote...@gmail.com>
wrote:

> Hi.
>
> 1. Those are temp files on the destination node (where the logical
> subscription exists and tablesync worker runs), not on the source. On the
> source, it’s all clear.
>
> 2. No “spill” suffix/substring in the file names. I tried to look at the
> content of these temp files, I I saw some text fragments from the original
> table’s text column there. I.e. it looks like for some reason, the stream
> received from the source node’s COPY command goes to that temp files (at
> least partially).
>
> 3. I made several more experiments, increasing work_mem to several GB (for
> the role which tablesync worker uses when copying) definitely helps with
> temp files.
>
> Thanks!
>
> On Sun, Feb 2, 2025 at 19:10 Amit Kapila <amit.kapil...@gmail.com> wrote:
>
>> On Sun, Feb 2, 2025 at 5:13 PM Dmitry Koterov <dmitry.kote...@gmail.com>
>> wrote:
>> >
>> > Trying to monitor perf during the initial tablesync phase (COPY) right
>> after CREATE SUBSCRIPTION. I noticed that the size of
>> 17/main/base/pgsql_tmp on the destination node grows (tens of gigabytes) as
>> the COPY command (running internally on the publisher) progresses. Then in
>> the end (when its "EXPLAIN SELECT 1 FROM tbl" on the destination shows the
>> approximate number of rows equals to the number of rows on the source node)
>> it hangs for several minutes, and then 17/main/base/pgsql_tmp empties, and
>> the subscription progresses.
>> >
>> > It seems like if I increase work_mem to several GB, then the growth of
>> 17/main/base/pgsql_tmp becomes less significant.
>> >
>> > Questions:
>> >
>> > 1. Are there some diagnostics commands that would allow me to figure
>> out what is in those tmp files? Why does the subscriber create those tmp
>> files and not just write directly to the data files and WAL? (The table has
>> 2 bytea columns, i.e. it's TOASTed for sure.)
>> >
>>
>> We do write spill files (ending with '.spill') if the changes are
>> large. Can you please share the name of tmp files to avoid any
>> assumptions?
>>
>> --
>> With Regards,
>> Amit Kapila.
>>
>

Reply via email to