2013-06-11 3 views
5

postgres 서버 로그를 보면 Linux 클라이언트 또는 Windows 클라이언트에서 호출 할 때 동일한 postgres 서버에서 정확히 동일한 쿼리가 훨씬 오래 걸립니다 (약 10 배 이상). .Postgresql : 다른 클라이언트에서 10 배 느린 쿼리

쿼리는 4GB RAM이 장착 된 Linux 컴퓨터와 8GB RAM이 장착 된 Windows 컴퓨터에서 실행되는 장고 응용 프로그램에서 가져옵니다. pyhon 환경 모두 psycopg2 라이브러리 버전 2.4.4를 사용하여 동일한 postgres 서버에 요청을 보냅니다. (더 이상)

2013-06-11 12:12:19 EEST [unknown] 10.1.3.152(56895) mferreiraLOG: duration: 3207.195 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk') 

리눅스 쿼리 : 아래

은 (시간)

창문의 쿼리 포스트 그레스 서버 로그입니다

2013-06-11 12:12:56 EEST [unknown] 10.1.3.154(35325) mferreiraLOG: duration: 22191.773 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk') 

은 (psql의에서 바로 실행 빠른) :

2013-06-11 12:19:06 EEST psql [local] mferreiraLOG: duration: 1332.902 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk'); 

데이터베이스에서 너무 많은 항목을로드 할 필요가없는 다른 쿼리는 거의 동일하게 수행됩니다.

왜이 쿼리에 대해 클라이언트간에 큰 차이가 있습니까?

참고 : 모든 컴퓨터가 동일한 인트라넷에 있으므로 전송 시간은 적합하지 않습니다. 또한 느린 시간은 클라이언트 요청이 postgresql 서버가 실행중인 동일한 Linux 시스템에서 나왔을 때 나타납니다.

참고 2 : Psycopg2는 Windows와 Linux에서 다르게 설치되었습니다. Windows에서 미리 패키지 된 바이너리에서 설치 한 반면 Linux에서는 시스템에서 사용할 수있는 postgresql 설치에 의존하는 'pip install psycopg2'를 실행했습니다. 이로 인해 클라이언트 측의 실적에 영향을 미치는 매개 변수에 다른 값이 생길 수 있습니까 (예 : 'work_mem'매개 변수)?

+0

어둠 속의 한 장면 : PostgreSQL 내부 캐싱 문제일까요? SELECT 문을 Linux에서 여러 번 제출하려고 시도했으며 여러 번 Windows에서 제출하려고 시도 했습니까? 나는 평균 시간이 그때 같아야한다라고 생각할 것이다. – mawimawi

+0

to mawimawi :이 시간은 일관성이 없습니다. 제 제작 장고 앱이 개발 (Windows) 컴퓨터보다 훨씬 느린 디버깅을 시작했습니다. 여러 번 실행하면 시간이 같습니다. – mpaf

+1

네트워크 지연과 관련 될 수 있습니다. 특히 서버에서 다량의 데이터를 전송하는 경우. 서버 수준에서 쿼리를 기록하여 실제로 Postgres에서 소요 된 시간을 확인하십시오. 아, 파이썬에서도 실행 시간 차이가있을 수 있습니다. 객체 만들기 등. –

답변

7

저속 클라이언트가 SSL 암호화를하는지 확인하고 싶을 수 있습니다. 서버에서 설정되고 클라이언트가 SSL 지원으로 컴파일되었을 때 기본적으로 발생합니다.

많은 양의 데이터를 검색하는 쿼리의 경우 시차가 중요합니다. 또한 Debian/Ubuntu와 같은 일부 Linux 배포판은 localhost를 통한 TCP 연결의 경우에도 기본적으로 SSL을 설정합니다.

예를 들어, 다음은 웜 캐시를 사용하여 총 64M 바이트의 1,5M 행을 검색하는 쿼리의 시간차입니다. 암호화하지 않고

:

 
$ psql "host=localhost dbname=mlists sslmode=disable" 
Password: 
psql (9.1.7, server 9.1.9) 
Type "help" for help. 

mlists=> \timing 
Timing is on. 
mlists=> \o /dev/null 
mlists=> select subject from mail; 
Time: 1672.258 ms 

암호화를 :

 
$ psql "host=localhost dbname=mlists" 
Password: 
psql (9.1.7, server 9.1.9) 
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) 
Type "help" for help. 

mlists=> \o /dev/null 
mlists=> \timing 
Timing is on. 
mlists=> select subject from mail; 
Time: 7017.935 ms 

하나가 postgresql.confSSL=off을 설정할 수 있습니다, 세계를 끄십시오.

클라이언트 주소의 특정 범위를 사용하지 않으려면 pg_hba.confhostnossl이라는 항목을 첫 번째 입력란에 추가하여보다 일반적인 host 항목보다 앞에 추가하십시오.

클라이언트 쪽에서 해제하려면 드라이버가 sslmode 연결 매개 변수를 노출하는 방법에 따라 다릅니다. 그렇지 않은 경우 드라이버가 libpq 위에 구현 된 경우 PGSSLMODE 환경 변수를 사용할 수 있습니다.

Unix 도메인 소켓 (local)을 통한 연결의 경우 SSL을 사용하지 않습니다.

+0

좋은 답변입니다! 테스트를 마쳤으므로 SSL이 성능에 영향을 미치고 있습니다. Windows와 Linux 모두 실제로 postgresql.conf에서 SSL을 비활성화하면 Windows 시간이 3 초에서 1.7 초로 줄어들고 Linux 시간이 22 초에서 1.5 초로 줄어 들었습니다! 그래서 두 가지 모두 SSL을 통과하지만 리눅스는 더 많은 영향을받는 것으로 보입니다. 귀하의 답변, 좋은 통찰력을 주셔서 감사합니다. – mpaf

+0

@mpaf : 도움이 되니 기쁩니다. Linux가 더 많은 영향을 받으면 더 많은 조사없이 설명하기가 어렵습니다. Linux에서 강력한 암호가 선택 될 수도 있지만 이는 추측 일뿐입니다. –

관련 문제