điều chỉnh postgresql cho số lượng lớn ram


29

Tôi có hai máy chủ giống hệt nhau (về phần cứng), cả hai đều là cài đặt tiêu chuẩn của windows server 2008 r2, với phần mềm tối thiểu được cài đặt (về cơ bản là mã của tôi và các công cụ bắt buộc như jvm, v.v.).

Trên một máy chủ, tôi đang chạy máy chủ sql 2005, trên máy chủ thứ hai postgresql 9.1. Sự khác biệt về hiệu suất của 2 máy chủ này là đáng kinh ngạc, thật tệ cho postgresql đến nỗi tôi đang hối hận về bài phát biểu "hãy sử dụng postgresql ban đầu thay vì trả tiền cho giấy phép máy chủ sql" cho sếp của tôi. Chúng ta đang nói về sự khác biệt của 30 giây so với 15 phút cho cùng một lệnh và đó không chỉ là một lệnh này, đó là bất kỳ truy vấn hoặc lệnh nào tôi ném vào nó. Cả hai đều có khá nhiều dữ liệu giống nhau (các bản ghi được chèn theo thứ tự khác nhau) và cả hai cơ sở dữ liệu đều có cùng cấu trúc / chỉ mục, v.v.

Nhưng tôi hy vọng nó chỉ là vấn đề điều chỉnh hiệu suất. Vấn đề là, máy chủ sql sử dụng khá nhiều tất cả 32 hợp đồng ram trên máy chủ, trong khi postgresl không sử dụng gì, chắc chắn là ít hơn một hợp đồng mặc dù tôi chưa thực sự tìm ra chi tiết tốt.

Làm cách nào để tôi có được postgresql để sử dụng hơn 20 hợp đồng ram? Các máy chủ này được xây dựng riêng cho công cụ cơ sở dữ liệu này, do đó, bất kỳ ram nào không được sử dụng bởi cơ sở dữ liệu và các quy trình hỗ trợ đều bị lãng phí theo quan điểm của tôi.


4
Bạn đã thay đổi bất cứ điều gì để điều chỉnh ban đầu? Bước 1: SET effective_cache_size=18G;(cài đặt mặc định cực kỳ thấp) BTW: giả sử đây là máy 64 bit (không có PTE)

1
Bạn thực sự không cho chúng tôi đủ để giúp đỡ rất nhiều. Khác với "Nó chậm", chúng tôi không biết nhiều về tập dữ liệu của bạn, cách bạn truy cập nó, loại truy vấn nào thường chạy chậm, những gì bạn đã thực hiện để điều chỉnh (và có thể điều chỉnh sai) máy chủ của bạn. Heck, trên một máy linux có nhiều lõi và kênh bộ nhớ, bạn có thể có được hiệu năng khủng khiếp từ lâu trước khi bạn cài đặt postgresql. Bạn có bị ràng buộc CPU hoặc IO không? Những cài đặt không mặc định nào bạn đã có? Những loại truy vấn nào chậm?
Scott Marlowe

2
Postgres không "sử dụng ram" theo cách bạn nói về nó. Nó phụ thuộc vào bộ đệm của trang hệ thống tệp hệ điều hành cho phần lớn bộ đệm của nó, vì vậy khi bạn xem sử dụng ram trên hệ thống đang chạy postgres, bạn thường thấy nhiều GB được sử dụng bởi bộ đệm / bộ đệm của OS và các quy trình phụ trợ riêng lẻ chỉ sử dụng một vài Một vài chục MB mỗi.
dbenhur

1
Xem liên kết này: tekadempiere.blogspot.ae/2014/09/ Từ và tìm giá trị conf dựa trên tài nguyên của bạn từ đây: pgtune.leopard.in.ua
Sajeev

câu hỏi liên quan, có thể quan tâm: stackoverflow.com/questions/47311485/ từ
Mountainclimber

Câu trả lời:


41

Có nhiều hằng số có thể điều chỉnh, được khởi tạo thông qua postgres.conf. Những cái quan trọng nhất là:

  • max_connections: số lượng phiên đồng thời
  • work_mem : số lượng bộ nhớ tối đa được sử dụng cho các kết quả trung gian như bảng băm và để sắp xếp
  • shared_buffers dung lượng bộ nhớ dành riêng cho không gian bộ đệm 'được ghim'.
  • effective_cache_size dung lượng bộ nhớ giả định được sử dụng bởi bộ đệm LRU của HĐH.
  • random_page_cost : một ước tính cho chi phí tương đối của tìm kiếm đĩa.

