This is just a repost as a (true) new thread.

At Mon, 30 Oct 2017 20:57:50 +0900 (Tokyo Standard Time), Kyotaro HORIGUCHI 
<horiguchi.kyot...@lab.ntt.co.jp> wrote in 
<20171030.205750.246076862.horiguchi.kyot...@lab.ntt.co.jp>
> At Fri, 20 Oct 2017 19:15:16 +0900, Masahiko Sawada <sawada.m...@gmail.com> 
> wrote in <CAD21AoAkaw-u0feAVN_VrKZA5tvzp7jT=mqcqp-svmegkxh...@mail.gmail.com>
> > >   n_mod_since_analyze          | 20000
> > > + vacuum_requred               | true
> > > + last_vacuum_oldest_xid       | 8023
> > > + last_vacuum_left_to_truncate | 5123
> > > + last_vacuum_truncated        | 387
> > >   last_vacuum                  | 2017-10-10 17:21:54.380805+09
> > >   last_autovacuum              | 2017-10-10 17:21:54.380805+09
> > > + last_autovacuum_status       | Killed by lock conflict
> > > ...
> > >   autovacuum_count             | 128
> > > + incomplete_autovacuum_count  | 53
> > >
> > > # The last one might be needless..
> > 
> > I'm not sure that the above informations will help for users or DBA
> > but personally I sometimes want to have the number of index scans of
> > the last autovacuum in the pg_stat_user_tables view. That value
> > indicates how efficiently vacuums performed and would be a signal to
> > increase the setting of autovacuum_work_mem for user.
> 
> Btree and all existing index AMs (except brin) seem to visit the
> all pages in every index scan so it would be valuable. Instead
> the number of visited index pages during a table scan might be
> usable. It is more relevant to performance than the number of
> scans, on the other hand it is a bit difficult to get something
> worth from the number in a moment. I'll show the number of scans
> in the first cut.
> 
> > > Where the "Killed by lock conflict" is one of the followings.
> > >
> > >    - Completed
> > >    - Truncation skipped
> > >    - Partially truncated
> > >    - Skipped
> > >    - Killed by lock conflict
> > >
> > > This seems enough to find the cause of a table bloat. The same
> > > discussion could be applied to analyze but it might be the
> > > another issue.
> > >
> > > There may be a better way to indicate the vacuum soundness. Any
> > > opinions and suggestions are welcome.
> > >
> > > I'm going to make a patch to do the 'formal' one for the time
> > > being.

Done with small modifications. In the attached patch
pg_stat_all_tables has the following new columns. Documentations
is not provided at this stage.

-----
  n_mod_since_analyze     | 0
+ vacuum_required         | not requried
  last_vacuum             | 
  last_autovacuum         | 2017-10-30 18:51:32.060551+09
  last_analyze            | 
  last_autoanalyze        | 2017-10-30 18:48:33.414711+09
  vacuum_count            | 0
+ last_vacuum_truncated   | 0
+ last_vacuum_untruncated | 0
+ last_vacuum_index_scans | 0
+ last_vacuum_oldest_xmin | 2134
+ last_vacuum_status      | agressive vacuum completed
+ autovacuum_fail_count   | 0
  autovacuum_count        | 5
  analyze_count           | 0
  autoanalyze_count       | 1
-----
Where each column shows the following infomation.

+ vacuum_required         | not requried

 VACUUM requirement status. Takes the following values.

  - partial
    Partial (or normal) will be performed by the next autovacuum.
    The word "partial" is taken from the comment for
    vacuum_set_xid_limits.

  - aggressive
    Aggressive scan will be performed by the next autovacuum.

  - required
    Any type of autovacuum will be performed. The type of scan is
    unknown because the view failed to take the required lock on
    the table. (AutoVacuumrequirement())

  - not required
    Next autovacuum won't perform scan on this relation.

  - not required (lock not acquired)

    Autovacuum should be disabled and the distance to
    freeze-limit is not known because required lock is not
    available.

  - close to freeze-limit xid
    Shown while autovacuum is disabled. The table is in the
    manual vacuum window to avoid anti-wraparound autovacuum.

+ last_vacuum_truncated | 0

  The number of truncated pages in the last completed
  (auto)vacuum.

+ last_vacuum_untruncated | 0
  The number of pages the last completed (auto)vacuum tried to
  truncate but could not for some reason.

+ last_vacuum_index_scans | 0
  The number of index scans performed in the last completed
  (auto)vacuum.

+ last_vacuum_oldest_xmin | 2134
  The oldest xmin used in the last completed (auto)vacuum.

+ last_vacuum_status      | agressive vacuum completed

  The finish status of the last vacuum. Takes the following
  values. (pg_stat_get_last_vacuum_status())

   - completed
     The last partial (auto)vacuum is completed.

   - vacuum full completed
     The last VACUUM FULL is completed.

   - aggressive vacuum completed
     The last aggressive (auto)vacuum is completed.

   - error while $progress
     The last vacuum stopped by error while $progress.
     The $progress one of the vacuum progress phases.

   - canceled while $progress
     The last vacuum was canceled while $progress

     This is caused by user cancellation of manual vacuum or
     killed by another backend who wants to acquire lock on the
     relation.

   - skipped - lock unavailable
     The last autovacuum on the relation was skipped because
     required lock was not available.

   - unvacuumable
     A past autovacuum tried vacuum on the relation but it is not
     vacuumable for reasons of ownership or accessibility problem.
     (Such relations are not shown in pg_stat_all_tables..)

+ autovacuum_fail_count   | 0
  The number of successive failure of vacuum on the relation.
  Reset to zero by completed vacuum.

======

In the patch, vacrelstats if pointed from a static variable and
cancel reporting is performed in PG_CATCH() section in vacuum().
Every unthrown error like lock acquisition failure is reported by
explicit pgstat_report_vacuum() with the corresponding finish
code.

Vacuum requirement status is calculated in AutoVacuumRequirment()
and returned as a string. Access share lock on the target
relation is required but it returns only available values if the
lock is not available. I decided to return incomplete (coarse
grained) result than wait for a lock that isn't known to be
relased in a short time for a perfect result.


regards,

-- 
Kyotaro Horiguchi
NTT Open Source Software Center



-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to