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
