Recientemente reemplazamos nuestro servidor de base de datos con una máquina actualizada con 4 CPU de cuatro núcleos y 32 Gb de ram. También reutilizamos nuestra vieja caja para servir como esclavo con la replicación de transmisión. Ambas cajas ejecutan CentOS 6.3 y PostgreSQL 9.2. Postgres es lo único que se ejecuta en cada una de las cajas.
Esta configuración ha estado vigente durante aproximadamente un mes, cuando de repente comenzamos a encontrarnos con algunos problemas cuando el tráfico comenzó a aumentar. Lo que hemos comenzado a ver es una carga de CPU extremadamente alta a veces (la parte superior muestra un promedio de carga de 270), y cuando podamos mirar pg_stat_activity
, veremos que la mayoría de nuestras conexiones están en el COMMIT
estado. Cuando se deja solo, esto finalmente terminará y el sistema se volverá receptivo con las conexiones IDLE
. Hemos intentado deshabilitar la replicación para ver si ese podría ser el problema, pero el problema aún persiste.
Hemos intentado diagnosticar lo que está sucediendo y estamos un poco perdidos. El resultado de la ejecución perf
muestra algo similar a continuación, y no tengo idea de lo que 0x347ba9
representa.
+ 41.40% 48154 postmaster 0x347ba9 f 0x347ba9 ◆
+ 9.55% 10956 postmaster 0x2dc820 f set_config_option ▒
+ 8.64% 9946 postmaster 0x5a3d4 f writeListPage
+ 5.75% 6609 postmaster 0x5a2b0 f ginHeapTupleFastCollect ▒
+ 2.68% 3084 postmaster 0x192483 f build_implied_join_equality ▒
+ 2.61% 2990 postmaster 0x187a55 f build_paths_for_OR ▒
+ 1.86% 2131 postmaster 0x794aa f get_collation_oid ▒
+ 1.56% 1822 postmaster 0x5a67e f ginHeapTupleFastInsert ▒
+ 1.53% 1766 postmaster 0x1929bc f distribute_qual_to_rels ▒
+ 1.33% 1558 postmaster 0x249671 f cmp_numerics
Ninguna de las consultas realizadas por la aplicación es particularmente compleja, con planes explicativos que toman como máximo 1 segundo (la mayoría son mucho más rápidos). Además, si bien esto sucede cuando el tráfico comienza a aumentar, no estamos hablando de una gran carga de tráfico (la máquina anterior solía ser capaz de manejarlo con bastante facilidad).
En este punto, estoy un poco perplejo sobre qué probar a continuación. Cualquier ayuda o sugerencias serán apreciadas. Si hay alguna información adicional que pueda ayudar, solo pregunte y puedo enmendar la pregunta.
Configuración de disco:
- Controlador RAID Perc 6i
- 5 unidades de disco duro SAS 146K 15K
- Configurado como 2x146GB RAID-1 para WAL y 3x146GB RAID-5 para Sistema y Datos
Actualizar:
A continuación se muestra la salida de VMStat cuando el sistema funciona normalmente y cuando la CPU se dispara. Cuando hay un problema, las interrupciones parecen dispararse.
Durante el funcionamiento normal:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 18938590 303763 21947154 0 0 28 52 7466 12649 2 1 97 0 0 2013-01-14 16:03:25 EST
0 0 0 18938396 303763 21947154 0 0 0 19 7107 12679 2 0 98 0 0 2013-01-14 16:03:35 EST
1 0 0 18938904 303763 21947162 0 0 0 54 7042 12708 1 1 99 0 0 2013-01-14 16:03:45 EST
1 0 0 18938520 303763 21947260 0 0 33 66 7120 12738 1 1 99 0 0 2013-01-14 16:03:55 EST
Cuando el uso de la CPU es alto:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
r b swpd free buff cache si so bi bo in cs us sy id wa st
343 0 0 32680468 226279 11339612 0 0 0 214 26692 12225 80 20 0 0 0 2013-01-11 16:45:53 EST
374 1 0 32673764 226291 11340345 0 0 0 77 54893 11572 80 20 0 0 0 2013-01-11 16:46:03 EST
383 0 0 32616620 226304 11340956 0 0 0 102 55540 12922 82 18 0 0 0 2013-01-11 16:46:13 EST
315 0 0 32602038 226320 11341378 0 0 0 79 54539 12441 82 18 0 0 0 2013-01-11 16:46:23 EST
perf
herramienta para hacer algunos perfiles en todo el sistema y algunos perfiles de PostgreSQL. Vea dónde se produce el uso de la CPU. Por cierto, el formato de su segundo vmstat
está irremediablemente destrozado, y las columnas del primero están desalineadas, por lo que es difícil de leer. Prueba para ver si agregar un commit_delay
mejora las cosas. Compruebe si su controlador RAID tiene una memoria caché de reescritura respaldada por batería y si no la tiene, obtenga una. ¿Pasa mucho tiempo adentro iowait
? Esto parece ser el uso de la CPU en algunos informes, pero en realidad no lo es.