Re : Solaris Performance - Profiling - Mailing list pgsql-general

From Mark kirkwood
Subject Re : Solaris Performance - Profiling
Date
Msg-id 1017386671.1274.12.camel@spikey.slithery.org
Whole thread Raw
Responses Re: Re : Solaris Performance - Profiling
List pgsql-general
I am attempting to produce a profile for a slow query run on Solaris -
(c.f previous thread titled "Solaris performance").

I am a bit confused about the the output I am seeing, as the times do not get anywhere close to the 1 hour elapsed time
thatthe query takes....(see "notes"  
section at the end for detail on the query)

I will confess to being a bit of a profile newbie... so if I missed something
important, please dont hesitate to put me right.

So anyway I thought I would put down here what I actually had...here goes ...
I tried 2 approaches - tracing via truss and profiling via gprof.

i) Tracing

Before profiling I used truss on the backend process, latter bits of the
output being : (left hand column is the time delta)

0.0003 read(40, "\0\0\0\087 KC4\b\0\0\0\t".., 8192)    = 8192
0.0009 lseek(40, 0x14796000, SEEK_SET)                 = 0x14796000
0.0002 read(40, "\0\0\0\080 t E90\0\0\0\t".., 8192)    = 8192
0.0094 read(43, "\0\0\0\0\0\0\0\0\0\0\0\0".., 8192)    = 8192
0.0154 read(43, "\0\0\0\0\0\0\0\0\0\0\0\0".., 8192)    = 8192
0.0155 read(43, "\0\0\0\0\0\0\0\0\0\0\0\0".., 8192)    = 8192
4992.4387       send(7, " P b l a n k\0 T\002 f 3".., 99, 0)    = 99
0.0012 recv(7, " Q S E L E C T   c u r r".., 8192, 0)  = 22
0.0011 lseek(36, 0, SEEK_END)                          = 8192
0.0013 send(7, " P b l a n k\0 T\001 t i".., 60, 0)    = 60
recv(7, 0x002929A8, 8192, 0)    (sleeping...)
46994.9585      recv(7, " X", 8192, 0)                          = 1

Including more librarys in the truss'ing showed thousands of loops, consisting
mainly of memcpy+memcmp, unfortunatly this file is _huge_ ... so I did not take
a copy of it (I am not sending this mail from the Solaris box....).

ii) Profiling

Rebuilt Postgresql with :
CFLAGS=-pg ./configure --disable-shared --prefix=/opt/pgsql

started up the database, ran the query and shut it down again.

A raw profile gmon.out was created, which I ran gprof on.


Call Graph for Top 10

granularity: each sample hit covers 4 byte(s) for 4.17% of 0.24 seconds

                                  called/total       parents
index  %time    self descendents  called+self    name        index
                                  called/total       children

                0.00        0.23       1/1           main [2]
[1]     95.8    0.00        0.23       1         PostmasterMain [1]
                0.00        0.22       1/1           pgstat_start [4]
                0.00        0.01       1/1           reset_shared [11]
                0.00        0.00       1/1           MemoryContextInit [41]
                0.00        0.00       1/1           checkDataDir [42]
                0.00        0.00       1/1           CreateOptsFile [43]
                0.00        0.00       1/12          AllocSetContextCreate [24]
                0.00        0.00       1/1           ProcessConfigFile [46]
                0.00        0.00       1/1           StreamServerPort [47]
                0.00        0.00      11/25          pqsignal [72]
                0.00        0.00       2/2           getenv [131]
                0.00        0.00       2/2           _getopt [4862]
                0.00        0.00       1/1           _umask [4891]
                0.00        0.00       1/5           _getpid [4841]
                0.00        0.00       1/1           EnableExceptionHandling [149]
                0.00        0.00       1/1           MemoryContextSwitchTo [163]
                0.00        0.00       1/1           ResetAllOptions [168]
                0.00        0.00       1/1           SetDataDir [170]
                0.00        0.00       1/1           IgnoreSystemIndexes [155]
                0.00        0.00       1/2           FindExec [122]
                0.00        0.00       1/1           CreateDataDirLockFile [143]
                0.00        0.00       1/1           RemovePgTempFiles [167]
                0.00        0.00       1/1           XLOGPathInit [172]
                0.00        0.00       1/1           DLNewList [148]
                0.00        0.00       1/1           pqinitmask [193]
                0.00        0.00       1/1           _sigprocmask [4884]
                0.00        0.00       1/1           pgstat_init [190]

