Hello,

We currently use psotgres 9.3 in our products. Recently we upgraded to
postgres 9.6. But with 9.6 we have seen a drastic reduction in throughput.
After analyzing carefully I found that "planner time" in 9.6 is very high.
Below are the details:

Scenario:
1 Create a table with 100000 rows.
2 Execute simple query: select * from subscriber where s_id = 100;
3 No update/delete/insert; tried vacuum, full vacuum; by default we enable
auto-vacuum

9.3: Avg of "Total runtime" : *0.24ms* [actual throughput: *650 TPS*]
9.6: Avg of Total time: *0.56ms* (Avg of "Planning time" : 0.38ms + Avg of
"Execution time" : 0.18ms) [actual throughput: *80 TPS*]

Check the attachments for more details.

Below is the configuration setting. Full configuration can be found in
attachment.
shared_buffers = 128MB
effective_cache_size = 256MB

Note that we use master-slave (one master - one slave) setup. I could see
no difference even when I take out slave.

I tried all possibilities of increasing shared memory, maitenance_work,
asynchronous commit etc. but, nothing showed any major improvements. Kindly
help to identify what is missing!

PS: We use postgres for small scale so the values are less. The size of the
DB is also just around 180MB.

-- 
Cheers,
Prakash
psql (9.3.14)
Type "help" for help.

perftestdb=# select count(*) from subscriber ;
 count  
--------
 100000
(1 row)

perftestdb=# \d subscriber
            Table "public.subscriber"
    Column    |         Type          | Modifiers 
--------------+-----------------------+-----------
 s_id         | integer               | not null
 sub_nbr      | character varying(15) | not null
 bit_1        | smallint              | 
 bit_2        | smallint              | 
 bit_3        | smallint              | 
 bit_4        | smallint              | 
 bit_5        | smallint              | 
 bit_6        | smallint              | 
 bit_7        | smallint              | 
 bit_8        | smallint              | 
 bit_9        | smallint              | 
 bit_10       | smallint              | 
 hex_1        | smallint              | 
 hex_2        | smallint              | 
 hex_3        | smallint              | 
 hex_4        | smallint              | 
 hex_5        | smallint              | 
 hex_6        | smallint              | 
 hex_7        | smallint              | 
 hex_8        | smallint              | 
 hex_9        | smallint              | 
 hex_10       | smallint              | 
 byte2_1      | smallint              | 
 byte2_2      | smallint              | 
 byte2_3      | smallint              | 
 byte2_4      | smallint              | 
 byte2_5      | smallint              | 
 byte2_6      | smallint              | 
 byte2_7      | smallint              | 
 byte2_8      | smallint              | 
 byte2_9      | smallint              | 
 byte2_10     | smallint              | 
 msc_location | integer               | 
 vlr_location | integer               | 
Indexes:
    "subscriber_pkey" PRIMARY KEY, btree (s_id)
    "subscriber_by_sub_nbr" UNIQUE, btree (sub_nbr)
Referenced by:
    TABLE "access_info" CONSTRAINT "access_info_s_id_fkey" FOREIGN KEY (s_id) 
REFERENCES subscriber(s_id)
    TABLE "special_facility" CONSTRAINT "special_facility_s_id_fkey" FOREIGN 
KEY (s_id) REFERENCES subscriber(s_id)

perftestdb=#  explain analyze select * from subscriber where s_id = 100;
                                                         QUERY PLAN             
                                             
-----------------------------------------------------------------------------------------------------------------------------
 Index Scan using subscriber_pkey on subscriber  (cost=0.29..8.31 rows=1 
width=88) (actual time=0.049..0.055 rows=1 loops=1)
   Index Cond: (s_id = 100)
 Total runtime: 0.231 ms
(3 rows)

perftestdb=#  explain analyze select * from subscriber where s_id = 100;
                                                         QUERY PLAN             
                                             
-----------------------------------------------------------------------------------------------------------------------------
 Index Scan using subscriber_pkey on subscriber  (cost=0.29..8.31 rows=1 
width=88) (actual time=0.059..0.066 rows=1 loops=1)
   Index Cond: (s_id = 100)
 Total runtime: 0.246 ms
(3 rows)

perftestdb=#  explain analyze select * from subscriber where s_id = 100;
                                                         QUERY PLAN             
                                             
-----------------------------------------------------------------------------------------------------------------------------
 Index Scan using subscriber_pkey on subscriber  (cost=0.29..8.31 rows=1 
width=88) (actual time=0.059..0.066 rows=1 loops=1)
   Index Cond: (s_id = 100)
 Total runtime: 0.249 ms
(3 rows)

perftestdb=#  explain analyze select * from subscriber where s_id = 100;
                                                         QUERY PLAN             
                                             
-----------------------------------------------------------------------------------------------------------------------------
 Index Scan using subscriber_pkey on subscriber  (cost=0.29..8.31 rows=1 
width=88) (actual time=0.056..0.062 rows=1 loops=1)
   Index Cond: (s_id = 100)
 Total runtime: 0.245 ms
(3 rows)



