방화벽 뒤의 Postgresql: 쿼리가 너무 오래 걸림

방화벽 뒤의 Postgresql: 쿼리가 너무 오래 걸림

내 설정은 다음과 같습니다. VMWare ESXi 4.0에 두 개의 CentOS 5.2 상자가 있습니다. 첫 번째 상자 IP는 eth0에서는 192.168.22.52이고 eth1에서는 192.168.99.1입니다. 두 번째 상자는 eth0에서 IP 192.168.99.2로 PostgreSQL 8.3을 실행합니다. 다음은 iptables입니다.상자1, box2에 대해서는 아래 설명을 참조하세요.

box1에 포트 5432 전달을 설정했으며 Vista 노트북(192.168.22.1, 이 서브넷에는 다른 상자가 없으며 자체 스위치가 있고 물리적으로 격리되어 있음)의 pgAdminIII 또는 psql을 통해 box2의 PostgreSQL에 연결할 수 있습니다. 연결하려는 데이터베이스에는 두 개의 스키마가 있습니다. 하나는 '더 작습니다'(기본적으로 테이블 1개). 다른 하나는 더 큽니다(약 30개의 테이블, 100개의 함수 등). 따라서 더 작은 스키마로 작업할 수 있습니다. 테이블 등) 하지만 더 큰 스키마를 확장하려고 하면 pgAdminIII가 20분 정도 정지됩니다.

PostgreSQL 로그에 너무 오래 걸리는 쿼리가 있음이 표시됩니다.

2009-06-04 21:04:46 EEST LOG:  00000: duration: 493578.874 ms  statement: 
SELECT pr.oid, pr.xmin, pr.*, format_type(TYP.oid, NULL) AS typname, 
typns.nspname AS typnsp, lanname, proargnames, proconfig,
        pg_get_userbyid(proowner) as funcowner, description
              FROM pg_proc pr
              JOIN pg_type typ ON typ.oid=prorettype
              JOIN pg_namespace typns ON typns.oid=typ.typnamespace
              JOIN pg_language lng ON lng.oid=prolang
              LEFT OUTER JOIN pg_description des ON des.objoid=pr.oid
             WHERE proisagg = FALSE AND pronamespace = 2200::oid
               AND typname <> 'trigger'
             ORDER BY proname

box1과 box2는 모두 개발 상자의 복제본이며 원래 네트워크 구조가 달랐습니다. box2는 포트 전달 없이 직접 액세스할 수 있었고 데이터베이스에 액세스하는 데 전혀 문제가 없었습니다.

이제 box2 또는 '원래' 시스템에서 psql을 통해 또는 box1에서 box2에 연결하여 위 쿼리를 실행하면 즉시 실행됩니다.

쿼리가 실행되는 동안 box2의 tcpdump는 주기적으로 다음과 같이 말합니다.

12:45:39.770609 IP 192.168.99.2.postgres > 192.168.22.1.49484: . 8760:10220(1460) ack 1 win 54
12:45:39.968496 IP 192.168.22.1.49484 > 192.168.99.2.postgres: . ack 10220 win 16425
12:45:39.968541 IP 192.168.99.2.postgres > 192.168.22.1.49484: . 10220:11680(1460) ack 1 win 54
12:45:39.968574 IP 192.168.99.2.postgres > 192.168.22.1.49484: . 11680:13140(1460) ack 1 win 54
12:45:39.969250 IP 192.168.22.1.49484 > 192.168.99.2.postgres: . ack 13140 win 16425
12:45:39.969275 IP 192.168.99.2.postgres > 192.168.22.1.49484: . 13140:17520(4380) ack 1 win 54
12:45:39.969408 IP 192.168.22.52 > 192.168.99.2: ICMP 192.168.22.1 unreachable - need to frag (mtu 1500), length 556

그 외에는 교통량이 많지 않습니다. 모든 ethN 인터페이스의 MTU는 1500입니다. 노트북의 ping -l 1472 -f 192.168.99.1은 문제 없이 진행됩니다.

iptables나 네트워크 설정에 관해 뭔가 빠진 것 같은데, 조언해 주시면 감사하겠습니다.

답변1