max_connectionskhông nên được đặt cao hơn mức cần thiết, kết nối tốn tài nguyên ngay cả khi không hoạt động; trong hầu hết các trường hợp, một kết nối sẽ dành nhiều thời gian chờ đợi bên trong hơn là chờ đợi bên ngoài. (với mức giá tương tranh) Một công thức quy tắc tốt là "số lượng trục chính + số lượng bộ xử lý + X"

work_memlà khó khăn: có thể được áp dụng cho mọi truy vấn con, do đó, một truy vấn có 5 HASHJOINScó thể tốn 5 * work_mem. Và đối với các trường hợp xấu nhất, bạn cũng nên nghĩ đến việc nhiều phiên tiêu thụ số tiền này (một lần nữa là một lý do để giữ max_connectionsở mức thấp).

shared_buffersđược (IMHO) đánh giá quá cao. Thông thường nên cài đặt khoảng 1/4 ... 1/2 tất cả bộ nhớ "miễn phí" có sẵn, nhưng tôi có xu hướng giữ nó ở mức thấp và đặt effective_cache_sizethành tất cả bộ nhớ "miễn phí" có sẵn.

random_page_costlà chi phí cho tìm kiếm + đọc trên đĩa. Nó tương đối với sequential_disk_cost, là 1. Mặc định (4) cho random_page_costđược đặt quá cao cho các máy hiện đại và lưu trữ mạng, thông thường nó có thể được hạ xuống từ 2 đến 1.x. Đối với các ổ đĩa SSD, bạn thậm chí đặt nó thành 1.0, vì việc tìm kiếm gần như miễn phí trên SSD.


Xuất sắc! Tôi chưa bao giờ thấy tầm quan trọng của hiệu quả_cache_size, luôn bị lừa chỉ với shared_buffers. Điều này thực sự tạo ra một sự khác biệt rất lớn. Tôi cũng chạy pgtune và nó khuyến nghị sử dụng 20GB 96 cho shard_buffers, nhưng 64GB cho hiệu quả_cache_size. Cảm ơn!

1
FWIW, tôi đã trải qua những điều này và các cài đặt khác được đề xuất trong tài liệu Postgres và đã phân tích cho máy chủ của chúng tôi .
mlissner

Cảm ơn bạn rất nhiều cho câu trả lời. Tôi có thể hỏi đề xuất work_memlà gì khi max_connectionsmặc định 100 và RAM máy chủ là 32GB (máy chủ postgres chuyên dụng) không? Tôi biết tôi cần điều chỉnh điều này một mình dựa trên các truy vấn hàng ngày. Tôi chỉ tự hỏi nếu bạn có thể cho tôi biết giá trị "một kích thước phù hợp với tất cả câu trả lời" (hoặc giá trị điểm bắt đầu). 50MB có quá lớn không? Cảm ơn rất nhiều.
sgon00

Nó phụ thuộc vào hoạt động đồng thời điển hình trên máy của bạn. 100 phiên muốn 50 triệu (trên 10..20M) mỗi phiên có thể phù hợp. Hoặc, nó có thể không. Để có được một ấn tượng, theo dõi vmstat hoặc hàng đầu. Plus: nó phụ thuộc vào truy vấn của bạn (và những người khác). Chỉ cần nhìn vào kế hoạch.
wildplasser

@wildplasser cảm ơn bạn rất nhiều vì đã trả lời nhanh chóng. Tôi tìm thấy một trang web thú vị pgtune.leopard.in.ua . Tôi nghĩ rằng tôi sẽ sử dụng 40 MB làm điểm khởi đầu từ đề xuất và điều chỉnh dựa trên đó. Chúc mừng.
sgon00

20

Cân nhắc sử dụng pgtune để giúp bạn điều chỉnh cấu hình PostgreSQL. Từ PGFoundry:

pgtune lấy postgresql.conf mặc định wimpy và mở rộng máy chủ cơ sở dữ liệu mạnh như phần cứng mà nó đang được triển khai trên

Cấu hình mặc định của PostgreSQL rất bảo thủ và công cụ đó nhằm giúp giải quyết tình huống chính xác này. Các tài liệu là một đọc nhẹ và sử dụng công cụ là khá đơn giản.

