Зрозуміти статистику буферного пулу INNODB


20

Прочитавши цю сторінку в документації на mysql , я спробував зрозуміти наше поточне використання InnoDB. В даний час ми виділяємо 6 ГБ оперативної пам’яті для буферного пулу. Розмір нашої бази приблизно однаковий. Ось результат з show engine innodb status\G(ми працюємо v5.5)

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; in additional pool allocated 0
Dictionary memory allocated 1758417
Buffer pool size   393215
Free buffers       853
Database pages     360515
Old database pages 133060
Modified db pages  300
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 7365790, not young 23099457
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1094342, created 185628, written 543182148
0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 360515, unzip_LRU len: 0
I/O sum[2571]:cur[0], unzip sum[0]:cur[0]

Мені хотілося знати, наскільки добре ми використовуємо кеш-пам'ять. Після того, як спочатку поглядів на виході, виявилося , що ми на самому ділі використовувати його, заснований геть Pages made youngі not youngмають номери в них і Buffer pool hit rate is 1000 / 10000(які я бачив в іншому місці в Інтернеті , що це означає , що це використовується досить важко. Правда?)

Що кидає мене через петлю тому young-making rateі notобидва в 0/1000 і young/sта non-young/sдоступи як в 0. Ті б все це вказує , що він не використовується взагалі, НЕ так?

Хтось може допомогти зрозуміти це?

Відповіді:


18
 Buffer pool hit rate is 1000 / 1000

Це єдине дійсно значуще значення в ситуації, в якій ви знаходитесь ... і така ситуація полягає в тому, що вам пощастило мати буферний пул із ідеальною швидкістю 100% потрапляння. Не переаналізуйте іншу частину цього, тому що нічого не потрібно змінювати, якщо тільки ОС сервера недостатньо пам’яті, що спричинить заміну.

Значення молодих / не молодих не цікаві у випадку, коли на буферному пулі є нульовий тиск. InnoDB використовує його, він нічого не робить без нього. Якщо пул занадто малий, сторінки виселяються, а нові сторінки читаються, а інші статистичні дані допомагають вам зрозуміти це ... але це проблема, якої у вас, здається, немає.

Вільний "невикористаний" простір у басейні ніколи не буде нехтувати або залишатися бездіяльним InnoDB, якщо він потрібен з будь-якої причини, тому факт, що це безкоштовно означає лише те, що у вас є дихальна кімната, на яку можна розширити розміри своєї роботи Набір даних збільшується.

Це все, що означає, якщо, звичайно, ви нещодавно перезапустили сервер, в цьому випадку він неповний .. Сервер повинен пройти повний період "звичайного" використання (включаючи повне резервне копіювання), перш ніж статистика розповість всю історію ... чи це година, день, тиждень, місяць чи рік, залежить від вашої заявки.


28

The Buffer pool size 393215 Це на сторінках, а не в байтах.

Щоб побачити розмір буферного пулу в ГБ, виконайте наступне:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Database pages 360515 Це кількість сторінок із даними всередині буферного пулу

Щоб побачити кількість даних у розмірі буферного пулу в ГБ, виконайте наступне:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages 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;

Щоб побачити відсоток використовуваного буферного пулу, запустіть це:

SELECT CONCAT(FORMAT(DataPages*100.0/TotalPages,2),' %') BufferPoolDataPercentage FROM
(SELECT variable_value DataPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Modified db pages 300Це кількість сторінок у буферному басейні, які потрібно записати в базу даних. Їх також називають брудними сторінками.

Щоб побачити простір, зайнятий брудними сторінками, запустіть це:

SELECT FORMAT(DirtyPages*PageSize/POWER(1024,3),2) BufferPoolDirtyGB FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Щоб побачити відсоток брудних сторінок, запустіть це:

SELECT CONCAT(FORMAT(DirtyPages*100.0/TotalPages,2),' %') BufferPoolDirtyPercentage FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Що стосується інших речей на дисплеї, запустіть це:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

Ви побачите всі змінні стану для буферного пулу. Ви можете застосовувати ті самі запити стосовно того, що вам потрібно вивчити.


Дякую! Отже, з цього моменту я розумію, що наш буферний кеш справді використовується, але я хочу знати, якщо ми ЕФЕКТИВНО його використовуємо. Якщо я розумію концепцію молодих та старих сторінок, я здогадуюсь, що хорошим показником того, що кеш-пам'ять буфера використовується в повній мірі, було б кількість сторінок, створених молодими, і доступ до молодих сторінок, правильно? Ми використовуємо mysqldump, щоб робити резервні копії кожні 3 години, що пояснило б, чому це повно. Але з, young-making rate 0 / 1000і 0.00 youngs/sце говорить про те, що ми насправді не використовуємо це. Чи читаю я це правильно?
Сафадо

2
Швидкість молодості 0/1000 говорить вам, що сторінки даних для запущених запитів не тільки всі вміщуються в кеш, вони вписуються в менший (3/8) розмір молодого кеша. Тобто, запити не використовують достатньо даних для старіння деяких сторінок у великий не молодий кеш.
Томас Джонс-Лоу

Коротке пояснення щодо залишків змінних статусу innodb_buffer_pool буде дуже корисним. Чи можете ви, будь ласка, додати його до своєї відповіді
вид'ядхар

5

Я не погоджуюся з оцінкою, що "вам пощастило мати буферний пул із ідеальною 100% частотою враження"

У верхній частині результату (який відсікається) знаходиться рядок, як-от:

Per second averages calculated from the last 16 seconds

Це говорить мені, що жодного зчитування не відбулося протягом останніх 16 секунд, тим самим (штучно) ви отримаєте ідеальну оцінку "1000/1000".

0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

Тим часом було кілька записів. Можливо, це було відкладене записування або для промивання "брудних" сторінок, або для очищення індексів з "зміни буфера".

Ймовірно, в останніх 16 секунд активності в молодій / гарячій зоні також не було.


Ну, ми в середньому вибираємо між 6k-10k SELECTs секунди, і в той же час я бачу майже 0 активності читання диска на сервері, тому я не думаю, що це так
Safado

Чи "Кеш запитів" задовольняє більшість запитів? SHOW VARIABLES LIKE 'query%';і SHOW GLOBAL STATUS LIKE 'Qc%';і SHOW GLOBAL VARIABLES LIKE 'Com_SELECT';.
Рік Джеймс

0

Буферний пул розділений на дві частини, молодий список та не молодий список. Швидкість виготовлення показує, скільки сторінок у буферних пулах переміщуються між двома списками.

Сторінки, створені молодими, не створюються молодими сторінками (тобто читаються з кеша. Сторінки, створені не молодими, - це сторінки, переміщені зі списку молодих, тому що вони або занадто старі, або тому, що список молодих заповнений.

Швидкість переміщення сторінок між двома залежить від того, яка частина буферного пулу використовується в даний час порівняно з розміром молодого пулу. Встановити нуль означає, що ваш активний набір (сторінки, які ви використовуєте) менший, ніж молодий пул.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.