Discussion:
Kill idle sessions
Nildo Abreu
2014-02-21 12:25:35 UTC
Permalink
Bom dia Senhores,

Preciso de um procedimento para matar sessões inativas (idle) por mais de
08 horas, encontrei em (1) algumas dicas porém nenhuma delas funcionou na
minha versão (2).
Existe algo do próprio PostgreSQL que faça essa tarefa?

1 -
http://dividebyzeroexception.blogspot.com.br/2009/10/implementing-waittimeout-in-postgresql.html
2 - PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC)
4.4.7 20120313 (Red Hat 4.4.7-3), 64-bit

Um abraço,

Nildo Abreu
Euler Taveira
2014-02-21 12:57:34 UTC
Permalink
Post by Nildo Abreu
Preciso de um procedimento para matar sessões inativas (idle) por mais de
08 horas, encontrei em (1) algumas dicas porém nenhuma delas funcionou na
minha versão (2).
Existe algo do próprio PostgreSQL que faça essa tarefa?
Vide a documentação [1]. Alguns campos foram renomeados (procpid -> pid)
e outros desmembrados (current_query -> query, state). Estou supondo que
quer matar qualquer consulta ociosa (inclusive aquelas que estão
esperando algo).

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE (now() -
query_start) > interval '8 hours' AND state ~ 'idle';

Se for somente as ociosas (aquelas que não estiverem executando
consultas), troque o ~ pelo =.


[1]
http://www.postgresql.org/docs/9.2/static/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW
--
Euler Taveira Timbira - http://www.timbira.com.br/
PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
Nildo Abreu
2014-02-21 14:57:05 UTC
Permalink
Post by Euler Taveira
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE (now() -
query_start) > interval '8 hours' AND state ~ 'idle';
Se for somente as ociosas (aquelas que não estiverem executando
consultas), troque o ~ pelo =
Era exatamente isso que precisava, muito obrigado!

Um abraço,

Nildo Abreu
Douglas Fabiano Specht
2014-02-21 14:58:59 UTC
Permalink
Post by Euler Taveira
Post by Nildo Abreu
Preciso de um procedimento para matar sessões inativas (idle) por mais de
08 horas, encontrei em (1) algumas dicas porém nenhuma delas funcionou na
minha versão (2).
Existe algo do próprio PostgreSQL que faça essa tarefa?
Vide a documentação [1]. Alguns campos foram renomeados (procpid -> pid)
e outros desmembrados (current_query -> query, state). Estou supondo que
quer matar qualquer consulta ociosa (inclusive aquelas que estão
esperando algo).
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE (now() -
query_start) > interval '8 hours' AND state ~ 'idle';
Se for somente as ociosas (aquelas que não estiverem executando
consultas), troque o ~ pelo =.
[1]
http://www.postgresql.org/docs/9.2/static/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW
--
Euler Taveira Timbira - http://www.timbira.com.br/
PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Ola..
por que vc nao utiliza as opções[1]:

#tcp_keepalives_idle = 0
#tcp_keepalives_interval = 0
#tcp_keepalives_count = 0


[1]-http://www.postgresql.org/docs/9.3/static/runtime-config-connection.html
--
Douglas Fabiano Specht
Fabrízio de Royes Mello
2014-02-22 01:58:01 UTC
Permalink
Post by Douglas Fabiano Specht
Ola..
#tcp_keepalives_idle = 0
#tcp_keepalives_interval = 0
#tcp_keepalives_count = 0
[1]-http://www.postgresql.org/docs/9.3/static/runtime-config-connection.html
Douglas,

Executando o "man 7 tcp" (conforme consta lá no postgresql.conf) vc pode
ver:

<man 7 tcp>
tcp_keepalive_intvl (integer; default: 75; since Linux 2.4)
The number of seconds between TCP keep-alive probes.

tcp_keepalive_probes (integer; default: 9; since Linux 2.2)
The maximum number of TCP keep-alive probes to send before giving
up and killing the connection if no response is obtained from the other end.

tcp_keepalive_time (integer; default: 7200; since Linux 2.2)
The number of seconds a connection needs to be idle before TCP
begins sending out keep-alive probes. Keep-alives are sent only when the
SO_KEEPALIVE socket option is enabled. The default value is 7200 seconds
(2 hours). An idle connection is terminated after approximately an
additional 11 minutes (9 probes an interval of 75 seconds apart) when
keep-alive is enabled.
Note that underlying connection tracking mechanisms and application
timeouts may be much shorter.
</man 7 tcp>

Isso tudo quer dizer que essas configurações são para a checagem
(probes) que o SO faz para ver se socket está ativo (se o client não
morreu).

Sabe aquelas mensagens "unexpected EOF on client connection" ?? Pois é,
ocorrem quando um client morre mas o socket permanece ativo. Isso é
comum em aplicações cliente/servidor que mantém uma conexão persistente
com o banco de dados, pois o lado cliente pode morrer de forma
inesperada (queda de energia, falha no SO, rede, tia da faxina, etc...).
Então essas configurações servem para o SO fazer uma checagem e eliminar
sockets que estejam quebrados.

Então essas configurações *não servem* para o propósito de eliminar
sessões "idle", pois estão estão com o socket aberto e ok.

Agora na 9.3 com os "background workers" é possível ter um processo que
faça essa *limpeza*, e se não me engano alguém já implementou uma
extensão pra isso, só não lembro quem/onde. Se alguém souber colabore ai.

Att,
--
Fabrízio de Royes Mello Timbira - http://www.timbira.com.br/
PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
Loading...