-----------------------------------------------

                0.00        0.23       1/1           _start [3]
[2]     95.8    0.00        0.23       1         main [2]
                0.00        0.23       1/1           PostmasterMain [1]
                0.00        0.00       2/5           _geteuid [4840]
                0.00        0.00       1/1           save_ps_display_args [194]
                0.00        0.00       1/82          malloc [57]
                0.00        0.00       1/49          _strdup [4802]
                0.00        0.00       1/2           _getuid [4863]
                0.00        0.00       1/137         strlen [55]
                0.00        0.00       1/15          strcmp [83]

-----------------------------------------------

                                                     <spontaneous>
[3]     95.8    0.00        0.23                 _start [3]
                0.00        0.23       1/1           main [2]
                0.00        0.00       2/4           atexit [103]

-----------------------------------------------

                0.00        0.22       1/1           PostmasterMain [1]
[4]     91.7    0.00        0.22       1         pgstat_start [4]
                0.02        0.19       1/1           pgstat_main [5]
                0.00        0.01       1/2           _fork [15]
                0.00        0.00       2/4           fflush [104]
                0.00        0.00       1/1           on_exit_reset [188]
                0.00        0.00       1/1           ClosePostmasterPorts [142]
                0.00        0.00       1/1           exit [179]

-----------------------------------------------

                0.02        0.19       1/1           pgstat_start [4]
[5]     89.6    0.02        0.19       1         pgstat_main [5]
                0.00        0.17   30497/30497       select [6]
                0.02        0.00   30499/30556       _memset [9]
                0.00        0.01       1/2           _fork [15]
                0.00        0.00       1/1           pgstat_read_statsfile [32]
                0.00        0.00       1/1           pgstat_recv_bestart [33]
                0.00        0.00       1/8           hash_create [20]
                0.00        0.00       4/4           pgstat_write_statsfile [38]
                0.00        0.00       1/1           set_ps_display [49]
                0.00        0.00      14/25          pqsignal [72]
                0.00        0.00       6/6           _gettimeofday [4838]
                0.00        0.00       3/8           close [91]
                0.00        0.00       3/5           read [102]
                0.00        0.00       2/45          .div [61]
                0.00        0.00       2/17          .rem [75]
                0.00        0.00       1/2           _pipe [4864]
                0.00        0.00       1/1           init_ps_display [184]
                0.00        0.00       1/82          malloc [57]
                0.00        0.00       1/1           pgstat_recv_beterm [191]

-----------------------------------------------

                0.00        0.17   30497/30497       pgstat_main [5]
[6]     70.8    0.00        0.17   30497         select [6]
                0.00        0.17   30497/30497       _select [8]

-----------------------------------------------

                0.17        0.00   30497/30497       _select [8]
[7]     70.8    0.17        0.00   30497         _poll [7]

-----------------------------------------------

                0.00        0.17   30497/30497       select [6]
[8]     70.8    0.00        0.17   30497         _select [8]
                0.17        0.00   30497/30497       _poll [7]
                0.00        0.00       6/53          .mul [59]

-----------------------------------------------

                0.00        0.00       1/30556       CLOGShmemInit [44]
                0.00        0.00       1/30556       StreamServerPort [47]
                0.00        0.00       1/30556       pgstat_read_statsfile [32]
                0.00        0.00       1/30556       InitShmemAllocation [45]
                0.00        0.00       1/30556       LockMethodTableInit [27]
                0.00        0.00       1/30556       set_ps_display [49]
                0.00        0.00       2/30556       pgstat_add_backend [31]
                0.00        0.00       3/30556       XLOGShmemInit [40]
                0.00        0.00       9/30556       getiop [28]
                0.00        0.00      12/30556       MemoryContextCreate [25]
                0.00        0.00      25/30556       seg_alloc [21]
                0.02        0.00   30499/30556       pgstat_main [5]
[9]      8.3    0.02        0.00   30556         _memset [9]

-----------------------------------------------

                0.00        0.01       1/1           reset_shared [11]