Configuration:
max_connections = 100
shared_buffers              = 128MB
effective_cache_size        = 256MB
checkpoint_segments         = 10
checkpoint_timeout          = 180s
wal_keep_segments           = 10
archive_command             = 'rm ./Archive_*; touch ./Archive_"%f"; exit 0'
archive_timeout             = 0
#-- Some helpful logging to detect deadlock and IO load
log_lock_waits              = on
log_checkpoints             = on
archive_mode                = on
tcp_keepalives_idle         = 15
tcp_keepalives_interval     = 5
tcp_keepalives_count        = 3
max_wal_senders             = 5
wal_level                   = hot_standby
hot_standby                 = on


# REST ALL PARAMETERS ARE DEFAULT
psql (9.6.0)
Type "help" for help.

perftestdb=# select count(*) from subscriber;
 count  
--------
 100000
(1 row)

perftestdb=# \d subscriber
            Table "public.subscriber"
    Column    |         Type          | Modifiers 
--------------+-----------------------+-----------
 s_id         | integer               | not null
 sub_nbr      | character varying(15) | not null
 bit_1        | smallint              | 
 bit_2        | smallint              | 
 bit_3        | smallint              | 
 bit_4        | smallint              | 
 bit_5        | smallint              | 
 bit_6        | smallint              | 
 bit_7        | smallint              | 
 bit_8        | smallint              | 
 bit_9        | smallint              | 
 bit_10       | smallint              | 
 hex_1        | smallint              | 
 hex_2        | smallint              | 
 hex_3        | smallint              | 
 hex_4        | smallint              | 
 hex_5        | smallint              | 
 hex_6        | smallint              | 
 hex_7        | smallint              | 
 hex_8        | smallint              | 
 hex_9        | smallint              | 
 hex_10       | smallint              | 
 byte2_1      | smallint              | 
 byte2_2      | smallint              | 
 byte2_3      | smallint              | 
 byte2_4      | smallint              | 
 byte2_5      | smallint              | 
 byte2_6      | smallint              | 
 byte2_7      | smallint              | 
 byte2_8      | smallint              | 
 byte2_9      | smallint              | 
 byte2_10     | smallint              | 
 msc_location | integer               | 
 vlr_location | integer               | 
Indexes:
    "subscriber_pkey" PRIMARY KEY, btree (s_id)
    "subscriber_by_sub_nbr" UNIQUE, btree (sub_nbr)
Referenced by:
    TABLE "access_info" CONSTRAINT "access_info_s_id_fkey" FOREIGN KEY (s_id) 
REFERENCES subscriber(s_id)
    TABLE "special_facility" CONSTRAINT "special_facility_s_id_fkey" FOREIGN 
KEY (s_id) REFERENCES subscriber(s_id)

perftestdb=# explain analyze select * from subscriber where s_id = 100;
                                                         QUERY PLAN             
                                             
-----------------------------------------------------------------------------------------------------------------------------
 Index Scan using subscriber_pkey on subscriber  (cost=0.29..8.31 rows=1 
width=88) (actual time=0.046..0.049 rows=1 loops=1)
   Index Cond: (s_id = 100)
 Planning time: 0.396 ms
 Execution time: 0.181 ms
(4 rows)

perftestdb=# explain analyze select * from subscriber where s_id = 100;
                                                         QUERY PLAN             
                                             
-----------------------------------------------------------------------------------------------------------------------------
 Index Scan using subscriber_pkey on subscriber  (cost=0.29..8.31 rows=1 
width=88) (actual time=0.036..0.038 rows=1 loops=1)
   Index Cond: (s_id = 100)
 Planning time: 0.354 ms
 Execution time: 0.160 ms
(4 rows)

perftestdb=# explain analyze select * from subscriber where s_id = 100;
                                                         QUERY PLAN             
                                             
-----------------------------------------------------------------------------------------------------------------------------
 Index Scan using subscriber_pkey on subscriber  (cost=0.29..8.31 rows=1 
width=88) (actual time=0.045..0.047 rows=1 loops=1)
   Index Cond: (s_id = 100)
 Planning time: 0.395 ms
 Execution time: 0.180 ms
(4 rows)

perftestdb=# explain analyze select * from subscriber where s_id = 100;
                                                         QUERY PLAN             
                                             
-----------------------------------------------------------------------------------------------------------------------------
 Index Scan using subscriber_pkey on subscriber  (cost=0.29..8.31 rows=1 
width=88) (actual time=0.045..0.048 rows=1 loops=1)
   Index Cond: (s_id = 100)
 Planning time: 0.392 ms
 Execution time: 0.180 ms
(4 rows)


Configuration:
max_connections = 100
shared_buffers              = 128MB
effective_cache_size        = 256MB
checkpoint_timeout          = 180s
wal_keep_segments           = 10
archive_command             = 'rm ./Archive_*; touch ./Archive_"%f"; exit 0'
archive_timeout             = 0
max_wal_size                = 40MB                      
min_wal_size                = 40MB
#-- Some helpful logging to detect deadlock and IO load
log_lock_waits              = on
log_checkpoints             = on
archive_mode                = on
tcp_keepalives_idle         = 15
tcp_keepalives_interval     = 5
tcp_keepalives_count        = 3
max_wal_senders             = 5
wal_level                   = hot_standby
hot_standby                 = on
wal_retrieve_retry_interval = 2s

# REST ALL PARAMETERS ARE DEFAULT
-- 
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