On 14/02/2019 6:18 AM, Carlos T. Groero Carmona wrote:
Horacio gracia spor su respuesta, abajo los comentarios despues de revisar cada uno de sus puntos.

On Mon, Feb 11, 2019 at 4:35 AM Horacio Miranda <hmira...@gmail.com <mailto:hmira...@gmail.com>> wrote:

    Creo que hay varios problemas aquí, podemos ver los más basicos.

Estoy de acuerdo, tratando de figurar cuales, y super agradecido por la ayuda brindada

    Revisa que las llaves Foraneas tengan indices.
    
https://dba.stackexchange.com/questions/121976/discover-missing-foreign-keys-and-or-indexes

Despues de usar la informaci'on en el link que me mandas y hacer una comparaci'on entre el uso de sequencias y de indeces, puedo decir que no tenemos falta de indices en la base de datos, o al menos solo 3 tablas han usado mas secuencias que indexes y el tamano de estas tablas es inferior a 10MB. Asi que creo que no es el uso de indices, tenemos de sobra, eso si puedo asegurarle, estoy tratando de revisar con el equipo de desarrollo y me aprueben quitar aquellos donde no se requieren o no se usan, tratando de aumentar la velocidad de escritura.

    Dices que tienes tablas particionadas, esto solo sirve si las
    consultas tienen en el Where el criterio de la particion, si son
    por fechas que las consultas en la tabla gigantesca sean por
    fechas. de lo contrario no te va a ayudar mucho.

Si, las consultas que usamos utilizan los indices correctamente, lcomo quiera estoy usando pgBadger para identificar las queries mas lentas y analizar como puedo mejorar su rendimiento.

    Los parametros el S.O. los ajustaste para manejar una base de
    datos grande ? Usas un Filesystem como XFS ? ( me gusta más que
    ext3 o ext4 ) pero es algo personal.

El kernel del SO me permite usar hasta 137 GB of sahed memory, solo estoy utilizando 24 GB en el shared_bufer.

    Sobre los IO. iostat -m -x /dev/sd? 3 ( que te dice, contención ? ).

avg-cpu:%user %nice %system %iowait%steal %idle

16.900.006.391.540.00 75.17


Device: rrqm/s wrqm/s r/s w/srMB/swMB/s avgrq-sz avgqu-sz await r_await w_awaitsvctm%util

dm-50.00 0.005.94 41.94 0.22 0.1616.47 0.010.17 11.463.76 0.31 1.48

    sar ( que te dice sobre las contenciones ? ).

07:30:01 AM CPU %user %nice %system %iowait%steal %idle

07:40:01 AM all 28.480.00 12.282.410.00 56.83

07:50:01 AM all 27.730.00 11.982.210.00 58.07

08:00:01 AM all 28.740.00 12.382.060.00 56.82

08:10:01 AM all 32.540.00 14.272.260.00 50.93

08:20:01 AM all 31.960.00 13.952.250.00 51.84

08:30:01 AM all 33.870.00 14.662.410.00 49.06

08:40:01 AM all 33.180.00 14.452.570.00 49.80

08:50:01 AM all 33.350.00 14.682.580.00 49.38

09:00:01 AM all 33.900.00 14.962.430.00 48.71

09:10:01 AM all 38.930.00 17.022.720.00 41.33

09:20:01 AM all 38.840.00 16.942.370.00 41.85

Average:all 16.450.007.211.180.00 75.16

    Los discos en la maquina real estan todos sanos ?

