Cách tối ưu hóa cơ sở dữ liệu cho I / O nặng từ các bản cập nhật (phần mềm và phần cứng)


20

Tình huống tôi có một cơ sở dữ liệu postgresql 9.2 được cập nhật khá nhiều mọi lúc. Do đó, hệ thống bị ràng buộc I / O và hiện tôi đang xem xét thực hiện nâng cấp khác, tôi chỉ cần một số hướng dẫn về nơi bắt đầu cải thiện.

Dưới đây là hình ảnh về tình hình trong 3 tháng qua:

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, cập nhật các hoạt động chiếm phần lớn việc sử dụng đĩa. Dưới đây là một hình ảnh khác về tình hình trong cửa sổ 3 giờ chi tiết hơn:

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, tốc độ ghi cao nhất là khoảng 20MB / s

Phần mềm Máy chủ đang chạy Ubuntu 12.04 và postgresql 9.2. Loại cập nhật được cập nhật nhỏ thường trên các hàng riêng lẻ được xác định bởi ID. Ví dụ UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id. Tôi đã loại bỏ và tối ưu hóa các chỉ mục nhiều nhất có thể, và cấu hình máy chủ (cả kernel linux và postgres conf) cũng được tối ưu hóa khá tốt.

Phần cứng Phần cứng là một máy chủ chuyên dụng với ram ECC 32 GB, các đĩa SAS 4x 600 GB 15.000 vòng / phút trong một mảng RAID 10, được điều khiển bởi bộ điều khiển đột kích LSI với BBU và bộ xử lý Quadcore Intel Xeon E3-1245.

Câu hỏi

  • Hiệu suất được xem bởi các biểu đồ có hợp lý cho một hệ thống tầm cỡ này (đọc / ghi) không?
  • Do đó, tôi có nên tập trung vào việc nâng cấp phần cứng hoặc điều tra sâu hơn vào phần mềm (tinh chỉnh kernel, confs, truy vấn, v.v.) không?
  • Nếu thực hiện nâng cấp phần cứng, số lượng đĩa có phải là hiệu suất không?

------------------------------ CẬP NHẬT ------------------- ----------------

Bây giờ tôi đã nâng cấp máy chủ cơ sở dữ liệu của mình với bốn ổ SSD intel 520 thay vì các ổ đĩa 15k cũ. Tôi đang sử dụng bộ điều khiển đột kích tương tự. Mọi thứ đã được cải thiện khá nhiều, như bạn có thể thấy từ hiệu suất I / O cao nhất sau đây đã được cải thiện khoảng 6-10 lần - và điều đó thật tuyệt!. nhập mô tả hình ảnh ở đây Tuy nhiên, tôi đã mong đợi một cái gì đó giống như cải thiện 20-50 lần theo các câu trả lời và khả năng I / O của SSD mới. Vì vậy, ở đây đi một câu hỏi khác.

Câu hỏi mới Có điều gì trong cấu hình hiện tại của tôi, đó là hạn chế hiệu năng I / O của hệ thống của tôi (nút thắt ở đâu)?

Cấu hình của tôi:

/etc/postgresql/9.2/main/postgresql.conf

data_directory = '/var/lib/postgresql/9.2/main'
hba_file = '/etc/postgresql/9.2/main/pg_hba.conf'
ident_file = '/etc/postgresql/9.2/main/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.2-main.pid'
listen_addresses = '192.168.0.4, localhost'
port = 5432
unix_socket_directory = '/var/run/postgresql'
wal_level = hot_standby
synchronous_commit = on
checkpoint_timeout = 10min
archive_mode = on
archive_command = 'rsync -a %p postgres@192.168.0.2:/var/lib/postgresql/9.2/wals/%f </dev/null'
max_wal_senders = 1
wal_keep_segments = 32
hot_standby = on
log_line_prefix = '%t '
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
default_statistics_target = 100
maintenance_work_mem = 1920MB
checkpoint_completion_target = 0.7
effective_cache_size = 22GB
work_mem = 160MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 7680MB
max_connections = 400 

