Postgres 4x plus lent qu'il ne l'était
Question
Nos performances Postgres ont chuté à 1/4 de ce qu'elles étaient, et nous ne pouvons pas comprendre pourquoi.
Nous avons deux machines avec un matériel identique (appelons-les A et B) :
Intel(R) Xeon(R) CPU E5-4640 0 @ 2.40GHz (64 cores)
384 GB RAM
15k SAS, 16 disk RAID 10 array
Chaque machine possède des clusters Postgres essentiellement identiques avec environ 100 Go de bases de données, avec les paramètres suivants :
version: PostgreSQL 9.4.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11), 64-bit
bytea_output: escape
checkpoint_completion_target: 0.7
checkpoint_segments: 256
checkpoint_timeout: 30min
client_encoding: UTF8
cpu_index_tuple_cost: 0.001
cpu_operator_cost: 0.0005
cpu_tuple_cost: 0.003
DateStyle: ISO, MDY
default_text_search_config: pg_catalog.english
dynamic_shared_memory_type: posix
effective_cache_size: 128GB
from_collapse_limit: 4
hot_standby: on
join_collapse_limit: 4
lc_messages: en_US.UTF-8
lc_monetary: en_US.UTF-8
lc_numeric: en_US.UTF-8
lc_time: en_US.UTF-8
listen_addresses: *
log_destination: stderr
log_directory: pg_log
log_filename: postgresql-%Y-%m-%d_%H%M%S.log
log_line_prefix: < %m >
log_rotation_age: 1d
log_rotation_size: 0
log_timezone: US/Eastern
log_truncate_on_rotation: on
logging_collector: on
maintenance_work_mem: 1GB
max_connections: 256
max_replication_slots: 3
max_stack_depth: 2MB
max_standby_streaming_delay: 350min
max_wal_senders: 5
shared_buffers: 24GB
temp_buffers: 8MB
TimeZone: US/Eastern
wal_buffers: 4MB
wal_keep_segments: 5000
wal_level: hot_standby
work_mem: 96MB
Paramètres Linux :
CentOS 6.6
/sys/kernel/mm/redhat_transparent_hugepage/enabled: Always
/sys/kernel/mm/redhat_transparent_hugepage/enabled: Always
/sys/kernel/mm/redhat_transparent_hugepage/defrag: Always
/proc/sys/vm/dirty_background_ratio: 10
/sys/block/sda/queue/scheduler: cfq
/sys/block/sda/queue/read_ahead_kb: 128
blockdev --report:
RO RA SSZ BSZ StartSec Size Device
rw 256 512 4096 0 2395518009344 /dev/sda
rw 256 512 4096 2048 1048576000 /dev/sda1
rw 256 512 4096 2050048 1792509214720 /dev/sda2
rw 256 512 4096 3503044608 314572800000 /dev/sda3
rw 256 512 4096 4117444608 149946368000 /dev/sda4
rw 256 512 4096 4410308608 137438953472 /dev/sda5
Je ne prétends pas comprendre tout cela.
Nous avons une réplication en streaming qui conserve une copie à chaud de A sur B.Cela met B sous une charge plus lourde, en particulier dans le département mémoire, et il entre en échange (donc clairement nous faisons quelque chose de mal, puisque nous avons 384 Go de RAM).
free -g (on A):
total used free shared buffers cached
Mem: 378 347 30 24 2 301
-/+ buffers/cache: 44 334
Swap: 127 1 126
free -g (on B):
total used free shared buffers cached
Mem: 378 366 11 49 2 340
-/+ buffers/cache: 23 354
Swap: 127 1 126
La charge est généralement de 5 ou 10, mais elle peut parfois atteindre 30 à 60 pendant quelques heures lorsque des opérations intensives de reporting ou de base de données sont effectuées.
La sauvegarde de l’intégralité de la base de données prenait environ 1 heure, elle en prend désormais environ 4.
La synchronisation de la base de données de A vers B (B est utilisé pour le développement et nous actualisons les données en direct de A à B) prenait environ 1 heure, maintenant cela prend environ 4 heures.
Les requêtes qui prenaient 30 secondes (pendant des années) ont commencé à se bloquer pendant des jours sans revenir (l'augmentation de work_mem pour cette requête a résolu ce problème : La requête Postgres 9.4.4 prend une éternité).
Nous avons des sites Web et des processus Tomcat qui s'exécutent, en utilisant C3P0 pour le pooling, et des sites et processus Apache/PHP qui s'exécutent, en utilisant pgBouncer pour le pooling.Nous avons également envisagé que Tomcat utilise pgBouncer.
Nous avons envisagé d'essayer de réduire notre nombre maximal de connexions de 256 à 64 (256 date d'avant que nous utilisions le pool de connexions).
Nos paramètres actuels proviennent d'une combinaison de pgtune et de recherche, mais ma confiance dans notre configuration actuelle n'est pas élevée, et la baisse des performances n'aide pas cette confiance.
Des recommandations ?Des informations supplémentaires sont nécessaires ?
Mise à jour
Sortie d'iostat :
Server A
Linux 2.6.32-504.23.4.el6.x86_64 (openlink1.radyn.com) 08/05/2015 _x86_64_ (64 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
27.09 0.03 1.15 0.06 0.00 71.67
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 258.93 2136.65 20871.52 4370455736 42692153072
Server B
Linux 2.6.32-504.23.4.el6.x86_64 (openlink2.radyn.com) 08/05/2015 _x86_64_ (64 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
26.90 0.00 1.58 0.17 0.00 71.35
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 459.18 12641.47 17765.60 28973539688 40717751832
Sortie de vmstat :
Server A
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 0 1297844 8265380 2688960 333189664 0 0 17 163 0 0 27 1 72 0 0
Server B
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
9 0 3321548 16228276 2221908 349418368 0 0 99 139 0 0 27 2 71 0 0
Sortie de sar :
Server A
Linux 2.6.32-504.23.4.el6.x86_64 (openlink1.radyn.com) 08/05/2015 _x86_64_ (64 CPU)
12:00:01 AM CPU %user %nice %system %iowait %steal %idle
12:10:01 AM all 13.25 0.00 1.05 0.04 0.00 85.66
12:20:01 AM all 11.98 0.00 0.53 0.03 0.00 87.46
12:30:01 AM all 11.86 0.00 0.67 0.03 0.00 87.43
12:40:01 AM all 12.33 0.00 0.94 0.04 0.00 86.68
12:50:01 AM all 11.39 0.00 0.52 0.06 0.00 88.03
01:00:01 AM all 13.58 0.00 1.28 0.03 0.00 85.11
01:10:01 AM all 13.37 0.00 0.82 0.02 0.00 85.79
01:20:01 AM all 11.74 0.00 0.54 0.01 0.00 87.70
01:30:01 AM all 12.00 0.00 0.70 0.02 0.00 87.28
01:40:01 AM all 13.10 0.00 0.80 0.02 0.00 86.08
01:50:01 AM all 13.19 0.00 1.06 0.02 0.00 85.73
02:00:02 AM all 15.62 0.00 1.55 0.03 0.00 82.80
02:10:01 AM all 18.72 0.00 2.98 0.03 0.00 78.27
02:20:02 AM all 15.95 0.12 2.33 0.05 0.00 81.55
02:30:01 AM all 13.58 0.01 0.89 0.01 0.00 85.51
02:40:01 AM all 19.23 0.00 1.91 0.05 0.00 78.80
02:50:02 AM all 23.95 0.00 0.92 0.05 0.00 75.08
03:00:01 AM all 13.69 0.00 0.59 0.01 0.00 85.72
03:10:01 AM all 12.87 0.00 0.49 0.01 0.00 86.64
03:20:01 AM all 12.18 0.00 0.69 0.02 0.00 87.11
03:30:01 AM all 11.82 0.74 0.70 0.05 0.00 86.69
03:40:01 AM all 62.02 0.00 2.18 0.01 0.00 35.79
03:50:01 AM all 72.96 0.00 0.71 0.00 0.00 26.32
04:00:01 AM all 71.97 0.00 0.72 0.00 0.00 27.30
04:10:01 AM all 71.71 0.00 0.71 0.00 0.00 27.57
04:20:01 AM all 72.40 0.00 0.80 0.01 0.00 26.80
04:30:01 AM all 68.69 0.00 1.24 0.00 0.00 30.07
04:40:01 AM all 68.68 0.00 1.12 0.02 0.00 30.18
04:50:01 AM all 72.59 0.00 0.79 0.00 0.00 26.62
05:00:01 AM all 72.09 0.00 0.81 0.00 0.00 27.10
05:10:01 AM all 72.61 0.00 0.79 0.00 0.00 26.59
05:20:01 AM all 72.19 0.00 0.83 0.00 0.00 26.98
05:30:01 AM all 75.98 0.00 1.14 0.00 0.00 22.87
05:40:02 AM all 73.85 0.00 1.19 0.00 0.00 24.96
05:50:02 AM all 73.47 0.00 1.21 0.00 0.00 25.32
06:00:01 AM all 75.27 0.00 1.24 0.00 0.00 23.49
06:10:01 AM all 76.56 0.00 1.18 0.00 0.00 22.25
06:20:01 AM all 77.06 0.20 1.24 0.00 0.00 21.50
06:30:01 AM all 76.44 0.00 1.29 0.00 0.00 22.27
06:40:01 AM all 77.16 0.00 1.44 0.00 0.00 21.39
06:50:01 AM all 76.88 0.00 1.18 0.00 0.00 21.94
07:00:01 AM all 76.28 0.00 1.12 0.00 0.00 22.60
07:10:01 AM all 49.72 0.00 1.49 0.11 0.00 48.67
07:20:01 AM all 12.78 0.00 1.01 0.00 0.00 86.21
07:30:01 AM all 14.26 0.00 1.04 0.00 0.00 84.70
07:40:01 AM all 15.19 0.00 1.11 0.00 0.00 83.70
07:50:01 AM all 12.85 0.00 0.98 0.00 0.00 86.17
08:00:01 AM all 14.24 0.00 0.94 0.00 0.00 84.82
08:10:01 AM all 13.09 0.00 0.98 0.00 0.00 85.93
08:20:01 AM all 13.16 0.00 0.88 0.00 0.00 85.96
08:30:01 AM all 9.87 0.00 0.53 0.00 0.00 89.60
08:40:01 AM all 8.41 0.00 0.66 0.00 0.00 90.92
08:50:01 AM all 10.09 0.00 0.75 0.00 0.00 89.16
09:00:01 AM all 7.66 0.00 0.52 0.00 0.00 91.82
09:10:01 AM all 6.68 0.00 0.43 0.00 0.00 92.89
09:10:01 AM CPU %user %nice %system %iowait %steal %idle
09:20:01 AM all 7.20 0.00 0.41 0.00 0.00 92.39
09:30:01 AM all 6.74 0.00 0.44 0.00 0.00 92.82
09:40:01 AM all 6.70 0.00 0.43 0.00 0.00 92.87
09:50:01 AM all 8.12 0.00 0.54 0.04 0.00 91.30
10:00:01 AM all 10.44 0.00 0.60 0.02 0.00 88.93
10:10:01 AM all 10.86 0.00 0.60 0.01 0.00 88.53
10:20:01 AM all 14.46 0.00 0.77 0.06 0.00 84.72
10:30:01 AM all 9.31 0.13 0.84 0.10 0.00 89.63
10:40:02 AM all 10.45 0.00 0.81 0.11 0.00 88.63
Average: all 32.89 0.02 0.96 0.02 0.00 66.11
Server B
Linux 2.6.32-504.23.4.el6.x86_64 (openlink2.radyn.com) 08/05/2015 _x86_64_ (64 CPU)
12:00:01 AM CPU %user %nice %system %iowait %steal %idle
12:10:01 AM all 12.29 0.00 2.65 0.30 0.00 84.76
12:20:01 AM all 16.31 0.00 1.38 0.15 0.00 82.16
12:30:01 AM all 13.46 0.00 1.59 0.07 0.00 84.88
12:40:01 AM all 13.05 0.00 1.16 0.17 0.00 85.61
12:50:01 AM all 11.72 0.00 1.39 0.11 0.00 86.79
01:00:01 AM all 11.96 0.00 1.77 0.06 0.00 86.21
01:10:01 AM all 13.21 0.00 1.69 0.06 0.00 85.04
01:20:01 AM all 13.19 0.00 2.14 0.05 0.00 84.62
01:30:03 AM all 19.11 0.00 4.31 0.06 0.00 76.52
01:40:02 AM all 9.29 0.00 4.75 0.04 0.00 85.91
01:50:02 AM all 7.16 0.00 4.81 0.04 0.00 87.99
02:00:03 AM all 6.56 0.00 5.26 0.06 0.00 88.12
02:10:02 AM all 8.05 0.00 7.09 0.06 0.00 84.80
02:20:03 AM all 8.54 0.00 7.75 0.08 0.00 83.62
02:30:03 AM all 2.99 0.00 6.20 0.09 0.00 90.72
02:40:03 AM all 10.79 0.00 7.79 0.21 0.00 81.21
02:50:03 AM all 5.88 0.00 4.97 0.16 0.00 88.99
03:00:02 AM all 14.17 0.00 4.99 0.47 0.00 80.37
03:10:01 AM all 17.17 0.00 4.18 0.26 0.00 78.40
03:20:01 AM all 29.50 0.00 3.36 0.11 0.00 67.03
03:30:01 AM all 25.16 0.00 3.05 0.15 0.00 71.64
03:40:01 AM all 19.70 0.00 2.29 0.15 0.00 77.86
03:50:01 AM all 28.69 0.00 3.01 0.09 0.00 68.21
04:00:01 AM all 17.61 0.00 2.73 0.08 0.00 79.58
04:10:01 AM all 16.72 0.00 2.95 0.09 0.00 80.25
04:20:01 AM all 13.50 0.00 2.47 0.05 0.00 83.98
04:30:03 AM all 14.88 0.00 5.20 0.08 0.00 79.84
04:40:02 AM all 12.05 0.01 6.05 0.10 0.00 81.79
04:50:01 AM all 9.92 0.00 6.89 0.03 0.00 83.16
05:00:03 AM all 5.89 0.00 6.89 0.02 0.00 87.20
05:10:02 AM all 5.22 0.00 5.55 0.05 0.00 89.18
05:20:02 AM all 6.02 0.00 5.01 0.04 0.00 88.94
05:30:03 AM all 8.11 0.00 6.05 0.02 0.00 85.82
05:40:02 AM all 13.53 0.00 3.94 0.01 0.00 82.52
05:50:01 AM all 18.90 0.00 2.48 0.02 0.00 78.60
06:00:01 AM all 19.09 0.00 1.64 0.01 0.00 79.26
06:10:01 AM all 18.63 0.00 1.84 0.06 0.00 79.47
06:20:01 AM all 19.13 0.00 1.72 0.05 0.00 79.11
06:30:01 AM all 17.73 0.00 1.94 0.02 0.00 80.31
06:40:01 AM all 17.97 0.00 1.58 0.02 0.00 80.42
06:50:02 AM all 12.25 0.00 2.00 0.02 0.00 85.72
07:00:01 AM all 10.04 0.00 1.31 0.00 0.00 88.64
07:10:01 AM all 13.39 0.00 1.59 0.00 0.00 85.02
07:20:01 AM all 14.84 0.00 1.49 0.00 0.00 83.67
07:30:01 AM all 12.36 0.00 0.80 0.01 0.00 86.84
07:40:01 AM all 12.07 0.00 0.71 0.01 0.00 87.21
07:50:01 AM all 12.98 0.00 1.14 0.00 0.00 85.88
08:00:01 AM all 12.62 0.00 0.93 0.00 0.00 86.44
08:10:01 AM all 11.77 0.00 0.87 0.00 0.00 87.36
08:20:01 AM all 11.79 0.00 1.61 0.00 0.00 86.60
08:30:01 AM all 10.80 0.00 0.79 0.00 0.00 88.40
08:40:02 AM all 13.49 0.00 1.78 0.00 0.00 84.72
08:50:01 AM all 12.46 0.00 1.39 0.00 0.00 86.15
09:00:02 AM all 12.28 0.00 0.83 0.00 0.00 86.89
09:10:01 AM all 12.65 0.00 0.77 0.01 0.00 86.57
09:10:01 AM CPU %user %nice %system %iowait %steal %idle
09:20:01 AM all 12.44 0.00 0.78 0.00 0.00 86.78
09:30:01 AM all 12.96 0.00 1.01 0.00 0.00 86.03
09:40:01 AM all 11.71 0.00 0.80 0.00 0.00 87.49
09:50:01 AM all 15.23 0.00 2.04 0.06 0.00 82.67
10:00:01 AM all 14.60 0.00 1.66 0.02 0.00 83.72
10:10:01 AM all 13.97 0.00 2.76 0.01 0.00 83.26
10:20:01 AM all 15.34 0.00 1.51 0.01 0.00 83.14
10:30:01 AM all 12.84 0.00 1.34 0.80 0.00 85.03
10:40:01 AM all 12.96 0.00 1.43 0.81 0.00 84.80
10:50:01 AM all 14.48 0.00 1.47 0.85 0.00 83.20
Average: all 13.46 0.00 2.85 0.10 0.00 83.59
La solution
En fonction de vos configurations et de vos résultats, les seules suggestions que je peux vous faire essayer sont les suivantes.
Désactivez les pages énormes transparentes.Les preuves du Listes de diffusion PostgreSQL, et Red Hat eux-mêmes recommandent de désactiver THP pour les charges de travail de base de données ici
Ensemble
vm.zone_reclaim_mode=0
.Discussion iciRéglez votre ascenseur sur date limite depuis cfq.Red Hat recommande une date limite pour le stockage d'entreprise, ce qui semble être le cas.Discussion ici
Modification du paramètre
vm.dirty_background_ratio
àvm.dirty_background_bytes
etvm.dirty_bytes
.Les valeurs par défaut sont de 10 %, ce qui, étant donné vos 384 Go de RAM, représente 38,4 Go de RAM qui doivent être sales avant que le noyau ne commence à l'écrire en arrière-plan.Je définirais les valeurs sur 64 Mo et 50 % de la RAM du contrôleur, respectivement, bien que cela soit basé sur ma propre expérience anecdotique.
J'espère que certaines de ces suggestions fonctionneront pour vous.