Re: Performance features the 4th - Mailing list pgsql-hackers

From Jan Wieck
Subject Re: Performance features the 4th
Date
Msg-id 3FAED0FD.2020803@Yahoo.com
Whole thread Raw
In response to Re: Performance features the 4th  ("Matthew T. O'Connor" <matthew@zeut.net>)
List pgsql-hackers
Matthew T. O'Connor wrote:

> ----- Original Message -----
> From: "Jan Wieck" <JanWieck@Yahoo.com>
>> Tom Lane wrote:
>> > Gaetano and a couple of other people did experiments that seemed to show
>> > it was useful.  I think we'd want to change the shape of the knob per
>> > later suggestions (sleep 10 ms every N blocks, instead of N ms every
>> > block) but it did seem that there was useful bang for little buck there.
>>
>> I thought it was "sleep N ms every M blocks".
>>
>> Have we seen any numbers? Anything at all? Something that gives us a
>> clue by what factor one has to multiply the total time a "VACUUM
>> ANALYZE" takes, to get what effect in return?
>
> I have some time on sunday to do some testing.  Is there a patch that I can
> apply that implements either of the two options? (sleep 10ms every M blocks
> or sleep N ms every M blocks).
>
> I know Tom posted the original patch that sleept N ms every 1 block (where N
> is > 10 due to OS limitations).  Jan can you post a patch that has just the
> sleep code in it? Or should it be easy enough for me to cull out of the
> larger patch you posted?

Sorry for the delay, had to finish some other concept yesterday (will be
published soon).

The attached patch adds

     vacuum_group_delay_size = 10 (range 1-1000)
     vacuum_group_delay_msec = 0  (range 0-1000)

and does the sleeping via select(2). It does it only at the same places
where Tom had done the usleep() in his hack, so I guess there is still
some more to do besides the documentation, before it can be added to
7.4.1. But it should be enough to get some testing done.


Jan

--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#================================================== JanWieck@Yahoo.com #
Index: src/backend/access/nbtree/nbtree.c
===================================================================
RCS file: /home/pgsql/CvsRoot/pgsql-server/src/backend/access/nbtree/nbtree.c,v
retrieving revision 1.106
diff -c -b -r1.106 nbtree.c
*** src/backend/access/nbtree/nbtree.c    2003/09/29 23:40:26    1.106
--- src/backend/access/nbtree/nbtree.c    2003/11/09 23:39:36
***************
*** 27,32 ****
--- 27,40 ----
  #include "storage/smgr.h"