Si, lo unico que no contribuye mucho es que usamos SAN, por eso vamos a cambiar a otro servidor para usar SSD.
No veo contención a nivel de disco, revisa de forma continua que le ocurre a la maquina ( mira datadog para monitoreo ) o si usas otra herramienta conecta el SO para capturar los IO de disco.

    La fuente de poder estan las dos activas ? ( una fuente puesta en
    un servidor pero desenchufada va a desabilitar los cache de las
    controladora.

El servidor esta en RackSpace, voy a preguntar, aunque no creo que eso sea posible, ese servicio cuesta bien caro.
no importa este punto, no hay contención de discos.

    Los cache estan funcionando ? ( supongo que tienes algo como HP o
    DELL, o alguna marga que no sea un PC armado corriendo aquí ).

Tenemos un Dell Inc. PowerEdge R720. CPU:24 RAM:512

    el shmmax esta reajustado de acuerdo al shared buffers ? ( no
    puedes tener un shared buffer grande si no tienes el S.O. en
    sintonía con la base de datos. ( elimina el Swap si puedes ), y no
    asignes más del 80% a la base de datos si es lo unico que corre ahi ).

Si tienes una maquina con 512G RAM usa la RAM para porgres lo que más puedas.

Usa este link para estimar los parámetros. https://pgtune.leopard.in.ua/#/

cat /proc/sys/kernel/shmmax = 137438953472 = ~137GB

postgres=# show shared_buffers;

shared_buffers

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

24GB

(1 row)

    Sobre python ( lee sobre pool y postgresql ).

    Si usas jdbc ( pasa el parametro
    /-Djava.security.egd=file:/dev/./urandom )//
    
/http://ruleoftech.com/2016/avoiding-jvm-delays-caused-by-random-number-generation
    ).

He estado leyendo sobre como y la importancia de usar un connection pool, en estos momentos no es una opcion cambiar la arquitectura ni modificar el codigo de los sistemas para manejar mas eficiente la forma de escribir en la BD, por eso propuse revisar la configuracion del connection pool que trae implementado Ruby/Rails, que si se esta utilizando se esta usando la configuration por defecto, que es 5, pero hay varios parametros que afentan el numero final de conectiones por servidores, no solo dependiendo del valor especificado en la configuarion del pool, he estado leyendo bastante al respecto desde que hablamos hace como 6 semanas atras de la necesidad de usar pgBouncer. Esto resume bastante bien como funciona Ruby/Rails:
https://devcenter.heroku.com/articles/concurrency-and-database-connections#connection-pool

    Puede que no sea importante, pero /dev/random es super malo para
    muchas conexiones sobre todo si no usas pooling con java.

Una pregunta, cuando dices /dev/random te refires al FS? este es el mio: /dev/mapper/X-X
No, en Linux todo es un archivo, /dev/random es un dispositivo que crea numeros random en base a entropia ( para tener numeros realmente randoms ) ahora el problema es que la entropia no esta disponible siempre, para mejorar el rendimientos en programas que usan cryptografia yo uso /dev/urandom, apache /dev/urandom, etc. Hay varios articulos que hablan sobre que es un mito urbano que /dev/random es mejor que /dev/urandom ya que ambos usan la misma libreria para generar los numeros aleatorios.

    Es super raro que la base template1 este tan fragmentada, algo
    debe estar escribiendo y borrando cosas. revisa que tabla es,
    puede que sea alguna de estadisticas.

Analizando el crecimiento diaria (cada 24H) he visto que el promedio diario de crecimiento del XID es alrededor de 44millones, esto afecta todas las base de datos en el servidor por igual, es decir todas crecen con el mismo indice, incluyendo template1 y template0. La unica que me preocupa seriamente es template0, pues no puedo ejecutar un vacuum y no estoy seguro si esta "base de datos" podria dejarme el servidor fuera de servicio nuevamente, actualmente el XID de template1 es 1 562 227 160 representando el 74% de 2.1 billon.

Seria bueno saber si existe alguna manera de hacerle vacuum a template0 o en el caso que template1 alcance los 2.1billon que pasaria?

Template1 es como decirlo el corazón de postgres, si esa base esta muerta, todo lo medas muere con ella ( en realidad puedes copiar los directorios por debajo en terioría pero solo me toco hacer una chancheria como esa una sola vez en mi vida con postgres 6.2 y ResiserFS o algo como eso, se recupero, nunca perdi un dato de producción con postgres y por eso toco madera.

Este problema se ve super interesante, hay alguna forma de generar tu data de forma random ? ( tengo maquinas en mi ambiente de pruebas grandes para jugar ).


Reply via email to