시도해 볼 사항:

  1. 네트워크가 자체적으로 작동하는지 확인하는 것부터 시작하세요. 스위치를 관리한다고 가정하고 속도/이중 불일치 또는 일치하지 않는 MTU에 대한 인터페이스 통계를 살펴보세요. 오류가 발생하는 경우 케이블 연결을 확인/교체하는 것이 좋습니다(예: Cat5e 대신 Cat5를 통해 GigE를 실행하면 슬픔이 생길 수 있습니다).

  2. 몇 가지 테스트를 실행하여 두 시스템 사이와 외부 시스템 간에 유선 속도 전송을 얻을 수 있는지 확인하십시오. netcat, ftp 또는 http 전송은 여기에서 좋은 시작입니다(scp는 CPU 바인딩을 받을 수 있으므로 최상의 테스트가 아닐 수 있습니다).

  3. Postgres 서버에서 로컬로 동일한 쿼리를 테스트합니다. 적절한 기간 내에 완료되면 데이터베이스가 아니라는 것을 알 수 있습니다. 완료되지 않거나 "너무 오래" 걸리는 경우 쿼리가 잘못되었거나 디버깅할 다른 데이터베이스 문제가 있는 것입니다. 스토리지 I/O 측면을 고려해야 합니다. 디스크가 제공할 수 있는 기능이 포화 상태일 수 있습니다. VMware 성능 그래프를 확인하여 확인/거부하세요.

  4. 작동한다고 가정하면 방화벽을 비활성화하고 "box1"에서 postgres 서버에 대해 동일한 쿼리를 실행하십시오. 작동한다면 VM->VM 연결이 정상일 가능성이 높습니다.

  5. 작동한다고 가정하고 방화벽을 다시 가동하고 다시 테스트하십시오. 이것이 작동한다면 문제는 해당 호스트 외부에 있을 가능성이 높으며 스위치나 외부 호스트는 디버그해야 합니다.

행운을 빌어요.

답변2

MTU 문제가 있지만 이유가 확실하지 않습니다. 나는 여기서 당신의 가상 토폴로지를 둘러보려고 노력하고 있습니다.

그렇다면 Windows Vista 노트북이 "로컬" 네트워크에 연결되어 있습니까, 아니면 인터넷 네트워크에 연결되어 있습니까?

귀하의 Windows Vista 노트북이 인터넷에 연결되어 있고 "box 1"의 외부 IP 주소에 액세스하여 "box 2"에 도달하기 위해 포트 5432의 포트 전달을 사용하고 있다고 가정합니다. 그렇다면 다음을 시도하면 무엇을 얻을 수 있습니까?

ping -l 1472 -f <상자 1 IP 주소>

편집: 좋아요-- 아주 좋습니다. 원하는 경우 "box 1"과 "box 2" 모두에서 "ifconfig"를 실행하고 각 이더넷 인터페이스의 MTU 값을 검사합니다. 그것들은 모두 1500이어야 합니다. (나는 왜 "box 1"이 "box 2"에게 노트북에 바인딩된 556바이트 데이터그램을 조각화할 수 없다고 말하는지 파악하려고 합니다...)

편집 : Zow. 알았어-- 정말 말도 안 되는 소리야.

물어볼 것이 너무 많지 않다면 iptables 구성의 내용(또는 그에 대한 링크)을 질문에 게시할 수 있습니까? (여기서 헷갈리기 시작했습니다. 말씀하신 내용은 제가 자주 해본 일인데 어떻게 무너지는지 잘 모르겠습니다.)

편집: 지금 다시 당신과 함께. 좋아요. 나는 지금 이것 때문에 당황스러워지고 있습니다. iptables 구성으로 인해 문제가 발생하지는 않을 것 같습니다. UDP 5432를 "상자 2"로 전달하고 있는 것을 확인했습니다. 이를 전달할 필요는 없습니다. Postgres는 TCP만 사용합니다. 그래도 아무 것도 아프지 않을 것입니다.

20분 동안 기다리는 동안 Vista 노트북과 "상자 2" 사이에 트래픽이 이동하는 것을 보셨나요? 연결할 때마다 해당 상태를 재현할 수 있습니까?

큰 차이가 있는 것은 아니지만 "박스 1"의 FORWARD 체인에서는 일반적으로 RELATED,ESTABLISHED가 설정된 패킷을 ACCEPT하는 규칙을 체인의 첫 번째 규칙으로 만듭니다(단락 처리). 하지만 이것이 성능에 큰 영향을 미칠 것이라고는 생각하지 않습니다.

나는 문제에 대한 답을 모르는 것을 싫어한다. 이것은 나를 밤에 깨어있게 할 것입니다.

답변3

이러한 시스템 중 하나가 IPv6를 부적절하게 사용하려고 시도하는 것이 가능합니까? 즉, IPv6가 사용되어서는 안 되는 모든 곳에서 IPv6가 꺼져 있는지 확인하고, 사용하는 경우 올바르게 구성했습니까?

관련 정보