Làm thế nào lớn nên được mysql innodb_buffer_pool_size?


170

Tôi có một cơ sở dữ liệu bận rộn chỉ với các bảng InnoDB có kích thước khoảng 5 GB. Cơ sở dữ liệu chạy trên máy chủ Debian bằng đĩa SSD và tôi đã đặt kết nối tối đa = 800, đôi khi bão hòa và khiến máy chủ tạm dừng. Truy vấn trung bình mỗi giây là khoảng 2,5K. Vì vậy, tôi cần tối ưu hóa việc sử dụng bộ nhớ để có chỗ cho các kết nối tối đa có thể.

Tôi đã thấy các đề xuất rằng innodb_buffer_pool_size phải chiếm tới 80% tổng bộ nhớ. Mặt khác, tôi nhận được cảnh báo này từ tập lệnh điều chỉnh:

Max Memory Ever Allocated : 91.97 G
Configured Max Per-thread Buffers : 72.02 G
Configured Max Global Buffers : 19.86 G
Configured Max Memory Limit : 91.88 G
Physical Memory : 94.58 G

Dưới đây là các biến innodb hiện tại của tôi:

| innodb_adaptive_flushing                          | ON                                                                                                                     |
| innodb_adaptive_hash_index                        | ON                                                                                                                     |
| innodb_additional_mem_pool_size                   | 20971520                                                                                                               |
| innodb_autoextend_increment                       | 8                                                                                                                      |
| innodb_autoinc_lock_mode                          | 1                                                                                                                      |
| innodb_buffer_pool_instances                      | 1                                                                                                                      |
| innodb_buffer_pool_size                           | 20971520000                                                                                                            |
| innodb_change_buffering                           | all                                                                                                                    |
| innodb_checksums                                  | ON                                                                                                                     |
| innodb_commit_concurrency                         | 0                                                                                                                      |
| innodb_concurrency_tickets                        | 500                                                                                                                    |
| innodb_data_file_path                             | ibdata1:10M:autoextend                                                                                                 |
| innodb_data_home_dir                              |                                                                                                                        |
| innodb_doublewrite                                | ON                                                                                                                     |
| innodb_fast_shutdown                              | 1                                                                                                                      |
| innodb_file_format                                | Antelope                                                                                                               |
| innodb_file_format_check                          | ON                                                                                                                     |
| innodb_file_format_max                            | Antelope                                                                                                               |
| innodb_file_per_table                             | ON                                                                                                                     |
| innodb_flush_log_at_trx_commit                    | 2                                                                                                                      |
| innodb_flush_method                               | O_DIRECT                                                                                                               |
| innodb_force_load_corrupted                       | OFF                                                                                                                    |
| innodb_force_recovery                             | 0                                                                                                                      |
| innodb_io_capacity                                | 200                                                                                                                    |
| innodb_large_prefix                               | OFF                                                                                                                    |
| innodb_lock_wait_timeout                          | 50                                                                                                                     |
| innodb_locks_unsafe_for_binlog                    | OFF                                                                                                                    |
| innodb_log_buffer_size                            | 4194304                                                                                                                |
| innodb_log_file_size                              | 524288000                                                                                                              |
| innodb_log_files_in_group                         | 2                                                                                                                      |
| innodb_log_group_home_dir                         | ./                                                                                                                     |
| innodb_max_dirty_pages_pct                        | 75                                                                                                                     |
| innodb_max_purge_lag                              | 0                                                                                                                      |
| innodb_mirrored_log_groups                        | 1                                                                                                                      |
| innodb_old_blocks_pct                             | 37                                                                                                                     |
| innodb_old_blocks_time                            | 0                                                                                                                      |
| innodb_open_files                                 | 300                                                                                                                    |
| innodb_purge_batch_size                           | 20                                                                                                                     |
| innodb_purge_threads                              | 0                                                                                                                      |
| innodb_random_read_ahead                          | OFF                                                                                                                    |
| innodb_read_ahead_threshold                       | 56                                                                                                                     |
| innodb_read_io_threads                            | 4                                                                                                                      |
| innodb_replication_delay                          | 0                                                                                                                      |
| innodb_rollback_on_timeout                        | OFF                                                                                                                    |
| innodb_rollback_segments                          | 128                                                                                                                    |
| innodb_spin_wait_delay                            | 6                                                                                                                      |
| innodb_stats_method                               | nulls_equal                                                                                                            |
| innodb_stats_on_metadata                          | ON                                                                                                                     |
| innodb_stats_sample_pages                         | 8                                                                                                                      |
| innodb_strict_mode                                | OFF                                                                                                                    |
| innodb_support_xa                                 | ON                                                                                                                     |
| innodb_sync_spin_loops                            | 30                                                                                                                     |
| innodb_table_locks                                | ON                                                                                                                     |
| innodb_thread_concurrency                         | 4                                                                                                                      |
| innodb_thread_sleep_delay                         | 10000                                                                                                                  |
| innodb_use_native_aio                             | ON                                                                                                                     |
| innodb_use_sys_malloc                             | ON                                                                                                                     |
| innodb_version                                    | 1.1.8                                                                                                                  |
| innodb_write_io_threads                           | 4                                                                                                                      |