Hãy nhớ rằng không cần phải sử dụng các đề xuất chính xác của pgtune. Chơi với các cài đặt của nó và xem các thay đổi kết quả đối với tệp conf sẽ cho bạn hiểu rõ hơn về cấu hình của PostgreQuery và cách điều chỉnh thủ công.


8
Bản cập nhật cuối cùng của pgtune là vào năm 2009, tức là 5 năm trước và vẫn còn tiếp tục. Tôi tự hỏi nếu nó vẫn còn hiệu lực cho loạt 9.1-9.2-9.3.
sorin

9
pgtune hiện có sẵn trực tuyến
Alfabravo

3

Nếu mọi truy vấn hoặc lệnh đang chạy chậm, tôi nghi ngờ rằng:

  • bạn kết nối với cơ sở dữ liệu cho mọi truy vấn bạn chạy;
  • bạn đã cấu hình một số loại phương thức xác thực, không hoạt động và nó tạm dừng các truy vấn của bạn cho đến khi phương thức xác thực cụ thể này hết thời gian.

Bạn có thể vui lòng cho chúng tôi biết cần bao nhiêu thời gian để chạy một truy vấn như thế select version()nào không? Nếu nên ngay lập tức (0,16ms trên máy trạm của tôi).


2

Nếu MỌI truy vấn là chậm hơn nhiều thì một cái gì đó là sai lầm khủng khiếp với máy chủ hoặc một cái gì đó. Theo kinh nghiệm của tôi, mỗi db có một vài điều tốt hơn so với những thứ khác, nhưng pssql thông minh hiệu năng dễ dàng ở cùng một lĩnh vực với máy chủ mssql.

Vì vậy, những gì hệ điều hành bạn đang chạy pssql trên? Phần cứng gì? Bạn đã thay đổi cài đặt nào? Dữ liệu của bạn lớn như thế nào? Ví dụ về truy vấn kém và đầu ra của phân tích giải thích (Chạy truy vấn của bạn như thế này:

giải thích phân tích chọn ... phần còn lại của truy vấn ở đây ...;

Đăng kết quả đầu ra lên http://explain.depesz.com/ và đăng liên kết tại đây.


1
Có, mọi truy vấn / lệnh đang chạy chậm và có "cái gì đó" là sai lầm khủng khiếp do đó câu hỏi của tôi. Vấn đề là mssql đang sử dụng đầy đủ ram có sẵn trên máy chủ (bộ nhớ đệm quá nặng) trong khi psql thì không. Tôi đánh giá cao ý kiến ​​và lời khuyên, nhưng bạn chắc chắn đã bỏ lỡ phần lớn câu hỏi của tôi và chính dòng chủ đề ... Tôi chỉ muốn biết làm thế nào để có được psql để sử dụng ram có sẵn; hiện đang thử một số đề xuất được liệt kê bởi những người khác ...
user85116

1
Sử dụng RAM của bạn KHÔNG phải là vấn đề. Postgresql dựa vào HĐH để thực hiện hầu hết các bộ đệm. Vì vậy, nó không CẦN sử dụng tất cả RAM. Một lần nữa, bạn đã bỏ lỡ phần lớn quan điểm của tôi. Bạn đang cho chúng tôi một chút quý giá để giúp bạn với. Tôi lái 5000 cụm postgresql để kiếm sống. Bạn có thể nghe theo lời khuyên của tôi, hoặc tiếp tục nghĩ rằng bạn biết cách pssql hoạt động và tranh luận.
Scott Marlowe

@ user85116, vui lòng nghe Scott, chúng tôi đã có một quy trình làm việc với MySQL phụ thuộc siêu trễ, vì vậy hiện tại MySQL đang sử dụng ram 64GB để thực hiện các truy vấn đó nhanh chóng, trong khi đó có thể đạt được điều tương tự trên 2G Postgres chỉ với các lượt xem cụ thể. Bộ nhớ đệm tất cả các cơ sở dữ liệu vào RAM sẽ không giải quyết được vấn đề của bạn, nó chỉ làm cho nó ít nhìn thấy hơn. Nếu bạn có cùng một vấn đề trong cấu trúc DB, Postgres sẽ không khắc phục nó cho bạn cũng như không thử ẩn nó.
kworr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.