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'매개 변수)?
어둠 속의 한 장면 : PostgreSQL 내부 캐싱 문제일까요? SELECT 문을 Linux에서 여러 번 제출하려고 시도했으며 여러 번 Windows에서 제출하려고 시도 했습니까? 나는 평균 시간이 그때 같아야한다라고 생각할 것이다. – mawimawi
to mawimawi :이 시간은 일관성이 없습니다. 제 제작 장고 앱이 개발 (Windows) 컴퓨터보다 훨씬 느린 디버깅을 시작했습니다. 여러 번 실행하면 시간이 같습니다. – mpaf
네트워크 지연과 관련 될 수 있습니다. 특히 서버에서 다량의 데이터를 전송하는 경우. 서버 수준에서 쿼리를 기록하여 실제로 Postgres에서 소요 된 시간을 확인하십시오. 아, 파이썬에서도 실행 시간 차이가있을 수 있습니다. 객체 만들기 등. –