Một lưu ý phụ có thể có liên quan: Tôi thấy rằng khi tôi cố gắng chèn một bài đăng lớn (giả sử trên 10KB) từ Drupal (nằm trên một máy chủ web riêng biệt) vào cơ sở dữ liệu, nó sẽ tồn tại mãi mãi và trang không trở lại chính xác.

Về những điều này, tôi tự hỏi những gì nên là innodb_buffer_pool_size của tôi để có hiệu suất tối ưu. Tôi đánh giá cao đề xuất của bạn để đặt điều này và các tham số khác tối ưu cho kịch bản này.

Câu trả lời:


252

Innodb_buffer_pool_size của bạn là rất lớn. Bạn đã đặt nó ở 20971520000. Đó là 19,5135 GB. Nếu bạn chỉ có 5GB dữ liệu và chỉ mục của InnoDB, thì bạn chỉ nên có khoảng 8GB. Ngay cả điều này có thể quá cao.

Đây là những gì bạn nên làm. Đầu tiên chạy truy vấn này

SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;

Điều này sẽ cung cấp cho bạn RIBPS, Kích thước nhóm bộ đệm InnoDB được đề xuất dựa trên tất cả các dữ liệu và chỉ mục của InnoDB với thêm 60%.

Ví dụ

mysql>     SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
    ->     (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
    ->     FROM information_schema.tables WHERE engine='InnoDB') A;
+-------+
| RIBPS |
+-------+
|     8 |
+-------+
1 row in set (4.31 sec)

mysql>

Với đầu ra này, bạn sẽ đặt như sau trong /etc/my.cnf

[mysqld]
innodb_buffer_pool_size=8G

Kế tiếp, service mysql restart

Sau khi khởi động lại, hãy chạy mysql trong một hoặc hai tuần. Sau đó, chạy truy vấn này:

SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM
(SELECT variable_value PagesData
FROM information_schema.global_status
WHERE variable_name='Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize
FROM information_schema.global_status
WHERE variable_name='Innodb_page_size') B;

Điều này sẽ cung cấp cho bạn có bao nhiêu GB bộ nhớ thực được sử dụng bởi Dữ liệu InnoDB trong Nhóm bộ đệm InnoDB tại thời điểm này.

Tôi đã viết về điều này trước đây: Điều gì để đặt innodb_buffer_pool và tại sao ..?

Bạn chỉ có thể chạy DataGBtruy vấn này ngay bây giờ thay vì cấu hình lại, khởi động lại và chờ đợi một tuần.

Giá trị này DataGBgần giống với mức lớn hơn của Bộ đệm InnoDB + (phần trăm được chỉ định trong innodb_change_buffer_max_size). Tôi chắc chắn rằng điều này sẽ ít hơn nhiều so với 20000M mà bạn đã đặt trước ngay bây giờ. Tiết kiệm RAM có thể được sử dụng để điều chỉnh những thứ khác như

CÁCH SỐ 1

Điều này rất quan trọng cần lưu ý: Đôi khi, InnoDB có thể yêu cầu thêm 10% so với giá trị cho innodb_buffer_pool_size . Đây là những gì Tài liệu MySQL nói về điều này:

Bạn đặt giá trị này càng lớn, I / O đĩa càng ít để truy cập dữ liệu trong bảng. Trên máy chủ cơ sở dữ liệu chuyên dụng, bạn có thể đặt giá trị này lên tới 80% kích thước bộ nhớ vật lý của máy. Hãy chuẩn bị để thu nhỏ lại giá trị này nếu những vấn đề khác xảy ra:

Cạnh tranh cho bộ nhớ vật lý có thể gây ra phân trang trong hệ điều hành.

InnoDB dành bộ nhớ bổ sung cho bộ đệm và cấu trúc điều khiển, để tổng dung lượng được phân bổ lớn hơn khoảng 10% so với kích thước đã chỉ định.

