Số lượng tối ưu của các nhóm bộ đệm của InnoDB MySQL


12

Đặc điểm máy chủ

  • Tổng RAM hệ thống: 8GB (chạy MySQL + các thứ khác ngoài MySQL trên đó tức là không dành riêng cho MySQL)
  • Số lượng lõi CPU: 6
  • Tôi có dữ liệu trong db lên tới khoảng 2GB
  • Tôi có Kích thước nhóm bộ đệm InnoDB được đặt thành 4GB

Cái nào tốt hơn:

  • Innodb Buffer Pool Instances được đặt thành 1?
  • Innodb Buffer Pool Instances được đặt thành 2 (2GB mỗi cái)?
  • Innodb Buffer Pool Instances được đặt thành 4 (mỗi GB 1 GB)?
  • Trường hợp nhóm bộ đệm Innodb được đặt thành 8 (cài đặt mặc định)

Do đó, tôi không chắc chắn về cách lập luận khi nói đến Trường hợp bộ đệm và cả "trường hợp sử dụng hoặc chịu sự hoán đổi của hệ điều hành khi có Kích thước nhóm bộ đệm InnoDB lớn như vậy".


Bạn đã nhận được "trường hợp sử dụng hoặc bị hoán đổi hệ điều hành khi có kích thước nhóm bộ đệm InnoDB lớn như vậy"?
Rick James

70% RAM cho tổng số bộ đệm sau khi trừ không gian cho "nội dung khác ngoài MySQL" sẽ ổn, bất kể số lượng phiên bản.
Rick James

Tôi không thể đặt bất kỳ câu trả lời nào được chấp nhận cho đến khi tôi coi tất cả chúng là "bắn từ hông". Nếu có ai thắc mắc, tôi đã sử dụng kích thước nhóm bộ đệm 4G và 2 phiên bản và nó hoạt động rất tốt trên Debian 8.1 với 8G tổng bộ nhớ chạy php-fpm + nginx trên cùng một máy với tốc độ trung bình khoảng 60 truy vấn / giây.
Adergaard

Câu trả lời:


7

Khi tôi quay trở lại MySQL 5.5, tôi sẽ nghĩ về điều tương tự.

Những gì tôi học được trong những năm đó là như sau: Nếu Buffer Pool lớn hơn một nửa RAM đã cài đặt và innodb_buffer_pool_instances là 1 (mặc định là 5.5), mối đe dọa hoán đổi luôn xảy ra.

Tôi đã thảo luận điều này trước đây: Có quy tắc nào về kích thước và số lượng của một thể hiện vùng đệm không? . Trong bài đăng đó, tôi đã đề cập đến một ví dụ về một khách hàng có 192GB RAM trên máy chủ với Bộ đệm 162GB. Khi innodb_buffer_pool_instances là 1, việc hoán đổi đã xảy ra. Khi tôi đặt innodb_buffer_pool_instances thành 2, mọi thứ sẽ tốt hơn.

Trong trường hợp của bạn, vì Vùng đệm chính xác bằng một nửa, giá trị 1 có thể ổn. Tôi sẽ không có cơ hội đó. Tôi sẽ đặt nó thành 2.

Vì MySQL 5.6 có mặc định là 8, bạn không cần phải suy nghĩ về nó nữa.

Tôi sẽ nói điều này: câu trả lời của akuzminsky có nguyên tắc cao nhất . Câu trả lời của tôi chỉ là chụp từ hông dựa trên kinh nghiệm trong quá khứ (tốt và xấu).


Không đời nào! Trao đổi phụ thuộc vào lượng bộ nhớ được phân bổ, không phụ thuộc vào nhóm.
Rick James

Rất tốt để biết mặc định là 8 ... Nhưng sự khác biệt nếu nó bị cắt xuống 4 hoặc tăng lên 16? Có bất kỳ hình phạt / lưu trữ hình phạt hoặc lợi ích? Lý do duy nhất tôi thực sự ở đây, mysqltuner khuyên bạn nên innodb_buffer_pool_instances (= 1) nhưng tôi không luôn tin tưởng vào các đề xuất của nó. Cấp, tôi không có vấn đề, chỉ tò mò.
PJ Brunet

@PJBrunet nếu nhóm bộ đệm InnoDB có ít hơn một nửa RAM, thì các trường hợp nhóm bộ đệm InnoDB có thể được để lại ở 1.
RolandoMyQueryDBA

