Nhìn vào nhật ký máy chủ postgres, tôi thấy rằng cùng một truy vấn trên cùng một máy chủ postgres mất nhiều thời gian hơn (khoảng 10x lâu hơn) khi được gọi từ một máy khách Linux hoặc từ một máy khách Windows .Postgresql: Truy vấn 10x chậm hơn trong một máy khách khác nhau
Các truy vấn đến từ một ứng dụng Django chạy trên máy Linux có RAM 4GB và trên máy Windows có RAM 8GB. Cả hai môi trường pyhon đều có thư viện psycopg2 phiên bản 2.4.4 để gửi yêu cầu đến cùng một máy chủ postgres.
Dưới đây là các bản ghi postgres máy chủ
Các cửa sổ truy vấn (theo thời gian):
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')
Truy vấn linux (lâu hơn nữa):
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')
thực hiện trực tiếp từ psql (các nhanh nhất):
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');
Các truy vấn khác không cần tải quá nhiều mục từ cơ sở dữ liệu đang hoạt động gần như giống nhau.
Tại sao có sự khác biệt lớn về thời gian giữa các khách hàng cho truy vấn này?
Lưu ý: Thời gian truyền không liên quan vì tất cả các máy đều nằm trong cùng một mạng nội bộ. Ngoài ra, thời gian chậm hơn được nhìn thấy khi yêu cầu của khách hàng đến từ cùng một máy Linux, nơi máy chủ postgresql đang chạy.
Note2: Psycopg2 được cài đặt khác nhau trong Windows và Linux. Trong khi Windows tôi đã cài đặt nó từ một nhị phân được đóng gói sẵn, trong Linux tôi đã chạy 'pip install psycopg2' dựa trên một cài đặt postgresql có sẵn trên hệ thống. Điều này có thể dẫn đến các giá trị khác nhau cho các thông số ảnh hưởng đến hiệu suất ở phía máy khách (ví dụ: tham số 'work_mem') không?
Chỉ cần chụp trong bóng tối: Có thể đó là sự cố bộ nhớ đệm nội bộ của PostgreSQL? Bạn có cố gắng gửi câu lệnh SELECT nhiều lần từ Linux và cũng nhiều lần từ Windows không? Tôi sẽ tưởng tượng rằng thời gian trung bình cũng giống như vậy. – mawimawi
to mawimawi: Không có thời gian nào phù hợp, tôi bắt đầu gỡ lỗi này vì ứng dụng django sản xuất của tôi chậm hơn nhiều so với máy phát triển (cửa sổ). Thời gian là như nhau nếu bạn chạy nhiều lần. – mpaf
Nó có thể liên quan đến độ trễ mạng. Đặc biệt là nếu bạn đang truyền lượng dữ liệu lớn từ máy chủ sang máy chủ tiếp theo. Đăng nhập truy vấn ở cấp độ máy chủ, để xem có bao nhiêu thời gian thực sự được chi tiêu trong Postgres. Ồ, nó cũng có thể là thời gian thực hiện khác biệt trong python, quá, ví dụ Tạo đối tượng vv –