programing

유휴 Postgre에 대한 시간 초과가 있습니까?SQL 연결?

goodsources 2023. 5. 1. 21:03
반응형

유휴 Postgre에 대한 시간 초과가 있습니까?SQL 연결?

1 S postgres  5038   876  0  80   0 - 11962 sk_wai 09:57 ?        00:00:00 postgres: postgres my_app ::1(45035) idle                                                                                 
1 S postgres  9796   876  0  80   0 - 11964 sk_wai 11:01 ?        00:00:00 postgres: postgres my_app ::1(43084) idle             

저는 그것들을 많이 봅니다.우리는 연결 누수를 고치려고 노력하고 있습니다.그러나 이러한 유휴 연결에 대한 시간 제한(최대 5분)을 설정하려고 합니다.

풀링된 연결을 닫지 못했기 때문에 응용 프로그램에서 연결 누수가 발생한 것처럼 들립니다.당신은 단지 문제를 가지고 있지 않습니다.<idle> in transaction세션, 그러나 전체적으로 연결이 너무 많습니다.

연결을 끊는 것이 정답은 아니지만 일시적인 해결책입니다.

Postgre를 다시 시작하는 대신Postgre에서 다른 모든 연결을 부팅하는 SQLSQL 데이터베이스, 참조: 다른 모든 사용자를 postgres 데이터베이스에서 분리하려면 어떻게 해야 합니까?그리고 Postgre를 떨어뜨리는 방법.SQL 데이터베이스에 대한 활성 연결이 있는 경우 .후자가 더 나은 질의를 보여줍니다.

제한 시간 설정은 @Doon이 제안한 대로 Postgre에서 유휴 연결을 닫는 방법을 참조하십시오.SQL 자동으로? PgBouncer를 사용하여 Postgre를 프록시하도록 조언합니다.SQL 및 유휴 연결 관리어쨌든 연결이 새는 버그가 있는 응용 프로그램을 사용하는 경우 매우 좋은 생각입니다. PgBouncer를 구성하는 것이 좋습니다.

여기서 TCP 킵얼라이브는 작동하지 않습니다. 앱이 여전히 연결되어 있고 활성 상태이기 때문에 작동하지 않아야 합니다.

포스트그레에서SQL 9.2 이상에서는 새로운 기능을 사용할 수 있습니다.state_change 열 및 "는 다음과 ."state의 밭pg_stat_activity유휴 연결 리퍼를 구현합니다.다음과 합니다.

SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE datname = 'regress'
      AND pid <> pg_backend_pid()
      AND state = 'idle'
      AND state_change < current_timestamp - INTERVAL '5' MINUTE;

이전 버전에서는 연결이 유휴 상태가 된 시점을 추적하는 복잡한 체계를 구현해야 합니다.신경 쓰지 말고 그냥 pgbouncer를 사용하세요.

포스트그레에서SQL 9.6에는 설명한 대로 수행할 수 있는 새로운 옵션이 있습니다.다음과 같은 명령을 사용하여 설정할 수 있습니다.

SET SESSION idle_in_transaction_session_timeout = '5min';

포스트그레에서SQL 9.1, 유휴 연결 및 다음 쿼리.데이터베이스를 다시 시작하는 데 필요한 상황을 방지하는 데 도움이 되었습니다.이 문제는 대부분 JDBC 연결이 열려 있고 제대로 닫히지 않은 상태에서 발생합니다.

SELECT
   pg_terminate_backend(procpid)
FROM
   pg_stat_activity
WHERE
   current_query = '<IDLE>'
AND
   now() - query_start > '00:10:00';

postgresql 9.6+를 사용하는 경우 postgresql.conf에서 설정할 수 있습니다.

idle_in_transaction_session_timeout = 30000 (밀리초)

OS의 TCP 킵얼라이브 기능에 의존하는 끊어진 연결(즉, 네트워크 오류로 인한)에 대한 시간 제한이 있습니다. 연결은 (Linux의 경우 TCP 연결 2단계 참조).sysctl net.ipv4.tcp_keepalive_time).

또한 포기된 트랜잭션에 대한 시간 제한이 있습니다.idle_in_transaction_session_timeout자물쇠를 채우면,lock_timeout다음으로 설정하는 것이 좋습니다.postgresql.conf.

그러나 올바르게 설정된 클라이언트 연결에는 시간 제한이 없습니다.클라이언트가 연결을 계속 열어두려면 무제한으로 연결할 수 있어야 합니다.클라이언트가 연결을 누설하는 경우(예: 점점 더 많은 연결을 열고 닫지 않는 경우) 클라이언트를 수정합니다.서버 측에서 올바르게 설정된 유휴 연결을 중단하지 마십시오.

외부 스케줄링된 작업 없이 데이터베이스 세션 시간 초과를 사용할 수 있는 가능한 해결 방법은 내가 개발한 확장 pg_timeout을 사용하는 것입니다.

다른 옵션은 이 값 "tcp_keepalives_idle"을 설정하는 것입니다.자세한 내용은 설명서 https://www.postgresql.org/docs/10/runtime-config-connection.html 을 참조하십시오.

언급URL : https://stackoverflow.com/questions/13236160/is-there-a-timeout-for-idle-postgresql-connections

반응형