Há um tempo fiz uma pesquisa sobre isso e depois de muitos ps, top,
free, pmap, etc; a conclusão que eu cheguei é que essa questão do uso
de memória é bem complexa e, portanto, bem complicado de se chegar em
um número e dizer que este número representa o uso de memória de um
processo (no caso o PostgreSQL).

O que é possível é termos um número que possa ser obtido como
relevante  para tal questão. O que eu encontrei que mais se aproxima
da realidade é a seguinte sequencia de comandos:

Primeiramente com o comando ps:
ps aux | grep --color 'postgres'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
....... recorte..............
postgres 11081  0.0  0.3 112156  6784 ?        Ss   Nov30   0:00
postgres: postgres postgres 192.168.197.140(42574) idle
postgres 14284  0.0  1.6 110664 35408 ?        Ss   Oct21   0:01
postgres: writer process
postgres 14285  0.0  0.0 110164  1164 ?        Ss   Oct21   0:00
postgres: wal writer process
postgres 14286  0.0  0.4 112516 10464 ?        Ss   Oct21   0:28
postgres: autovacuum launcher process
postgres 14287  0.0  0.1  74668  2228 ?        Ss   Oct21  18:27
postgres: stats collector process
root     18116  0.0  0.1  90136  3308 ?        Ss   09:43   0:00 sshd:
postgres [priv]
postgres 18122  0.0  0.0  90136  1748 ?        S    09:43   0:00 sshd:
postgres@pts/0
postgres 18123  0.0  0.0  66184  1656 pts/0    Ss   09:43   0:00 -bash
postgres 20708  0.0  0.2 111468  5172 ?        Ss   Oct27   0:00
postgres: usr_geonetwork db_geonetwork 192.168.193.32(58538) idle
postgres 20709  0.0  0.2 111444  5588 ?        Ss   Oct27   0:00
postgres: usr_geonetwork db_geonetwork 192.168.193.32(58539) idle
postgres 20710  0.0  0.2 111468  5144 ?        Ss   Oct27   0:00
postgres: usr_geonetwork db_geonetwork 192.168.193.32(58540) idle
postgres 20711  0.0  0.1 111376  3516 ?        Ss   Oct27   0:00
postgres: usr_geonetwork db_geonetwork 192.168.193.32(58541) idle
....... recorte..............

Por este comando temos o percentual de memória, o VSZ e o RSS, que,
não vou entrar em detalhes, representam o uso de memória do processo.
Acontece que esses valores não representam bem a realidade, pois
existe uma intersecção do uso de memória entre os processos que, até
onde entendi, o ps não trata.

Usando o pmap:

pmap -d 20708 20709

20708:   postgres: usr_geonetwork db_geonetwork 192.168.193.32(58538) idle
Address           Kbytes Mode  Offset           Device    Mapping
....... recorte..............
0000003056200000    1336 r-x-- 0000000000000000 0fd:00000 libc-2.5.so
000000305634e000    2048 ----- 000000000014e000 0fd:00000 libc-2.5.so
000000305654e000      16 r---- 000000000014e000 0fd:00000 libc-2.5.so
0000003056552000       4 rw--- 0000000000152000 0fd:00000 libc-2.5.so
0000003056553000      20 rw--- 0000003056553000 000:00000   [ anon ]
0000003056600000       8 r-x-- 0000000000000000 0fd:00000 libdl-2.5.so
0000003056602000    2048 ----- 0000000000002000 0fd:00000 libdl-2.5.so
0000003056802000       4 r---- 0000000000002000 0fd:00000 libdl-2.5.so
0000003056803000       4 rw--- 0000000000003000 0fd:00000 libdl-2.5.so
0000003056e00000     520 r-x-- 0000000000000000 0fd:00000 libm-2.5.so
0000003056e82000    2044 ----- 0000000000082000 0fd:00000 libm-2.5.so
0000003057081000       4 r---- 0000000000081000 0fd:00000 libm-2.5.so
0000003057082000       4 rw--- 0000000000082000 0fd:00000 libm-2.5.so
....... recorte..............
mapped: 119656K    writeable/private: 2484K    shared: 37088K

20709:   postgres: usr_geonetwork db_geonetwork 192.168.193.32(58539) idle
Address           Kbytes Mode  Offset           Device    Mapping
....... recorte..............
0000003056200000    1336 r-x-- 0000000000000000 0fd:00000 libc-2.5.so
000000305634e000    2048 ----- 000000000014e000 0fd:00000 libc-2.5.so
000000305654e000      16 r---- 000000000014e000 0fd:00000 libc-2.5.so
0000003056552000       4 rw--- 0000000000152000 0fd:00000 libc-2.5.so
0000003056553000      20 rw--- 0000003056553000 000:00000   [ anon ]
0000003056600000       8 r-x-- 0000000000000000 0fd:00000 libdl-2.5.so
0000003056602000    2048 ----- 0000000000002000 0fd:00000 libdl-2.5.so
0000003056802000       4 r---- 0000000000002000 0fd:00000 libdl-2.5.so
0000003056803000       4 rw--- 0000000000003000 0fd:00000 libdl-2.5.so
0000003056e00000     520 r-x-- 0000000000000000 0fd:00000 libm-2.5.so
0000003056e82000    2044 ----- 0000000000082000 0fd:00000 libm-2.5.so
0000003057081000       4 r---- 0000000000081000 0fd:00000 libm-2.5.so
0000003057082000       4 rw--- 0000000000082000 0fd:00000 libm-2.5.so
....... recorte..............
mapped: 119632K    writeable/private: 2460K    shared: 37088K

O que temos neste comando é que ele mostra o mapa do uso de memória,
observe que até mesmo a memória usada pelas bibliotecas é informada. A
boa notícia é que no final em <writeable/private:> é mostrado a
quantidade de memória do segmento de dados do processo, ou seja, uso
de memória "líquido", que é usado pelo processo, sem levar em
consideração as bibliotecas. Na época até elaborei um plano para gerar
um .sh que me desse essas informações (observe que dá pra saber o nome
da base de dados, usuário e o IP de onde foi feita a conexão com o
banco. :-)) mas até o momento ainda não escrevi nenhuma linha
(preguiça).

Aí agora vem a questão: o que é o uso de memória do PostgreSQL?
Memória total ou sem levar em conta a memória compartilhada?

Para quem gosta de escovar bit (meu caso) ter essa informação é uma
boa (até para o ego - hehehehe) mas na prática uma coisa mais simples
como "free -m" proposto pelo Angelo ou as ferramentas indicadas pelo
Flávio já satisfaz a necessidade. Isso vai depender de cada caso e da
disposição de cada um.

Abraço a todos.

-- 
Marcone Peres - DBA
http://www.linkedin.com/in/marconeperes
@marconeperes
(61) 8146-0028
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a