+ /*
+  * Variables for vacuum_group_delay option (in commands/vacuumlazy.c)
+  */
+ extern int    vacuum_group_delay_size;    /* vacuum N pages */
+ extern int    vacuum_group_delay_msec;    /* then sleep M msec */
+ extern int    vacuum_group_delay_count;
+
+
  /* Working state for btbuild and its callback */
  typedef struct
  {
***************
*** 610,615 ****
--- 618,632 ----

              CHECK_FOR_INTERRUPTS();

+             if (vacuum_group_delay_msec > 0)
+             {
+                 if (++vacuum_group_delay_count >= vacuum_group_delay_size)
+                 {
+                     PG_DELAY(vacuum_group_delay_msec);
+                     vacuum_group_delay_count = 0;
+                 }
+             }
+
              ndeletable = 0;
              page = BufferGetPage(buf);
              opaque = (BTPageOpaque) PageGetSpecialPointer(page);
***************
*** 736,741 ****
--- 753,769 ----
          Buffer        buf;
          Page        page;
          BTPageOpaque opaque;
+
+         CHECK_FOR_INTERRUPTS();
+
+         if (vacuum_group_delay_msec > 0)
+         {
+             if (++vacuum_group_delay_count >= vacuum_group_delay_size)
+             {
+                 PG_DELAY(vacuum_group_delay_msec);
+                 vacuum_group_delay_count = 0;
+             }
+         }

          buf = _bt_getbuf(rel, blkno, BT_READ);
          page = BufferGetPage(buf);
Index: src/backend/commands/vacuumlazy.c
===================================================================
RCS file: /home/pgsql/CvsRoot/pgsql-server/src/backend/commands/vacuumlazy.c,v
retrieving revision 1.32
diff -c -b -r1.32 vacuumlazy.c
*** src/backend/commands/vacuumlazy.c    2003/09/25 06:57:59    1.32
--- src/backend/commands/vacuumlazy.c    2003/11/09 23:40:13
***************
*** 88,93 ****
--- 88,100 ----
  static TransactionId OldestXmin;
  static TransactionId FreezeLimit;

+ /*
+  * Variables for vacuum_group_delay option (in commands/vacuumlazy.c)
+  */
+ int    vacuum_group_delay_size = 10;    /* vacuum N pages */
+ int    vacuum_group_delay_msec = 0;    /* then sleep M msec */
+ int    vacuum_group_delay_count = 0;
+

  /* non-export function prototypes */
  static void lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
***************
*** 228,233 ****
--- 235,249 ----

          CHECK_FOR_INTERRUPTS();

+         if (vacuum_group_delay_msec > 0)
+         {
+             if (++vacuum_group_delay_count >= vacuum_group_delay_size)
+             {
+                 PG_DELAY(vacuum_group_delay_msec);
+                 vacuum_group_delay_count = 0;
+             }
+         }
+
          /*
           * If we are close to overrunning the available space for
           * dead-tuple TIDs, pause and do a cycle of vacuuming before we
***************
*** 469,474 ****
--- 485,499 ----

          CHECK_FOR_INTERRUPTS();

+         if (vacuum_group_delay_msec > 0)
+         {
+             if (++vacuum_group_delay_count >= vacuum_group_delay_size)
+             {
+                 PG_DELAY(vacuum_group_delay_msec);
+                 vacuum_group_delay_count = 0;
+             }
+         }
+
          tblk = ItemPointerGetBlockNumber(&vacrelstats->dead_tuples[tupindex]);
          buf = ReadBuffer(onerel, tblk);
          LockBufferForCleanup(buf);
***************
*** 799,804 ****
--- 824,838 ----
                      hastup;

          CHECK_FOR_INTERRUPTS();
+
+         if (vacuum_group_delay_msec > 0)
+         {
+             if (++vacuum_group_delay_count >= vacuum_group_delay_size)
+             {
+                 PG_DELAY(vacuum_group_delay_msec);
+                 vacuum_group_delay_count = 0;
+             }
+         }

          blkno--;

Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /home/pgsql/CvsRoot/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.164.2.1
diff -c -b -r1.164.2.1 guc.c
*** src/backend/utils/misc/guc.c    2003/11/07 21:27:50    1.164.2.1
--- src/backend/utils/misc/guc.c    2003/11/09 23:27:49
***************
*** 73,78 ****
--- 73,80 ----
  extern int    CommitDelay;
  extern int    CommitSiblings;
  extern char *preload_libraries_string;
+ extern int    vacuum_group_delay_size;
+ extern int    vacuum_group_delay_msec;

  #ifdef HAVE_SYSLOG
  extern char *Syslog_facility;
***************
*** 1188,1193 ****
--- 1190,1213 ----
          },
          &log_min_duration_statement,
          -1, -1, INT_MAX / 1000, NULL, NULL
+     },
+
+     {
+         {"vacuum_group_delay_msec", PGC_USERSET, RESOURCES,
+             gettext_noop("Sets VACUUM's delay in milliseconds between processing groups of pages."),
+             NULL
+         },
+         &vacuum_group_delay_msec,
+         0, 0, 1000, NULL, NULL
+     },
+
+     {
+         {"vacuum_group_delay_size", PGC_USERSET, RESOURCES,
+             gettext_noop("Sets VACUUM's group size for the vacuum_group_delay_msec option."),
+             NULL
+         },
+         &vacuum_group_delay_size,
+         10, 1, 1000, NULL, NULL
      },

      /* End-of-list marker */
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /home/pgsql/CvsRoot/pgsql-server/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.92
diff -c -b -r1.92 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample    2003/10/08 03:49:38    1.92
--- src/backend/utils/misc/postgresql.conf.sample    2003/11/09 23:04:21
***************
*** 69,74 ****
--- 69,79 ----
  #max_files_per_process = 1000    # min 25
  #preload_libraries = ''

+ # - Vacuum napping -
+
+ #vacuum_group_delay_size = 10    # range 1-1000 pages ; vacuum this many pages
+ #vacuum_group_delay_msec = 0    # range 0-1000 msec  ; then nap this long
+

  #---------------------------------------------------------------------------
  # WRITE AHEAD LOG
Index: src/include/miscadmin.h
===================================================================
RCS file: /home/pgsql/CvsRoot/pgsql-server/src/include/miscadmin.h,v
retrieving revision 1.134
diff -c -b -r1.134 miscadmin.h
*** src/include/miscadmin.h    2003/09/24 18:54:01    1.134
--- src/include/miscadmin.h    2003/11/09 23:02:03
***************
*** 96,101 ****
--- 96,111 ----
          CritSectionCount--; \
      } while(0)

+ /*
+  * Macro using select(2) to nap for milliseconds
+  */
+ #define PG_DELAY(_msec) \
+ { \
+     struct timeval _delay; \
+     _delay.tv_sec  = (_msec) / 1000; \
+     _delay.tv_usec = ((_msec) % 1000) * 1000; \
+     (void) select(0, NULL, NULL, NULL, &_delay);\
+ }

  /*****************************************************************************
   *      globals.h --                                                             *

pgsql-hackers by date:

Previous
From: Jan Wieck
Date:
Subject: Re: Performance features the 4th
Next
From: Christopher Kings-Lynne
Date:
Subject: Re: Coding help