Mục đích của việc đánh giá điểm chuẩn của cơ sở dữ liệu không chỉ để kiểm tra khả năng của cơ sở dữ liệu mà còn là hành vi của một cơ sở dữ liệu cụ thể đối với ứng dụng của bạn. Các phần cứng khác nhau cung cấp các kết quả khác nhau dựa trên kế hoạch đo điểm chuẩn mà bạn đã đặt. Điều rất quan trọng là phải cách ly máy chủ (máy chủ thực tế đang được chuẩn hóa) với các yếu tố khác như máy chủ thúc đẩy tải hoặc máy chủ được sử dụng để thu thập và lưu trữ các chỉ số hiệu suất. Là một phần của bài tập về điểm chuẩn, bạn phải nắm được các đặc điểm của ứng dụng như a) Ứng dụng có khả năng đọc hay viết chuyên sâu không? hoặc b) phân chia đọc / ghi (ví dụ:80:20) là gì? hoặc c) Bộ dữ liệu lớn bao nhiêu ?, dữ liệu và cấu trúc có đại diện cho cơ sở dữ liệu sản xuất thực tế không, v.v.
PostgreSQL là cơ sở dữ liệu mã nguồn mở tiên tiến nhất thế giới. Nếu bất kỳ khách hàng RDBMS doanh nghiệp nào muốn di chuyển cơ sở dữ liệu của họ sang nguồn mở, thì PostgreSQL sẽ là lựa chọn đầu tiên để đánh giá.
Bài đăng này bao gồm những điều sau:
- Cách đánh giá điểm chuẩn của PostgreSQL
- Các yếu tố hiệu suất chính trong PostgreSQL là gì
- Bạn có thể sử dụng các đòn bẩy nào để tăng hiệu suất
- Những cạm bẫy về hiệu suất cần tránh
- Mọi người thường mắc những lỗi nào?
- Làm cách nào để biết liệu hệ thống của bạn có đang hoạt động hay không? Bạn có thể sử dụng những công cụ nào?
Cách đánh giá điểm chuẩn của PostgreSQL
Công cụ chuẩn để đánh giá PostgreSQL là pgbench. Theo mặc định, các bài kiểm tra pgbench dựa trên TPC-B. Nó bao gồm 5 lệnh CHỌN, CHÈN và CẬP NHẬT cho mỗi giao dịch. Tuy nhiên, tùy thuộc vào hành vi ứng dụng của bạn, bạn có thể viết các tệp kịch bản của riêng mình. Hãy để chúng tôi xem xét kết quả kiểm tra mặc định và một số định hướng tập lệnh. Chúng tôi sẽ sử dụng phiên bản PostgreSQL mới nhất cho các thử nghiệm này, đó là PostgreSQL 10 tại thời điểm viết bài. Bạn có thể cài đặt nó bằng ClusterControl hoặc sử dụng hướng dẫn tại đây:https://www.openscg.com/bigsql/package-manager/.
Thông số kỹ thuật của máy
Phiên bản:RHEL 6 - 64 bit
Bộ nhớ:4GB
Bộ xử lý:4
Dung lượng:50G
Phiên bản PostgreSQL:10.0
Kích thước cơ sở dữ liệu:15G
Trước khi chạy đo điểm chuẩn bằng công cụ pgbench, bạn cần khởi tạo nó dưới lệnh:
-bash-4.1$ ./pgbench -i -p 5432 -d postgres
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
creating tables…
100000 of 100000 tuples (100%) done (elapsed 0.18 s, remaining 0.00 s)
Vacuum…
set primary keys…
done.
Như được hiển thị trong thông báo NOTICE, nó tạo ra các bảng pgbench_history, pgbench_tellers, pgbench_accounts và pgbench_braffs để chạy các giao dịch để đo điểm chuẩn.
Đây là một bài kiểm tra đơn giản với 10 khách hàng:
-bash-4.1$ ./pgbench -c 10
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 100/100
latency average = 13.516 ms
tps = 739.865020 (including connections establishing)
tps = 760.775629 (excluding connections establishing)
Như bạn thấy, nó chạy với 10 khách hàng và 10 giao dịch cho mỗi khách hàng. Nó mang lại cho bạn 739 giao dịch / giây và 739 giao dịch / giây. Nếu bạn muốn chạy nó trong một khoảng thời gian cụ thể, bạn có thể sử dụng tùy chọn "-T". Nói chung, chạy 15 phút hoặc 30 phút là đủ.
Hiện tại, chúng ta đã nói về cách chạy pgbench, tuy nhiên không phải về những gì nên là tùy chọn. Trước khi bắt đầu đo điểm chuẩn, bạn nên nhận thông tin chi tiết thích hợp từ nhóm ứng dụng về:
- Loại khối lượng công việc nào?
- Có bao nhiêu phiên đồng thời?
- Tập hợp kết quả trung bình của các truy vấn là gì?
- tps dự kiến (giao dịch mỗi giây) là bao nhiêu?
Đây là một ví dụ về tải công việc chỉ đọc. Bạn có thể sử dụng tùy chọn "-S" để chỉ sử dụng các CHỌN thuộc chế độ chỉ đọc. Lưu ý rằng -n là bỏ qua việc hút bụi trên bàn.
-bash-4.1$ ./pgbench -c 100 -T 300 -S -n
transaction type: <builtin: select only>
scaling factor: 1000
query mode: simple
number of clients: 100
number of threads: 1
duration: 300 s
number of transactions actually processed: 15741
latency average = 1916.650 ms
tps = 52.174363 (including connections establishing)
tps = 52.174913 (excluding connections establishing)
-bash-4.1$
Độ trễ ở đây là thời gian giao dịch đã trôi qua trung bình của mỗi câu lệnh được thực hiện bởi mọi khách hàng. Nó cho 52 tps với phần cứng được cung cấp. Vì điểm chuẩn này dành cho môi trường chỉ đọc, chúng ta hãy thử điều chỉnh các thông số shared_buffers và effect_cache_size trong tệp postgresql.conf và kiểm tra số tps. Chúng ở giá trị mặc định trong thử nghiệm trên, hãy thử tăng giá trị và kiểm tra kết quả.
-bash-4.1$ ./pgbench -c 100 -T 300 -S -n
transaction type: <builtin: select only>
scaling factor: 1000
query mode: simple
number of clients: 100
number of threads: 1
duration: 300 s
number of transactions actually processed: 15215
latency average = 1984.255 ms
tps = 68.396758 (including connections establishing)
tps = 68.397322 (excluding connections establishing)
Thay đổi các thông số đã cải thiện hiệu suất lên 30%.
pgbench thường chạy các giao dịch trên các bảng của chính nó. Nếu bạn có khối lượng công việc là 50% đọc và 50% ghi (hoặc môi trường 60:40), bạn có thể tạo tệp kịch bản với một tập hợp các câu lệnh để đạt được khối lượng công việc mong đợi.
-bash-4.1$ cat /tmp/bench.sql
INSERT INTO test_bench VALUES(1,'test');
INSERT INTO test_bench VALUES(1,'test');
SELECT * FROM test_bench WHERE id=1;
SELECT * FROM test_bench WHERE id=2;
-bash-4.1$ ./pgbench -c 100 -T 300 -S -n -f /tmp/bench.sql
transaction type: multiple scripts
scaling factor: 1000
query mode: simple
number of clients: 100
number of threads: 1
duration: 300 s
number of transactions actually processed: 25436
latency average = 1183.093 ms
tps = 84.524217 (including connections establishing)
tps = 84.525206 (excluding connections establishing)
SQL script 1: <builtin: select only>
- weight: 1 (targets 50.0% of total)
- 12707 transactions (50.0% of total, tps = 42.225555)
- latency average = 914.240 ms
- latency stddev = 558.013 ms
SQL script 2: /tmp/bench.sql
- weight: 1 (targets 50.0% of total)
- 12729 transactions (50.0% of total, tps = 42.298662)
- latency average = 1446.721 ms
- latency stddev = 765.933 ms
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức Các yếu tố hiệu suất chính trong PostgreSQL là gì
Nếu chúng ta xem xét một môi trường sản xuất thực, nó được hợp nhất với các thành phần khác nhau ở cấp ứng dụng, phần cứng như CPU và bộ nhớ, và hệ điều hành cơ bản. Chúng tôi cài đặt PostgreSQL trên đầu hệ điều hành để giao tiếp với các thành phần khác của môi trường sản xuất. Mỗi môi trường đều khác nhau và hiệu suất tổng thể sẽ bị giảm sút nếu nó không được định cấu hình đúng cách. Trong PostgreSQL, một số truy vấn chạy nhanh hơn và một số chậm hơn, tuy nhiên nó phụ thuộc vào cấu hình đã được thiết lập. Mục tiêu của tối ưu hóa hiệu suất cơ sở dữ liệu là tối đa hóa thông lượng cơ sở dữ liệu và giảm thiểu các kết nối để đạt được thông lượng lớn nhất có thể. Dưới đây là một số yếu tố hiệu suất chính ảnh hưởng đến cơ sở dữ liệu:
- Khối lượng công việc
- Tài nguyên
- Tối ưu hoá
- Nội dung
Khối lượng công việc bao gồm các công việc hàng loạt, truy vấn động cho các giao dịch trực tuyến, truy vấn phân tích dữ liệu được sử dụng để tạo báo cáo. Khối lượng công việc có thể khác nhau trong khoảng thời gian trong ngày, trong tuần hoặc trong tháng và tùy thuộc vào các ứng dụng. Việc tối ưu hóa mọi cơ sở dữ liệu là duy nhất. Nó có thể là cấu hình mức cơ sở dữ liệu hoặc tối ưu hóa mức truy vấn. Chúng tôi sẽ đề cập nhiều hơn về tối ưu hóa trong các phần tiếp theo của bài đăng. Tranh chấp là điều kiện trong đó hai hoặc nhiều thành phần của khối lượng công việc đang cố gắng sử dụng một tài nguyên theo cách xung đột. Khi sự tranh cãi tăng lên, thông lượng giảm.
Mẹo và Thực tiễn Tốt nhất là gì
Dưới đây là một số mẹo và phương pháp hay nhất mà bạn có thể làm theo để tránh các vấn đề về hiệu suất:
- Bạn có thể xem xét việc chạy các hoạt động bảo trì như VACUUM và ANALYZE sau khi sửa đổi lớn trong cơ sở dữ liệu của mình. Điều này giúp người lập kế hoạch đưa ra kế hoạch tốt nhất để thực hiện các truy vấn.
- Tìm bất kỳ nhu cầu nào để lập chỉ mục các bảng. Nó giúp các truy vấn chạy nhanh hơn nhiều thay vì phải quét toàn bộ bảng.
- Để duyệt chỉ mục nhanh hơn nhiều, bạn có thể sử dụng lệnh CREATE TABLE AS hoặc CLUSTER để phân cụm các hàng có giá trị khóa tương tự.
- Khi bạn gặp vấn đề về hiệu suất, hãy sử dụng lệnh EXPLAIN để xem sơ đồ về cách trình tối ưu hóa đã quyết định thực hiện truy vấn của bạn.
- Bạn có thể thử thay đổi các kế hoạch bằng cách tác động đến trình tối ưu hóa bằng cách sửa đổi các toán tử truy vấn. Ví dụ:nếu bạn thấy quá trình quét tuần tự cho truy vấn của mình, bạn có thể tắt tính năng quét tuần tự bằng cách sử dụng "SET ENABLE_SEQSCAN TO OFF". Không có gì đảm bảo rằng trình tối ưu hóa sẽ không chọn toán tử đó nếu bạn vô hiệu hóa nó. Trình tối ưu hóa chỉ coi toán tử đắt hơn nhiều. Thông tin chi tiết tại đây:https://www.postgresql.org/docs/current/static/runtime-config-query.html
- Bạn cũng có thể thử thay đổi các thông số chi phí như CPU_OPERATOR_COST, CPU_INDEX_TUPLE_COST, CPU_TUPLE_COST, RANDOM_PAGE_COST và EFFECTIVE_CACHE_SIZE để tác động đến trình tối ưu hóa. Thông tin chi tiết tại đây:https://www.postgresql.org/docs/current/static/runtime-config-query.html#RUNTIME-CONFIG-QUERY-CONSTANTS
- Luôn lọc dữ liệu trên máy chủ chứ không phải trong ứng dụng khách. Nó sẽ giảm thiểu lưu lượng mạng và mang lại hiệu suất tốt hơn.
- Để thực hiện các thao tác thông thường, bạn nên sử dụng các thủ tục phía máy chủ (trình kích hoạt và chức năng). Các chức năng hoặc trình kích hoạt phía máy chủ được phân tích cú pháp, lập kế hoạch và tối ưu hóa ngay lần đầu tiên chúng được sử dụng, không phải mọi lúc.
Những sai lầm phổ biến mà mọi người mắc phải
Một trong những sai lầm phổ biến mà mọi người thường làm là chạy máy chủ cơ sở dữ liệu và cơ sở dữ liệu với các tham số mặc định. Cấu hình mặc định PostgreSQL được thử nghiệm trong một số môi trường, tuy nhiên không phải ứng dụng nào cũng tìm thấy các giá trị đó tối ưu. Vì vậy, bạn cần hiểu hành vi ứng dụng của mình và dựa vào đó, thiết lập các thông số cấu hình của bạn. Bạn có thể sử dụng công cụ pgTune để lấy các giá trị cho các thông số của mình dựa trên phần cứng bạn đang sử dụng. Bạn có thể xem tại:http://pgtune.leopard.in.ua/. Tuy nhiên, hãy nhớ rằng bạn sẽ phải kiểm tra ứng dụng của mình với những thay đổi mà bạn thực hiện, để xem liệu có bất kỳ sự suy giảm hiệu suất nào với những thay đổi đó không.
Một điều khác cần xem xét là lập chỉ mục cơ sở dữ liệu. Các chỉ mục giúp tìm nạp dữ liệu nhanh hơn, tuy nhiên, nhiều chỉ mục hơn tạo ra vấn đề khi tải dữ liệu. Vì vậy, hãy luôn kiểm tra xem có bất kỳ chỉ mục nào không sử dụng trong cơ sở dữ liệu hay không và loại bỏ những chỉ mục đó để giảm việc duy trì các chỉ mục đó và cải thiện việc tải dữ liệu.