[10]     4.2    0.00        0.01       1         CreateSharedMemoryAndSemaphores [10]
                0.00        0.01       1/1           IpcMemoryCreate [13]
                0.00        0.00       1/1           InitLockTable [26]
                0.00        0.00       1/1           InitShmemIndex [37]
                0.00        0.00       1/1           InitBufferPool [35]
                0.00        0.00       1/1           InitFreeSpaceMap [36]
                0.00        0.00       1/1           XLOGShmemInit [40]
                0.00        0.00       1/1           InitShmemAllocation [45]
                0.00        0.00       1/1           CLOGShmemInit [44]
                0.00        0.00       1/1           BufferShmemSize [139]
                0.00        0.00       1/1           LockShmemSize [162]
                0.00        0.00       1/1           XLOGShmemSize [173]
                0.00        0.00       1/1           CLOGShmemSize [140]
                0.00        0.00       1/2           LWLockShmemSize [127]
                0.00        0.00       1/2           SInvalShmemSize [128]
                0.00        0.00       1/1           FreeSpaceShmemSize [150]
                0.00        0.00       1/1           CreateSpinlocks [147]
                0.00        0.00       1/1           CreateLWLocks [144]
                0.00        0.00       1/1           InitLocks [157]
                0.00        0.00       1/1           InitProcGlobal [158]
                0.00        0.00       1/1           CreateSharedInvalidationState [145]
                0.00        0.00       1/1           PMSignalInit [164]

-----------------------------------------------


Flat Graph

granularity: each sample hit covers 4 byte(s) for 4.17% of 0.24 seconds

   %  cumulative    self              self    total
 time   seconds   seconds    calls  ms/call  ms/call name
 70.8       0.17     0.17    30497     0.01     0.01  _poll [7]
  8.3       0.19     0.02    30556     0.00     0.00  _memset [9]
  8.3       0.21     0.02        1    20.00   214.98  pgstat_main [5]
  4.2       0.22     0.01        2     5.00     5.00  _libc_fork [16]
  4.2       0.23     0.01        2     5.00     5.00  _syscall [17]
  4.2       0.24     0.01                            internal_mcount [14]
  0.0       0.24     0.00    30497     0.00     0.01  _select [8]
  0.0       0.24     0.00    30497     0.00     0.01  select [6]
  0.0       0.24     0.00     8008     0.00     0.00  LWLockAssign [51]
  0.0       0.24     0.00      442     0.00     0.00  strcasecmp [52]