Không gian địa chỉ phải liền kề nhau, có thể là một vấn đề trên các hệ thống Windows có DLL tải tại các địa chỉ cụ thể.

Thời gian để khởi tạo nhóm bộ đệm tỷ lệ thuận với kích thước của nó. Trên các cài đặt lớn, thời gian khởi tạo này có thể là đáng kể. Ví dụ: trên máy chủ Linux x86_64 hiện đại, việc khởi tạo nhóm bộ đệm 10 GB mất khoảng 6 giây. Xem Phần 8.9.1, Bộ đệm InnoDB Bộ đệm .

CÁCH SỐ 2

Tôi thấy các giá trị sau trong của bạn my.cnf

| innodb_io_capacity                                | 200 |
| innodb_read_io_threads                            | 4   |
| innodb_thread_concurrency                         | 4   |
| innodb_write_io_threads                           | 4   |

Những con số này sẽ cản trở InnoDB truy cập vào nhiều lõi

Vui lòng đặt như sau:

[mysqld]
innodb_io_capacity = 2000
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
innodb_write_io_threads = 64

Tôi đã viết về điều này trước đây trong DBA StackExchange

Tôi vừa trả lời một câu hỏi như thế này trong ServerFault bằng công thức ngắn gọn hơn :

SELECT CONCAT(CEILING(RIBPS/POWER(1024,pw)),SUBSTR(' KMGT',pw+1,1))
Recommended_InnoDB_Buffer_Pool_Size FROM
(
    SELECT RIBPS,FLOOR(LOG(RIBPS)/LOG(1024)) pw
    FROM
    (
        SELECT SUM(data_length+index_length)*1.1*growth RIBPS
        FROM information_schema.tables AAA,
        (SELECT 1.25 growth) BBB
        WHERE ENGINE='InnoDB'
    ) AA
) A;

1
Cảm ơn cho bài viết tuyệt vời này! Công thức của bạn bắt đầu bằng việc SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...tạo ra lỗi sau trên MySQL 5.7: " Tính năng 'Information_SCHema.GLOBAL_STATUS' bị vô hiệu hóa, xem tài liệu về 'show_compabilities_56' ". Bạn sẽ có một phiên bản cập nhật bằng cách nào?
Benjamin

Tôi nhận được 307 RIBPS và 264G. Điều đó có nghĩa là tôi cần 307GB RAM?
E_Blue

Giống như 264G. Nhưng bạn nên có đủ RAM cho điều đó, nếu không, hãy cung cấp 80% RAM được đề cập cho mysql, tùy thuộc vào những gì khác chạy trên hệ thống.
sjas

2
Bài viết tuyệt vời nhất tôi từng đọc! Tôi có một cơ sở dữ liệu lớn khoảng 3 GB. Sau khi đọc câu trả lời / bài viết của bạn và tốc độ liên kết đã tăng lên gấp đôi
fat_mike

4
@Benjamin: Kể từ MySQL 5.7.6, information_schema được hợp nhất thành Performance_schema. Vì vậy, chỉ cần thay đổi "information_schema" thành "Performance_schema" trong truy vấn để làm cho nó hoạt động. Nguồn: dev.mysql.com/doc/refman/5.7/en/status-table.html
Ralph Bolton

11

Một cái gì đó như thế này? Sử dụng SHOW VARIABLESSHOW GLOBAL STATUS:

Biểu thức: innodb_buffer_pool_size / _ram
Ý nghĩa: % RAM được sử dụng cho InnoDB buffer_pool
Phạm vi được đề xuất: 60 ~ 80%

Biểu thức: Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
Ý nghĩa: Đọc các yêu cầu phải đánh vào
phạm vi được đề xuất: 0-2%
Phải làm gì ngoài phạm vi: Tăng innodb_buffer_pool_size nếu bạn có đủ RAM.

Biểu thức: Innodb_pages_read / Innodb_buffer_pool_read_requests
Ý nghĩa: Đọc các yêu cầu phải nhấn vào đĩa
Phạm vi được đề xuất: 0-2%
Phải làm gì nếu nằm ngoài phạm vi: Tăng innodb_buffer_pool_size nếu bạn có đủ RAM.

Biểu thức: Innodb_pages_written / Innodb_buffer_pool_write_requests
Ý nghĩa: Viết các yêu cầu phải nhấn vào đĩa
Phạm vi được đề xuất: 0-15%
Phải làm gì nếu nằm ngoài phạm vi: Kiểm tra innodb_buffer_pool_size

