InnoDB Buffer Pool là gì?
InnoDB Buffer Pool là không gian bộ nhớ chứa nhiều cấu trúc dữ liệu trong bộ nhớ của InnoDB, buffer, cache, index và thậm chí cả dữ liệu hàng. innodb_buffer_pool_size là tham số cấu hình MySQL chỉ định dung lượng bộ nhớ được phân bổ cho nhóm bộ đệm InnoDB bằng MySQL. Đây là một trong những cài đặt quan trọng nhất trong cấu hình lưu trữ MySQL và nên được định cấu hình dựa trên RAM hệ thống có sẵn.
Trong bài đăng này, chúng ta sẽ tìm hiểu InnoDB Buffer Pool Size qua hai cách tiếp cận thiết lập giá trị InnoDB Buffer Pool Size của bạn, kiểm tra ưu và nhược điểm của những hành động đó và cũng đề xuất một phương pháp duy nhất để đạt được giá trị tối ưu dựa trên kích thước RAM hệ thống của bạn.
Cách tiếp cận 1. Phương pháp Rule of Thumb
Cách cài đặt phổ biến nhất được tuân theo là đặt giá trị này ở mức 70% – 80% RAM hệ thống. Mặc dù nó hoạt động tốt trong hầu hết các trường hợp, phương pháp này có thể không tối ưu trong tất cả các cấu hình. Hãy lấy ví dụ về một hệ thống có RAM 192GB. Dựa trên phương pháp trên, chúng ta đạt được khoảng 150GB cho kích thước bộ đệm. Tuy nhiên, đây không thực sự là một con số tối ưu vì nó không tận dụng hết kích thước RAM lớn có sẵn trong hệ thống và để lại khoảng 40GB bộ nhớ. Sự khác biệt này thậm chí có thể còn đáng kể hơn khi chúng ta chuyển sang các hệ thống có cấu hình lớn hơn, nơi chúng ta nên sử dụng RAM có sẵn ở mức độ lớn hơn.
Cách tiếp cận 2. Một cách tiếp cận sắc bén hơn
Cách tiếp cận này dựa trên sự hiểu biết chi tiết hơn về nội bộ của nhóm đệm InnoDB và các tương tác của nó, được mô tả rất tốt trong cuốn sách MySQL hiệu suất cao.
Hãy xem phương pháp sau để tính kích thước nhóm bộ đệm InnoDB.
- Bắt đầu với tổng RAM có sẵn.
- Trừ số lượng phù hợp cho nhu cầu hệ điều hành.
- Trừ số lượng phù hợp cho tất cả các nhu cầu MySQL (như các bộ đệm MySQL khác nhau, bảng tạm thời, nhóm kết nối và bộ đệm liên quan đến sao chép).
- Chia kết quả cho 105%, đây là xấp xỉ chi phí chung cần thiết để quản lý chính nhóm bộ đệm.
Ví dụ: chúng ta hãy xem xét một hệ thống có RAM 192GB chỉ sử dụng InnoDB và có tổng kích thước file log khoảng 4GB. Chúng ta có thể sử dụng một quy tắc như ‘tối đa 2GB hoặc 5% tổng RAM’ để phân bổ nhu cầu hệ điều hành như được khuyến nghị trong cuốn sách trên, có khoảng 9.6GB. Sau đó, chúng ta cũng sẽ phân bổ khoảng 4GB cho các nhu cầu MySQL khác, chủ yếu có tính đến kích thước file log. Phương pháp này dẫn đến khoảng 170GB cho kích thước nhóm bộ đệm InnoDB của chúng ta, khoảng 88.5% sử dụng kích thước RAM có sẵn.
Mặc dù chúng ta đã sử dụng quy tắc ‘tối đa 2GB hoặc 5% tổng RAM’ để tính toán phân bổ bộ nhớ của chúng ta cho các nhu cầu hệ điều hành ở trên, quy tắc tương tự không hoạt động tốt trong mọi trường hợp, đặc biệt cho các hệ thống có RAM cỡ trung bình từ 2GB đến 32GB. Ví dụ, trong một hệ thống có RAM 3GB, việc phân bổ 2GB cho nhu cầu hệ điều hành không để lại nhiều cho nhóm bộ đệm InnoDB, trong khi việc phân bổ 5% RAM là quá ít cho nhu cầu hệ điều hành của chúng ta.
Vì vậy, hãy tinh chỉnh quy tắc phân bổ hệ điều hành ở trên và kiểm tra phương pháp tính toán InnoDB trên các cấu hình RAM khác nhau:
Đối với hệ thống có RAM kích thước nhỏ (< = 1GB)
Đối với các hệ thống chạy với RAM dưới 1GB, tốt hơn là nên sử dụng giá trị cấu hình mặc định của MySQL là 128MB cho kích thước bộ đệm InnoDB.
Đối với hệ thống có RAM cỡ trung bình (1GB – 32GB)
Xem xét trường hợp của các hệ thống có kích thước RAM từ 1GB – 32GB, chúng ta có thể tính toán nhu cầu hệ điều hành bằng cách sử dụng phương pháp heuristics này:
256MB + 256 * log2 (kích thước RAM tính bằng GB)
Sự hợp lý hóa ở đây là, đối với các cấu hình RAM thấp, chúng ta bắt đầu với giá trị cơ bản là 256MB cho nhu cầu hệ điều hành và tăng phân bổ này trong thang logarit khi dung lượng RAM tăng lên. Bằng cách này, chúng ta có thể đưa ra một công thức xác định để phân bổ RAM cho nhu cầu hệ điều hành của chúng ta. Chúng ta cũng sẽ phân bổ cùng một dung lượng bộ nhớ cho các nhu cầu khác của MySQL. Ví dụ: trong một hệ thống có 3GB RAM, chúng ta sẽ phân bổ hợp lý 660MB cho nhu cầu hệ điều hành và 660MB khác cho các nhu cầu khác của MySQL, dẫn đến giá trị khoảng 1.6GB cho kích thước InnoDB Buffer Pool của chúng ta.
Đối với hệ thống có RAM kích thước cao hơn (> 32GB)
Đối với các hệ thống có kích thước RAM lớn hơn 32GB, chúng ta sẽ quay trở lại tính toán nhu cầu hệ điều hành là 5% kích thước RAM hệ thống của chúng ta và cùng một lượng cho các nhu cầu khác của MySQL. Vì vậy, đối với một hệ thống có kích thước RAM 192GB, phương pháp của chúng ta sẽ hạ cánh ở mức khoảng 165GB cho kích thước nhóm đệm InnoDB, một lần nữa, một giá trị tối ưu sẽ được sử dụng.
Biểu đồ Kích thước InnoDB Buffer Pool cho các kích thước RAM khác nhau
Chú ý về việc tính toán InnoDB Buffer Pool
Những cân nhắc trong bài đăng trên blog này dành cho các hệ thống Linux dành riêng cho MySQL. Đối với các hệ thống Windows hoặc hệ thống chạy nhiều ứng dụng cùng với MySQL, những nhận định và cấu hình này có thể không chính xác. Cũng cần lưu ý rằng, mặc dù chúng ta có thể sử dụng các công cụ này làm tài liệu tham khảo, nhưng thực sự cần có kinh nghiệm tốt, thử nghiệm, giám sát liên tục và tinh chỉnh để có được kích thước phù hợp cho innodb_buffer_pool_size của bạn.