Index by function name

  [61] .div               [4844] __open64           [4830] _xflsbuf
  [59] .mul               [4809] __sigaction         [174] assign_defaultxacti
  [75] .rem               [4869] __sigfillset        [175] assign_xlog_sync_me
 [136] .udiv              [4870] _atexit_init        [103] atexit
  [98] .umul              [4821] _cerror             [176] atfork_alloc
  [63] AllocSetAlloc      [4871] _chmod              [177] atfork_append
  [24] AllocSetContextCrea[4872] _cleanup             [79] call_hash
 [137] AllocSetFree       [4817] _close               [42] checkDataDir
  [62] AllocSetFreeIndex  [4859] _closedir           [178] check_nlspath_env
  [86] AllocSetInit       [4813] _doprnt              [56] cleanfree
  [39] AllocateFile       [4873] _doscan              [91] close
 [138] BasicOpenFile      [4801] _dowrite            [115] element_alloc
 [139] BufferShmemSize    [4825] _endopen            [179] exit
  [44] CLOGShmemInit      [4874] _exithandle          [92] fclose
 [140] CLOGShmemSize      [4810] _ferror_unlocked    [180] fcntl
 [141] ClearDateCache     [4819] _fflush_u           [104] fflush
 [142] ClosePostmasterPort[4860] _fflush_u_iops       [93] find_option
 [143] CreateDataDirLockFi[4861] _fileno              [29] fopen
 [144] CreateLWLocks      [4834] _findbuf             [80] fputc
 [121] CreateLockFile       [30] _findiop            [181] fputs
  [43] CreateOptsFile       [15] _fork               [130] fread
 [145] CreateSharedInvalid[4875] _fprintf             [73] free
  [10] CreateSharedMemoryA[4814] _free_unlocked      [116] free_mem
 [146] CreateSocketLockFil[4824] _fstat64            [182] free_name_value_lis
 [147] CreateSpinlocks    [4831] _fwrite_unlocked    [183] fscanf
 [148] DLNewList          [4835] _getc_unlocked       [94] fwrite
  [70] DynaHashAlloc      [4845] _getdents64         [105] get_mem
 [149] EnableExceptionHand[4876] _getegid            [131] getenv
 [122] FindExec           [4840] _geteuid             [28] getiop
 [109] FreeFile           [4877] _getgid              [20] hash_create
 [150] FreeSpaceShmemSize [4862] _getopt             [100] hash_estimate_size
 [151] GUC_yy_create_buffe[4841] _getpid              [81] hash_search
 [123] GUC_yy_flex_alloc  [4838] _gettimeofday       [101] hash_select_dirsize
 [124] GUC_yy_flush_buffer[4863] _getuid              [89] hash_seq_init
 [125] GUC_yy_get_next_buf[4826] _ioctl               [76] hash_seq_search
 [152] GUC_yy_get_previous[4827] _isatty              [95] hdefault
 [126] GUC_yy_init_buffer [4878] _libc_cond_init      [22] init_htab
 [110] GUC_yy_load_buffer_[4853] _libc_fcntl         [184] init_ps_display
  [53] GUC_yylex            [16] _libc_fork           [14] internal_mcount
 [153] GUC_yyrestart      [4815] _libc_mutex_init    [185] issock
 [154] GUC_yywrap         [4822] _libc_open          [186] keys_destruct
 [155] IgnoreSystemIndexes[4846] _libc_open64          [2] main
  [34] InitBufTable       [4854] _libc_rwlock_init    [57] malloc
  [35] InitBufferPool     [4811] _libc_sigaction     [187] mem_init
 [156] InitFreeList       [4879] _libc_thr_keycreate  [54] mutex_unlock
  [36] InitFreeSpaceMap   [4880] _lseek               [68] my_log2
  [26] InitLockTable      [4842] _lseek64            [132] number
 [157] InitLocks          [4799] _malloc_unlocked     [67] nvmatch
 [158] InitProcGlobal     [4881] _memccpy            [188] on_exit_reset
  [45] InitShmemAllocation[4798] _memcpy             [117] on_proc_exit
  [37] InitShmemIndex        [9] _memset             [118] on_shmem_exit
  [12] InternalIpcMemoryCr[4818] _morecore           [106] open
 [111] InternalIpcSemaphor[4797] _mutex_lock          [96] parse_int
 [159] IpcInitKeyAssignmen[4847] _opendir            [189] pfree
  [13] IpcMemoryCreate    [4864] _pipe                [31] pgstat_add_backend
 [112] IpcSemaphoreCreate    [7] _poll               [190] pgstat_init
 [113] IpcSemaphoreUnlock [4882] _private_sigprocmas   [5] pgstat_main
  [84] LWLockAcquire      [4883] _profil              [32] pgstat_read_statsfi
  [51] LWLockAssign       [4848] _putc_unlocked       [33] pgstat_recv_bestart
  [85] LWLockRelease      [4832] _read               [191] pgstat_recv_beterm
 [127] LWLockShmemSize    [4828] _readdir              [4] pgstat_start
 [160] LockMethodInit     [4829] _readdir64          [192] pgstat_sub_backend
  [27] LockMethodTableInit[4805] _realbufend          [38] pgstat_write_statsf
 [161] LockMethodTableRena[4849] _rename             [193] pqinitmask
 [162] LockShmemSize      [4806] _return_negone       [72] pqsignal
  [64] MemoryContextAlloc [4796] _return_zero         [82] putc
  [25] MemoryContextCreate[4803] _sbrk               [102] read
  [41] MemoryContextInit  [4804] _sbrk_unlocked       [60] realfree
 [163] MemoryContextSwitch   [8] _select             [133] realloc
 [114] NumLWLocks         [4839] _semctl             [107] rename
 [164] PMSignalInit       [4855] _semget              [11] reset_shared
   [1] PostmasterMain     [4856] _semop              [194] save_ps_display_arg
  [46] ProcessConfigFile  [4823] _semsys              [21] seg_alloc
 [165] ReadControlFile    [4836] _setbufend            [6] select
 [166] RecordSharedMemoryI[4837] _setorientation      [97] set_config_option
 [167] RemovePgTempFiles    [18] _shmat               [49] set_ps_display
 [168] ResetAllOptions      [19] _shmget              [74] sigvalid
 [169] SIBufferInit       [4812] _sigaction           [77] snprintf
 [128] SInvalShmemSize    [4816] _sigdelset           [99] sprintf
 [170] SetDataDir         [4808] _sigemptyset         [52] strcasecmp
  [65] ShmemAlloc         [4865] _sigfillset         [134] strcat
  [23] ShmemInitHash      [4884] _sigprocmask        [135] strchr
  [87] ShmemInitStruct    [4800] _smalloc             [83] strcmp
 [171] StreamClose        [4866] _so_bind             [58] strcpy
  [47] StreamServerPort   [4885] _so_connect          [88] string_hash
 [129] ValidateBinary     [4886] _so_getsockname      [55] strlen
  [48] ValidatePgVersion  [4887] _so_getsockopt       [78] strncpy
 [172] XLOGPathInit       [4888] _so_listen          [108] strrchr
  [40] XLOGShmemInit      [4889] _so_setsockopt       [90] strtol
 [173] XLOGShmemSize      [4857] _stat               [195] t_delete