/etc/sysctl.conf

# sysctl config
#net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
# ipv6 settings (no autoconfiguration)
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.accept_dad=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra_defrtr=0
net.ipv6.conf.default.accept_ra_rtr_pref=0
net.ipv6.conf.default.accept_ra_pinfo=0
net.ipv6.conf.default.accept_source_route=0
net.ipv6.conf.default.accept_redirects=0
net.ipv6.conf.default.forwarding=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_dad=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra_defrtr=0
net.ipv6.conf.all.accept_ra_rtr_pref=0
net.ipv6.conf.all.accept_ra_pinfo=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.forwarding=0
# Updated according to postgresql tuning
vm.dirty_ratio = 10
vm.dirty_background_ratio = 1
vm.swappiness = 0
vm.overcommit_memory = 2
kernel.sched_autogroup_enabled = 0
kernel.sched_migration_cost = 50000000

/etc/sysctl.d/30-postgresql-shm.conf

# Shared memory settings for PostgreSQL
# Note that if another program uses shared memory as well, you will have to
# coordinate the size settings between the two.
# Maximum size of shared memory segment in bytes
#kernel.shmmax = 33554432
# Maximum total size of shared memory in pages (normally 4096 bytes)
#kernel.shmall = 2097152
kernel.shmmax = 8589934592
kernel.shmall = 17179869184
# Updated according to postgresql tuning

Đầu ra của MegaCli64 -LDInfo -LAll -aAll

Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 446.125 GB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 446.125 GB
State               : Optimal
Strip Size          : 64 KB
Number Of Drives per span:2
Span Depth          : 2
Default Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
Is VD Cached: No

(1) .Nếu các cột không được lập chỉ mục, bạn có thể tận dụng lợi thế của HOT (xem git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/... ). (2). Hãy thử với synchronous_commit = off, sau khi đọc các tài liệu tại postgresql.org/docs/9.2/static/wal-async-commit.html . (3). Cấu hình của bạn trông như thế nào? Ví dụ. kết quả của truy vấn này:SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');
bma

@bma Hãy để tôi thêm cảnh báo về synchronous_commit: '
dezso

@dezso Tôi nên nói rõ hơn về phần tài liệu mà tôi đã đề cập. Cảm ơn bạn đã làm rõ. Lý do tôi đưa ra là vì một trong những máy chủ của chúng tôi chịu tải cao (sử dụng Hibernate) đang bị ảnh hưởng nên tôi đã đưa ra quyết định có căn cứ để chuyển sang cam kết không đồng bộ và 40% tải gần như biến mất. Không được khuyến nghị cho hầu hết các hệ thống, nhưng trong một số trường hợp nhất định, nó có thể khiến bạn mất thời gian giữa nâng cấp máy chủ và thay đổi ứng dụng.
bma

Câu trả lời:


10

Nếu thực hiện nâng cấp phần cứng, số lượng đĩa có phải là hiệu suất không?

Vâng, như một đĩa cứng - ngay cả SAS - có một cái đầu cần có thời gian để di chuyển.

Muốn nâng cấp HUGH?

Giết các đĩa SAS, đi đến SATA. Cắm SSD SSD - cấp doanh nghiệp, như Samsung 843T.

Kết quả? Bạn có thể thực hiện khoảng 60.000 (tức là 60 nghìn) IOPS trên mỗi ổ đĩa.

Đây là lý do SSD là kẻ giết người trong không gian DB và rẻ hơn rất nhiều so với bất kỳ ổ đĩa SAS nào. Đĩa quay phy thùng chỉ không thể theo kịp khả năng IOPS của đĩa.

Các đĩa SAS của bạn là một lựa chọn tầm thường để bắt đầu (quá lớn để có nhiều IOPS) Đối với cơ sở dữ liệu sử dụng cao hơn (nhiều đĩa nhỏ hơn có nghĩa là nhiều IOPS hơn), nhưng cuối cùng SSD là công cụ thay đổi trò chơi ở đây.

