Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nKQWM-00013e-R2 for pgsql-hackers@arkaria.postgresql.org; Wed, 16 Feb 2022 20:03:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nKQWL-0003tI-H6 for pgsql-hackers@arkaria.postgresql.org; Wed, 16 Feb 2022 20:03:25 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nKQWL-0003t9-0k for pgsql-hackers@lists.postgresql.org; Wed, 16 Feb 2022 20:03:25 +0000 Received: from mail-yb1-xb29.google.com ([2607:f8b0:4864:20::b29]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1nKQWI-0001vc-0I for pgsql-hackers@lists.postgresql.org; Wed, 16 Feb 2022 20:03:24 +0000 Received: by mail-yb1-xb29.google.com with SMTP id y6so8468757ybc.5 for ; Wed, 16 Feb 2022 12:03:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=he2mc2rnPmbLdKTJ3BaN8Z/goNIS4TElK5DHeZTYEOo=; b=L4Z5yZeMUgJINLjXdOWYngLL+wvvkoFQORCr+f0Tej/9PKagUjrRPk0f9AXnZ5nrhT Atefdzh6fsYDAFm6SVLD2oWGToP/sUEkoxDUQsmor9pjemKendTJkwQoUFkG3sKdKwv5 Hc/0/EyLjxmISc2zOE2vtveSexZ617kE9ODpz5aINSUEqlWldHj1pkY5j8L2G11iLXed HwrhK9X8F/CaRjCo8YSaO8hHttcvTXOE8rc5wOyDrmAxfbUddIhAYEAVzvJy0/vvVAAD YtBwvR7VTZvBpHqtT1hdiQb4G81IwebVJbBo8LS1jUqeSiK/bbAt+71/1zN3O5nX2qTS sYvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=he2mc2rnPmbLdKTJ3BaN8Z/goNIS4TElK5DHeZTYEOo=; b=wAxDOy/Od7v8kFu9vXMs2hVqDEuUWpd5mRJBOQLe0VSGXH1J7snFWenJLSlQqcMu31 ZrL3KOdpJ4y5OLHk7P+6L9Tjq2monI1XNKtz0Pt2yKMTqAVoPejm6VIOfqRQWrOQC2eb utzodu2LMBNRbYfFZa8sgdG9BuORQn2J2Mlxor3JfzmOZGEsyJUanXinSmvPirbikBjD Oxy7piCMMgrl/L8MUtOv57aL+6uzvROMOP3u7qvvKU67IUzJ/0qKdXF92nk2OBCfShYE zsqkG3WtJdKXJBSAsnM1mGfYEJBFJGewUs1EHykRLcMNbeY68K7w7ALGlPWJnK8P1T2t 3pMw== X-Gm-Message-State: AOAM530fXfQDwf15Asl1+k0s0F1yvkjkYmhZonlLXx+OycjAfY7kh0Bd ARXzUkWE9hqsSqOOa88iUw159IedpvpmEwLY04s= X-Google-Smtp-Source: ABdhPJyt59ZXcP/In7PYuBKPJZAuryDwESkqXKIm7sLqRVYHpWvquJaq8Zq4E84i9WmZHYTMKS8pqgR79cIFuytUMXs= X-Received: by 2002:a25:81c4:0:b0:623:8d8d:e21f with SMTP id n4-20020a2581c4000000b006238d8de21fmr3517123ybm.487.1645041800840; Wed, 16 Feb 2022 12:03:20 -0800 (PST) MIME-Version: 1.0 References: <2031846.1640792459@sss.pgh.pa.us> In-Reply-To: From: Matthias van de Meent Date: Wed, 16 Feb 2022 21:02:45 +0100 Message-ID: Subject: Re: Report checkpoint progress with pg_stat_progress_checkpoint (was: Report checkpoint progress in server logs) To: Nitin Jadhav Cc: Bharath Rupireddy , Bruce Momjian , Tom Lane , Magnus Hagander , PostgreSQL Hackers Content-Type: text/plain; charset="UTF-8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Thu, 10 Feb 2022 at 07:53, Nitin Jadhav wrote: > > > > We need at least a trace of the number of buffers to sync (num_to_scan) before the checkpoint start, instead of just emitting the stats at the end. > > > > > > Bharat, it would be good to show the buffers synced counter and the total buffers to sync, checkpointer pid, substep it is running, whether it is on target for completion, checkpoint_Reason > > > (manual/times/forced). BufferSync has several variables tracking the sync progress locally, and we may need some refactoring here. > > > > I agree to provide above mentioned information as part of showing the > > progress of current checkpoint operation. I am currently looking into > > the code to know if any other information can be added. > > Here is the initial patch to show the progress of checkpoint through > pg_stat_progress_checkpoint view. Please find the attachment. > > The information added to this view are pid - process ID of a > CHECKPOINTER process, kind - kind of checkpoint indicates the reason > for checkpoint (values can be wal, time or force), phase - indicates > the current phase of checkpoint operation, total_buffer_writes - total > number of buffers to be written, buffers_processed - number of buffers > processed, buffers_written - number of buffers written, > total_file_syncs - total number of files to be synced, files_synced - > number of files synced. > > There are many operations happen as part of checkpoint. For each of > the operation I am updating the phase field of > pg_stat_progress_checkpoint view. The values supported for this field > are initializing, checkpointing replication slots, checkpointing > snapshots, checkpointing logical rewrite mappings, checkpointing CLOG > pages, checkpointing CommitTs pages, checkpointing SUBTRANS pages, > checkpointing MULTIXACT pages, checkpointing SLRU pages, checkpointing > buffers, performing sync requests, performing two phase checkpoint, > recycling old XLOG files and Finalizing. In case of checkpointing > buffers phase, the fields total_buffer_writes, buffers_processed and > buffers_written shows the detailed progress of writing buffers. In > case of performing sync requests phase, the fields total_file_syncs > and files_synced shows the detailed progress of syncing files. In > other phases, only the phase field is getting updated and it is > difficult to show the progress because we do not get the total number > of files count without traversing the directory. It is not worth to > calculate that as it affects the performance of the checkpoint. I also > gave a thought to just mention the number of files processed, but this > wont give a meaningful progress information (It can be treated as > statistics). Hence just updating the phase field in those scenarios. > > Apart from above fields, I am planning to add few more fields to the > view in the next patch. That is, process ID of the backend process > which triggered a CHECKPOINT command, checkpoint start location, filed > to indicate whether it is a checkpoint or restartpoint and elapsed > time of the checkpoint operation. Please share your thoughts. I would > be happy to add any other information that contributes to showing the > progress of checkpoint. > > As per the discussion in this thread, there should be some mechanism > to show the progress of checkpoint during shutdown and end-of-recovery > cases as we cannot access pg_stat_progress_checkpoint in those cases. > I am working on this to use log_startup_progress_interval mechanism to > log the progress in the server logs. > > Kindly review the patch and share your thoughts. Interesting idea, and overall a nice addition to the pg_stat_progress_* reporting infrastructure. Could you add your patch to the current commitfest at https://commitfest.postgresql.org/37/? See below for some comments on the patch: > xlog.c @ checkpoint_progress_start, checkpoint_progress_update_param, checkpoint_progress_end > + /* In bootstrap mode, we don't actually record anything. */ > + if (IsBootstrapProcessingMode()) > + return; Why do you check against the state of the system? pgstat_progress_update_* already provides protections against updating the progress tables if the progress infrastructure is not loaded; and otherwise (in the happy path) the cost of updating the progress fields will be quite a bit higher than normal. Updating stat_progress isn't very expensive (quite cheap, really), so I don't quite get why you guard against reporting stats when you expect no other client to be listening. I think you can simplify this a lot by directly using pgstat_progress_update_param() instead. > xlog.c @ checkpoint_progress_start > + pgstat_progress_start_command(PROGRESS_COMMAND_CHECKPOINT, InvalidOid); > + checkpoint_progress_update_param(flags, PROGRESS_CHECKPOINT_PHASE, > + PROGRESS_CHECKPOINT_PHASE_INIT); > + if (flags & CHECKPOINT_CAUSE_XLOG) > + checkpoint_progress_update_param(flags, PROGRESS_CHECKPOINT_KIND, > + PROGRESS_CHECKPOINT_KIND_WAL); > + else if (flags & CHECKPOINT_CAUSE_TIME) > + checkpoint_progress_update_param(flags, PROGRESS_CHECKPOINT_KIND, > + PROGRESS_CHECKPOINT_KIND_TIME); > + [...] Could you assign the kind of checkpoint to a local variable, and then update the "phase" and "kind" parameters at the same time through pgstat_progress_update_multi_param(2, ...)? See BuildRelationExtStatistics in extended_stats.c for an example usage. Note that regardless of whether checkpoint_progress_update* will remain, the checks done in that function already have been checked in this function as well, so you can use the pgstat_* functions directly. > monitoring.sgml > + pg_stat_progress_checkpoint view will contain a > + single row indicating the progress of checkpoint operation. ... add "if a checkpoint is currently active". > + total_buffer_writes bigint > + total_file_syncs bigint The other progress tables use [type]_total as column names for counter targets (e.g. backup_total for backup_streamed, heap_blks_total for heap_blks_scanned, etc.). I think that `buffers_total` and `files_total` would be better column names. > + The checkpoint operation is requested due to XLOG filling. + The checkpoint was started because >max_wal_size< of WAL was written. > + The checkpoint operation is requested due to timeout. + The checkpoint was started due to the expiration of a >checkpoint_timeout< interval > + The checkpoint operation is forced even if no XLOG activity has occurred > + since the last one. + Some operation forced a checkpoint. > + checkpointing CommitTs pages CommitTs -> Commit time stamp Thanks for working on this. Kind regards, Matthias van de Meent