Biểu thức: Innodb_buffer_pool_reads / Uptime
Ý nghĩa: Đọc
Phạm vi đề xuất: 0-100 / giây.
Phải làm gì nếu nằm ngoài phạm vi: Tăng innodb_buffer_pool_size?

Biểu thức: (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
Ý nghĩa: InnoDB I / O
Phạm vi đề xuất: 0-100 / giây.
Phải làm gì nếu nằm ngoài phạm vi: Tăng innodb_buffer_pool_size?

Biểu hiện: Innodb_buffer_pool_pages_flushed / Uptime
Ý nghĩa: Writes (tuôn ra)
Phạm vi đề xuất: 0-100 / giây.
Phải làm gì nếu nằm ngoài phạm vi: Tăng innodb_buffer_pool_size?

Biểu thức: Innodb_buffer_pool_wait_free / Uptime
Ý nghĩa: Bộ đếm khi không có trang miễn phí trong buffer_pool. Đó là, tất cả các trang đều bẩn.
Phạm vi đề xuất: 0-1 / giây.
Phải làm gì nếu nằm ngoài phạm vi: Trước tiên hãy chắc chắn innodb_buffer_pool_size được đặt hợp lý; nếu vẫn gặp sự cố, hãy giảm innodb_max_denty_pages_pct


Cảm ơn @Rick vì bình luận tốt đẹp. Có gì innodb_buffer_pool_sizegiá trị quy định cụ thể? Kích thước thực tế hoặc cấu hình một?
đùa

1
@joker - innodb_buffer_pool_sizecho biết kích thước tối đa. Trong một máy chủ thông thường, "vùng đệm" bắt đầu nhỏ, nhưng nhanh chóng phát triển đến kích thước tối đa đó và vẫn ở đó. Lưu ý: Nếu dung lượng đó lớn hơn RAM (hoặc thậm chí gần), thì điều đó dẫn đến việc hoán đổi, điều này rất tệ cho hiệu suất.
Rick James

7

Tiêu đề của bạn hỏi về innodb_buffer_pool_size, nhưng tôi nghi ngờ đó không phải là vấn đề thực sự. (Rolando nhận xét về lý do tại sao bạn đặt nó đủ lớn, thậm chí quá lớn.)

Tôi đã đặt kết nối tối đa = 800, đôi khi bão hòa và khiến máy chủ tạm dừng.

Điều đó không rõ ràng. 800 người dùng ở chế độ "Ngủ" hầu như không ảnh hưởng đến hệ thống. 800 chủ đề hoạt động sẽ là một thảm họa. Có bao nhiêu chủ đề đang "chạy"?

Là các chủ đề chặn nhau? Xem TÌNH TRẠNG SHOW Engine INNODB để biết một số manh mối về sự bế tắc, v.v.

Có bất kỳ truy vấn hiển thị trong Slowlog? Hãy tối ưu hóa chúng.

Phiên bản nào bạn đang sử dụng? XtraDB (một sự thay thế thả xuống cho InnoDB) thực hiện công việc sử dụng nhiều lõi tốt hơn. 5.6.7 làm một công việc thậm chí còn tốt hơn.

innodb_buffer_pool_instances - thay đổi điều này thành 8 (giả sử bộ đệm 20G); nó sẽ giảm nhẹ sự tranh chấp Mutex.

Bạn bị ràng buộc I / O hay bạn bị ràng buộc CPU? Các giải pháp hoàn toàn khác nhau, tùy thuộc vào câu trả lời của bạn.

SSD - Có thể tốt hơn nếu tất cả các tệp nhật ký nằm trên các ổ đĩa không phải SSD.


6

Nhiều bộ nhớ hơn luôn tốt hơn, nhưng theo kinh nghiệm của tôi, hầu hết các lần kích thước nhóm bộ đệm không phù hợp với kích thước dữ liệu của bạn. Nhiều bảng không hoạt động hầu hết thời gian, như các bảng sao lưu nằm xung quanh, vì vậy kích thước nhóm bộ đệm innodb nên phù hợp với kích thước dữ liệu của bạn.

Khung thời gian bạn chỉ định cho các trang hoạt động ảnh hưởng đến hiệu suất, nhưng có một điểm tối ưu, nơi bạn sẽ không có hiệu suất cao hơn cho kích thước bộ đệm lớn hơn. Bạn có thể ước tính / tính toán / đo lường bằngshow engine innodb status

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.