6

Số lượng phiên bản nhóm bộ đệm nên được tăng lên để tránh sự tranh chấp đột biến của vùng đệm.

Với kích thước nhóm bộ đệm 8GB, tôi nghi ngờ bạn sẽ không bao giờ thấy sự tranh chấp của vùng đệm.

CẬP NHẬT 0 :

Tôi đề cập đến nhóm bộ đệm 8Gb trong câu trả lời trong khi trong câu hỏi ban đầu, tổng bộ nhớ là 8GB. Chắc chắn, vùng đệm phải nhỏ hơn 8GB. 4GB có vẻ như là một khởi đầu tốt nhưng đảm bảo không xảy ra hoán đổi.

CẬP NHẬT 1 :

// từ các slide của Yasufumi (trong các phiên bản MySQL gần đây, đầu ra có thể hơi khác nhau)

Để xác định xem có sự tranh chấp trên vùng đệm của bộ đệm hay không, hãy thu thập hàng tá SHOW ENGINE INNODB STATUSmẫu trong thời gian cao điểm.

Sau đó tổng hợp nó bằng cách sử dụng đoạn mã shell:

#!/bin/sh
cat $1.innodb | grep "Mutex at " | cut -d"," -f1 | sort | uniq -c > /tmp/tmp1.txt 
cat $1.innodb | grep "lock on " | cut -d"-"
-f2- | sort | uniq -c > /tmp/tmp2.txt
cat /tmp/tmp1.txt /tmp/tmp2.txt | sort -n > $1.contention rm /tmp/tmp1.txt /tmp/tmp2.txt

cung cấp đầu ra như thế này:

.....
4 lock on RW-latch at 0x7fb86b2c9138 created in file dict/dict0dict.c line 1356
6 lock on RW-latch at 0x7fb86b2c4138 created in file dict/dict0dict.c line 1356
12 lock on RW-latch at 0x7fb86b2d9538 created in file dict/dict0dict.c line 1356
20 lock on RW-latch at 0x7fb86b2db138 created in file dict/dict0dict.c line 1356
22 Mutex at 0x7fb86b28f0e0 created file btr/btr0sea.c line 139
30 lock on RW-latch at 0x7fb86b2ba938 created in file dict/dict0dict.c line 1356
36 lock on RW-latch at 0x7fb86b2bad38 created in file dict/dict0dict.c line 1356
71 Mutex at 0x7fb86b28ecb8 created file buf/buf0buf.c line 597
164 lock on RW-latch at 0x7fb86b28f0b8 created in file btr/btr0sea.c line 139

Nếu bạn thấy số lượng lớn bộ đệm của vùng đệm chờ đợi, thì đã đến lúc xem xét nhiều trường hợp nhóm bộ đệm. Sự tranh chấp không có khả năng xảy ra trên một vùng đệm nhỏ hơn ~ 48G.


1
Nhưng không có bộ đệm 8G chỉ trong 8GB RAM!
Rick James

Ở kích thước dbsize tức là kích thước nhóm bộ đệm innodb, bạn sẽ bắt đầu nghĩ về các trường hợp sau đó? Tôi giải thích câu trả lời của bạn là ở những cấp độ tương đối nhỏ này , không có lý do gì để có nhiều hơn một. Chính xác? Bạn có một nguồn trên này là như vậy? Tài liệu MySQL nói "multi gigabyte" mà - với tôi - là một cách diễn đạt rất mờ nhạt. Trên thực tế, 2 GB là đa nhưng tôi nghĩ họ đề cập đến một bộ dữ liệu lớn hơn thế ...
Adergaard

2

Đặt "swappiness" thành 1 nếu HĐH của bạn có như vậy. Vấn đề có thể là một OOM quá tích cực.


0

Tôi sẽ đề nghị thiết lập điều này để phù hợp với số lượng chủ đề MySQL tối đa mà bạn muốn chạy đồng thời. Tôi sử dụng số lượng lõi.

Tôi cũng đặt innodb_read_io_threadsinnodb_write_io_threadsđể phù hợp với số này.

Nếu innodb_buffer_pool_instancesquá thấp, chủ đề của bạn có thể bị kẹt trong chờ đợi semaphore. Điều này làm cho cả CPU và I / O dường như không hoạt động, mặc dù hệ thống phải bận rộn - và độ trễ ứng dụng của bạn sẽ đi qua mái nhà.

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.