Re: About to add WAL write/fsync statistics to pg_stat_wal view
Masahiro Ikeda <ikedamsh@oss.nttdata.com>
From: Masahiro Ikeda <ikedamsh@oss.nttdata.com>
To: Fujii Masao <masao.fujii@oss.nttdata.com>
Cc: "David G. Johnston" <david.g.johnston@gmail.com>, PostgreSQL-development
<pgsql-hackers@postgresql.org>, Masahiko Sawada <sawada.mshk@gmail.com>, Li
Japin <japinli@hotmail.com>, kuroda.hayato@fujitsu.com
Date: 2021-03-03T05:33:03Z
Lists: pgsql-hackers
Attachments
- v11-0001-Add-statistics-related-to-write-sync-wal-records.patch (text/x-diff) patch v11-0001
- v11-0002-Makes-the-wal-receiver-report-WAL-statistics.patch (text/x-diff) patch v11-0002
On 2021-02-24 16:14, Fujii Masao wrote:
> On 2021/02/15 11:59, Masahiro Ikeda wrote:
>> On 2021-02-10 00:51, David G. Johnston wrote:
>>> On Thu, Feb 4, 2021 at 4:45 PM Masahiro Ikeda
>>> <ikedamsh@oss.nttdata.com> wrote:
>>>
>>>> I pgindented the patches.
>>>
>>> ... <function>XLogWrite</function>, which is invoked during an
>>> <function>XLogFlush</function> request (see ...). This is also
>>> incremented by the WAL receiver during replication.
>>>
>>> ("which normally called" should be "which is normally called" or
>>> "which normally is called" if you want to keep true to the original)
>>> You missed the adding the space before an opening parenthesis here
>>> and
>>> elsewhere (probably copy-paste)
>>>
>>> is ether -> is either
>>> "This parameter is off by default as it will repeatedly query the
>>> operating system..."
>>> ", because" -> "as"
>>
>> Thanks, I fixed them.
>>
>>> wal_write_time and the sync items also need the note: "This is also
>>> incremented by the WAL receiver during replication."
>>
>> I skipped changing it since I separated the stats for the WAL receiver
>> in pg_stat_wal_receiver.
>>
>>> "The number of times it happened..." -> " (the tally of this event is
>>> reported in wal_buffers_full in....) This is undesirable because ..."
>>
>> Thanks, I fixed it.
>>
>>> I notice that the patch for WAL receiver doesn't require explicitly
>>> computing the sync statistics but does require computing the write
>>> statistics. This is because of the presence of issue_xlog_fsync but
>>> absence of an equivalent pg_xlog_pwrite. Additionally, I observe
>>> that
>>> the XLogWrite code path calls pgstat_report_wait_*() while the WAL
>>> receiver path does not. It seems technically straight-forward to
>>> refactor here to avoid the almost-duplicated logic in the two places,
>>> though I suspect there may be a trade-off for not adding another
>>> function call to the stack given the importance of WAL processing
>>> (though that seems marginalized compared to the cost of actually
>>> writing the WAL). Or, as Fujii noted, go the other way and don't
>>> have
>>> any shared code between the two but instead implement the WAL
>>> receiver
>>> one to use pg_stat_wal_receiver instead. In either case, this
>>> half-and-half implementation seems undesirable.
>>
>> OK, as Fujii-san mentioned, I separated the WAL receiver stats.
>> (v10-0002-Makes-the-wal-receiver-report-WAL-statistics.patch)
>
> Thanks for updating the patches!
>
>
>> I added the infrastructure code to communicate the WAL receiver stats
>> messages between the WAL receiver and the stats collector, and
>> the stats for WAL receiver is counted in pg_stat_wal_receiver.
>> What do you think?
>
> On second thought, this idea seems not good. Because those stats are
> collected between multiple walreceivers, but other values in
> pg_stat_wal_receiver is only related to the walreceiver process running
> at that moment. IOW, it seems strange that some values show dynamic
> stats and the others show collected stats, even though they are in
> the same view pg_stat_wal_receiver. Thought?
OK, I fixed it.
The stats collected in the WAL receiver is exposed in pg_stat_wal view
in v11 patch.
> I notice that the patch for WAL receiver doesn't require explicitly
> computing the sync statistics but does require computing the write
> statistics. This is because of the presence of issue_xlog_fsync but
> absence of an equivalent pg_xlog_pwrite. Additionally, I observe that
> the XLogWrite code path calls pgstat_report_wait_*() while the WAL
> receiver path does not. It seems technically straight-forward to
> refactor here to avoid the almost-duplicated logic in the two places,
> though I suspect there may be a trade-off for not adding another
> function call to the stack given the importance of WAL processing
> (though that seems marginalized compared to the cost of actually
> writing the WAL). Or, as Fujii noted, go the other way and don't have
> any shared code between the two but instead implement the WAL receiver
> one to use pg_stat_wal_receiver instead. In either case, this
> half-and-half implementation seems undesirable.
I refactored the logic to write xlog file to unify collecting the write
stats.
As David said, although pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE)
is not called in the WAL receiver's path,
I agreed that the cost to write the WAL is much bigger.
Regards,
--
Masahiro Ikeda
NTT DATA CORPORATION
Commits
-
Send statistics collected during shutdown checkpoint to the stats collector.
- b82640df0062 14.0 landed
-
Force to send remaining WAL stats to the stats collector at walwriter exit.
- 33394ee6f243 14.0 landed
-
Track total amounts of times spent writing and syncing WAL data to disk.
- ff99918c625a 14.0 landed
-
Retry short writes when flushing WAL.
- 79ce29c734c6 9.4.0 cited