[4807] ___errno           [4802] _strdup             [119] tag_hash
[4868] __doscan_u           [17] _syscall             [66] 1:tas
[4851] __fcntl            [4890] _sysconfig           [71] 1:tas
[4852] __filbuf           [4891] _umask               [69] thr_main
[4843] __flsbuf           [4867] _unlink             [120] write
[4858] __mul64            [4833] _write               [50] <cycle 1>
[4820] __open             [4850] _wrtchk

Object modules

 1: /opt/pgsql/bin/postmaster


Notes
-----

i) Background

This query takes 30s on an old, slow Intel box (333Mhz) running Freebsd.
It takes about 1 hour on this Sparc box.
This suggested something not quite right somewhere.

ii) Platform Info

Sun E220 2x450Mhz Utlrasparc CPU + 2G memory.
OS + Postgresql is installed on 2x36G 15000 RPM Seagate Cheetah drives
Remaining IO subsystem is fibre to a Compaq SAN (RAID 5).
The Postgresql database files are located on this SAN system.


iii) Version Info

db1=# SELECT version();
                            version
----------------------------------------------------------------
 PostgreSQL 7.2 on sparc-sun-solaris2.8, compiled by GCC 2.95.2
(1 row)


iv) Tables And Indexes

CREATE TABLE dim0  ( d0key            INTEGER,
                     f1               TIMESTAMP,
                     f2               VARCHAR(20),
                     f3               VARCHAR(20)
                   );

CREATE TABLE fact0 ( d0key            INTEGER,
                     d1key            INTEGER,
                     d2key            INTEGER,
                     val              INTEGER,
                     filler           TEXT
                   );

CREATE UNIQUE INDEX dim0_pk ON dim0 (d0key);
CREATE UNQIUE INDEX dim0_q1 ON dim0 (f1);
CREATE INDEX fact0_q1 ON fact0(d0key) ;


db1=# SELECT relname,tuples FROM pg_class WHERE relname IN
('dim0','fact0');

 relname | reltuples
---------+-----------
 dim0    |     10080
 fact0   |     1e+07
(2 rows)

v) Query Access Plan And Elapsed Time

db1=# EXPLAIN
SELECT
       d0.f3,
       count(f.val)
FROM dim0 d0,
     fact0 f
WHERE d0.d0key = f.d0key
AND   d0.f1 between '1999-12-01' AND '2000-02-29'
GROUP BY d0.f3
;

Aggregate  (cost=27560.60..27594.10 rows=670 width=18)
  ->  Group  (cost=27560.60..27577.35 rows=6700 width=18)
        ->  Sort  (cost=27560.60..27560.60 rows=6700 width=18)
              ->  Nested Loop  (cost=0.00..27134.84 rows=6700 width=18)
                    ->  Index Scan using dim0_q1 on dim0 d0  (cost=0.00..4.40
                        rows=87 width=10)
                    ->  Index Scan using fact0_q1 on fact0 f (cost=0.00..310.06
                        rows=77 width=8)

EXPLAIN
db1=# \i qtype1.sql
       timetz
--------------------
 18:54:43.366466+12
(1 row)

 f3 | count
----+-------
 01 | 30000
 02 | 28000
 12 | 30000
(3 rows)

       timetz
--------------------
 20:18:01.102664+12
(1 row)

vi)  Non Default Postgresql Server Parameters

shared_buffers=4000
sort_mem=10240
wal_buffers=100
wal_files=10




pgsql-general by date:

Previous
From: "Martin Dillard"
Date:
Subject: Great Bridge RDBMS comparisons
Next
From: Tom Lane
Date:
Subject: Re: Re : Solaris Performance - Profiling