Về phần mềm / kernel. Bất kỳ cơ sở dữ liệu phong nha sẽ làm rất nhiều IOPS và xóa bộ đệm. Tệp nhật ký này cần được VIẾT cho các điều kiện ACID cơ bản được đảm bảo. Các giai điệu hạt nhân duy nhất bạn có thể làm sẽ làm mất hiệu lực tính toàn vẹn giao dịch của bạn - một phần bạn có thể thoát khỏi điều đó. Bộ điều khiển Raid ở chế độ ghi lại sẽ làm điều đó - xác nhận việc ghi là bị xóa ngay cả khi không - nhưng nó có thể làm như vậy vì BBU được coi là an toàn vào ngày khi mất điện. Bất cứ điều gì bạn làm cao hơn trong kernel - biết rõ hơn bạn có thể sống với các tác dụng phụ tiêu cực.

Cuối cùng, cơ sở dữ liệu cần IOPS và bạn có thể ngạc nhiên khi thấy thiết lập của mình nhỏ bé như thế nào so với một số người khác ở đây. Tôi đã thấy các databa với hơn 100 đĩa chỉ để có được IOPS mà họ cần. Nhưng thực sự, ngày nay, bạn mua SSD và tăng kích thước cho chúng - chúng rất vượt trội về khả năng IOPS, thật vô nghĩa khi chiến đấu với trò chơi này với các ổ đĩa SAS.

Và vâng, số IOPS của bạn trông không tệ cho phần cứng. Trong những gì tôi mong đợi.


6

Nếu bạn có đủ khả năng, hãy đặt pg_xlog vào một cặp ổ đĩa RAID 1 riêng biệt trên bộ điều khiển riêng với RAM được hỗ trợ bằng pin được cấu hình để ghi lại. Điều này đúng ngay cả khi bạn cần sử dụng công cụ quay vòng cho pg_xlog trong khi mọi thứ khác đều có trên SSD.

Nếu bạn sử dụng SSD, hãy đảm bảo rằng nó có siêu tụ điện hoặc các phương tiện khác để duy trì tất cả dữ liệu được lưu trong bộ nhớ cache khi mất điện.

Nói chung, nhiều trục chính có nghĩa là băng thông I / O nhiều hơn.


Thật không may, tôi chỉ có bốn khe hdd trong bộ điều khiển đột kích. Tại sao bạn lại đặt pg_xlog trên một mảng riêng, nếu tất cả các đĩa khác là của SSD?
Niels Kristian

2
@NielsKristian Tôi nghĩ rằng tôi đúng khi tôi nói rằng trong hầu hết các hệ thống, nhật ký giao dịch là thứ được viết nhiều nhất trên đĩa. Ngoài ra, viết nó về cơ bản song song với việc viết dữ liệu. Cả hai không thể được thực hiện cùng lúc với ổ cứng vì đầu nằm trên pg_xlog hoặc trên các thư mục dữ liệu. (Cảnh báo đơn giản hóa nghiêm trọng!) Tách hai tác vụ sẽ tách gánh nặng IO trên hai đĩa / mảng độc lập.
dezso

2
Ngoài những gì @dezso đã nói, các ổ đĩa cứng vẫn ổn để lưu trữ dành riêng cho WAL vì quyền truy cập gần như hoàn toàn theo tuần tự, vì vậy thời gian tìm kiếm là tối thiểu ..
kgrittn

1

Giả sử bạn đang chạy trên Linux, hãy chắc chắn đặt bộ lập lịch IO của đĩa.

Từ kinh nghiệm trong quá khứ, chuyển sang noop sẽ giúp bạn tăng tốc khá đáng kể (đặc biệt là đối với SSD).

Thay đổi lịch trình IO có thể được thực hiện nhanh chóng mà không có thời gian chết.

I E. echo noop> / sys / block // queue / calendaruler

Xem: http://www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/ để biết thêm thông tin.

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.