pgbench - startup delay - Mailing list pgsql-patches

From Dave Page
Subject pgbench - startup delay
Date
Msg-id 475D931D.90001@postgresql.org
Whole thread Raw
Responses Re: pgbench - startup delay  (Alvaro Herrera <alvherre@alvh.no-ip.org>)
Re: pgbench - startup delay  (Neil Conway <neilc@samurai.com>)
List pgsql-patches
Whilst doing some profiling of the server I found it useful to add an
option to pgbench to introduce a delay between client connection setup
and the start of the benchmark itself to allow me time to attach the
profiler to one of the backends.

Attached is the patch in case anyone finds a use for it, or if it's
deemed to be generally useful enough for inclusion in 8.4.

Regards, Dave.
Index: doc/src/sgml/pgbench.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql/doc/src/sgml/pgbench.sgml,v
retrieving revision 1.4
diff -c -r1.4 pgbench.sgml
*** doc/src/sgml/pgbench.sgml    10 Dec 2007 05:32:51 -0000    1.4
--- doc/src/sgml/pgbench.sgml    10 Dec 2007 19:05:13 -0000
***************
*** 250,255 ****
--- 250,264 ----
        </entry>
       </row>
       <row>
+       <entry><literal>-w</literal> <replaceable>startup_delay</></entry>
+       <entry>
+        Pause for the specified number of seconds after creating the
+        client connections. This is useful to allow time to connect
+        a debugger or profiler to a backend server process before the
+        benchmark is run.
+       </entry>
+      </row>
+      <row>
        <entry><literal>-d</literal></entry>
        <entry>
         Print debugging output.
Index: contrib/pgbench/pgbench.c
===================================================================
RCS file: /projects/cvsroot/pgsql/contrib/pgbench/pgbench.c,v
retrieving revision 1.74
diff -c -r1.74 pgbench.c
*** contrib/pgbench/pgbench.c    15 Nov 2007 21:14:31 -0000    1.74
--- contrib/pgbench/pgbench.c    10 Dec 2007 18:58:55 -0000
***************
*** 188,194 ****
  static void
  usage(void)
  {
!     fprintf(stderr, "usage: pgbench [-h hostname][-p port][-c nclients][-t ntransactions][-s scaling_factor][-D
varname=value][-n][-C][-v][-S][-N][-ffilename][-l][-U login][-P password][-d][dbname]\n"); 
      fprintf(stderr, "(initialize mode): pgbench -i [-h hostname][-p port][-s scaling_factor] [-F fillfactor] [-U
login][-Ppassword][-d][dbname]\n"); 
  }

--- 188,194 ----
  static void
  usage(void)
  {
!     fprintf(stderr, "usage: pgbench [-h hostname][-p port][-c nclients][-t ntransactions][-s scaling_factor][-D
varname=value][-n][-C][-v][-S][-N][-ffilename][-l][-U login][-P password][-w startup_delay][-d][dbname]\n"); 
      fprintf(stderr, "(initialize mode): pgbench -i [-h hostname][-p port][-s scaling_factor] [-F fillfactor] [-U
login][-Ppassword][-d][dbname]\n"); 
  }

***************
*** 1163,1169 ****
  printResults(
               int ttype, CState * state,
               struct timeval * tv1, struct timeval * tv2,
!              struct timeval * tv3)
  {
      double        t1,
                  t2;
--- 1163,1169 ----
  printResults(
               int ttype, CState * state,
               struct timeval * tv1, struct timeval * tv2,
!              struct timeval * tv3, int startup_delay)
  {
      double        t1,
                  t2;
***************
*** 1174,1183 ****
      for (i = 0; i < nclients; i++)
          normal_xacts += state[i].cnt;

!     t1 = (tv3->tv_sec - tv1->tv_sec) * 1000000.0 + (tv3->tv_usec - tv1->tv_usec);
      t1 = normal_xacts * 1000000.0 / t1;

!     t2 = (tv3->tv_sec - tv2->tv_sec) * 1000000.0 + (tv3->tv_usec - tv2->tv_usec);
      t2 = normal_xacts * 1000000.0 / t2;

      if (ttype == 0)
--- 1174,1183 ----
      for (i = 0; i < nclients; i++)
          normal_xacts += state[i].cnt;

!     t1 = (tv3->tv_sec - (tv1->tv_sec + startup_delay)) * 1000000.0 + (tv3->tv_usec - tv1->tv_usec);
      t1 = normal_xacts * 1000000.0 / t1;

!     t2 = (tv3->tv_sec - (tv2->tv_sec + startup_delay)) * 1000000.0 + (tv3->tv_usec - tv2->tv_usec);
      t2 = normal_xacts * 1000000.0 / t2;

      if (ttype == 0)
***************
*** 1217,1222 ****
--- 1217,1224 ----
      struct timeval tv2;            /* after establishing all connections to the
                                   * backend */
      struct timeval tv3;            /* end time */
+
+     int         startup_delay = 0; /* Post-connect delay */

      int            i;

***************
*** 1258,1264 ****

      memset(state, 0, sizeof(*state));

!     while ((c = getopt(argc, argv, "ih:nvp:dc:t:s:U:P:CNSlf:D:F:")) != -1)
      {
          switch (c)
          {
--- 1260,1266 ----

      memset(state, 0, sizeof(*state));

!     while ((c = getopt(argc, argv, "ih:nvp:dc:t:s:U:P:CNSlf:D:F:w:")) != -1)
      {
          switch (c)
          {
***************
*** 1371,1376 ****
--- 1373,1386 ----
                      exit(1);
                  }
                  break;
+             case 'w':
+                 startup_delay = atoi(optarg);
+                    if (startup_delay < 0)
+                 {
+                     fprintf(stderr, "invalid startup_delay: %d\n", startup_delay);
+                     exit(1);
+                 }
+                 break;
              default:
                  usage();
                  exit(1);
***************
*** 1553,1558 ****
--- 1563,1580 ----
      /* time after connections set up */
      gettimeofday(&tv2, NULL);

+     if (startup_delay)
+     {
+         fprintf(stderr, "pausing for %d seconds...", startup_delay);
+  #ifndef WIN32
+         sleep(startup_delay);
+  #else
+         Sleep(startup_delay * 1000);
+  #endif
+         fprintf(stderr, "end.\n");
+
+     }
+
      /* process bultin SQL scripts */
      switch (ttype)
      {
***************
*** 1600,1606 ****
              disconnect_all(state);
              /* get end time */
              gettimeofday(&tv3, NULL);
!             printResults(ttype, state, &tv1, &tv2, &tv3);
              if (LOGFILE)
                  fclose(LOGFILE);
              exit(0);
--- 1622,1628 ----
              disconnect_all(state);
              /* get end time */
              gettimeofday(&tv3, NULL);
!             printResults(ttype, state, &tv1, &tv2, &tv3, startup_delay);
              if (LOGFILE)
                  fclose(LOGFILE);
              exit(0);

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: plpgsql, forc statement
Next
From: Alvaro Herrera
Date:
Subject: Re: pgbench - startup delay