2013-06-11 36 views
5

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?

+0

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

+0

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

+1

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 –

Trả lời

7

Bạn có thể muốn kiểm tra xem máy khách chậm có mã hóa SSL hay không. Nó xảy ra theo mặc định khi nó được thiết lập trên máy chủ và máy khách đã được biên dịch với hỗ trợ SSL.

Đối với các truy vấn truy lục lượng dữ liệu lớn, chênh lệch thời gian là đáng kể. Một số bản phân phối Linux như Debian/Ubuntu có SSL theo mặc định, ngay cả đối với kết nối TCP thông qua localhost.

Ví dụ: đây là sự khác biệt về thời gian đối với truy vấn truy xuất 1,5 triệu hàng có tổng dung lượng 64Mbyte, với bộ nhớ cache ấm.

Nếu không có mã hóa:

 
$ 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 

Với mã hóa:

 
$ 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 

Để tắt nó đi trên toàn cầu, người ta có thể thiết lập SSL=off trong postgresql.conf.

Để tắt tính năng này cho các phạm vi địa chỉ khách hàng cụ thể, hãy thêm các mục nhập trong pg_hba.conf với hostnossl trong trường đầu tiên trước mục nhập chung chung hơn host.

Để bật nếu tắt phía máy khách, nó phụ thuộc vào cách trình điều khiển hiển thị thông số kết nối sslmode. Nếu không, biến môi trường PGSSLMODE có thể được sử dụng nếu trình điều khiển được triển khai ở trên cùng của libpq.

Đối với các kết nối thông qua các ổ cắm miền Unix (local), SSL không bao giờ được sử dụng với chúng.

+0

Câu trả lời hay! Tôi đã thử nghiệm và bạn đã đúng, SSL đã ảnh hưởng đến hiệu suất. Cả hai cho Windows và Linux thực sự, khi tôi vô hiệu hóa SSL trong postgresql.conf, Windows thời gian đã đi xuống từ 3s đến 1,7 và Linux thời gian xuống từ 22s đến 1,5s! Vì vậy, có vẻ như cả hai đều đang trải qua SSL nhưng Linux bị ảnh hưởng nhiều hơn bởi nó? Cảm ơn rất nhiều cho câu trả lời của bạn, cái nhìn sâu sắc. – mpaf

+0

@mpaf: vui vì nó giúp ích. Đối với Linux bị ảnh hưởng nhiều hơn, thật khó để giải thích mà không cần điều tra thêm. Nó có thể là một mật mã mạnh hơn được chọn trên Linux, nhưng đó chỉ là suy đoán. –

Các vấn đề liên quan