Недостаточно свободной памяти и множество пустых индексов с использованием пула буферов в MySQL - PullRequest
0 голосов
/ 18 января 2019

У меня в настоящее время есть экземпляр (AWS) DB.M1.LARGE (7,5 ГБ, 2 ВЦП, 40 ГБ SSD, MySQL 5.6.34), только 4 ГБ пространства используется с менее чем 100 базами данных.

По какой-то причине у меня высокий InnoDB buffer usage, близкий к 98% и низкий Freeable Memory, менее 600 МБ.

Текущее значение innodb_buffer_pool_size составляет 5,7 ГБ

После некоторых исследований в интернете я обнаружил, что в этом запросе перечислены все индексы, сгруппированные и упорядоченные по размеру.

select table_name as Table_Name, index_name as Index_Name,
count(*) as Page_Count, sum(data_size)/1024/1024 as Size_in_MB
from information_schema.innodb_buffer_page
group by table_name, index_name
order by Size_in_MB desc;

Это мой результат для запроса, и я не совсем понимаю, почему существует такое количество пространства, используемого для таблиц NULL и индекса NULL, и если это проблема, и причина, почему Freeable Memory такой низкий .

Список индексов

Это графики последних 2 недель с консоли RDS

Графики мониторинга RDS

Обновление после нового запроса innodb_buffer_page

Основываясь на предложении Билла, я запускаю этот новый запрос, и вот результаты:

select page_type, page_state, table_name, index_name, 
count(*) as Page_Count, sum(data_size)/1024/1024 as Size_in_MB 
from information_schema.innodb_buffer_page 
group by page_type, page_state, table_name, index_name 
order by Size_in_MB desc;

Начало запроса:

Первая часть результата запроса

Между этими двумя снимками все page_type равны INDEX, а все page_state равны FILE_PAGE

Вторая часть результата запроса

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Есть ли проблема? Когда MySQL работает, ему обычно выделяется весь buffer_pool.

5.7 buffer_pool
x.x various other tables and caches
y.y code (OS, MySQL, etc)
0.6 "freeable" memory
---
7.5 Total

600 МБ находится под управлением ОС, а не MySQL. Вероятно, это будут дисковые блоки, которые кэшируются в оперативной памяти Если они соответствуют тому, что находится на диске (то есть не «грязно»), то они сразу же могут быть использованы повторно.

3.7ГБ, показанные в этой таблице , могут быть свободными блоками под контролем InnoDB. Если это так, они будут использованы повторно, когда вы выполните INSERTs и т. Д.

(Предостережение: большая часть этого ответа - «угадывание», исходя из моего опыта.)

0 голосов
/ 18 января 2019

https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-page-table.html говорит:

TABLE_NAME

Имя таблицы, к которой относится страница.Этот столбец применим только к страницам со значением PAGE_TYPE, равным INDEX.

То же самое относится к столбцу INDEX_NAME.

Попробуйте этот запрос, чтобы получить дополнительную информацию:

select page_type, page_state, table_name, index_name, 
  count(*) as Page_Count, sum(data_size)/1024/1024 as Size_in_MB 
from information_schema.innodb_buffer_page 
group by page_type, page_state, table_name, index_name 
order by Size_in_MB desc;

Я вижу на вашем скриншоте, что многие страницы пула буферов типа INDEX по-прежнему показывают NULL для имен таблиц и индексов.

Я не уверен, что это значит.Я посмотрел исходный код MySQL, и кажется, что он может оставить эти значения как NULL, если не может найти индекс в словаре данных InnoDB.Но я не уверен, как это могло произойти.

https://github.com/mysql/mysql-server/blob/5.6/storage/innobase/handler/i_s.cc#L5007


Комментарий от @C GK:

Да, вы правы, япроверил и вижу разницу.Я полагаю, что разница показывает коэффициент заполнения страниц.

select page_type, page_state, table_name, index_name,
  count(*) as Page_Count,
  count(*) * @@innodb_page_size /1024/1024 AS Total_Page_Size_in_MB,
  sum(data_size)/1024/1024 as Size_in_MB
from information_schema.innodb_buffer_page  
group by page_type, page_state, table_name, index_name
order by Size_in_MB desc

+-------------------+------------+--------------+------------+------------+-----------------------+-------------+
| page_type         | page_state | table_name   | index_name | Page_Count | Total_Page_Size_in_MB | Size_in_MB  |
+-------------------+------------+--------------+------------+------------+-----------------------+-------------+
| INDEX             | FILE_PAGE  | `test`.`foo` | PRIMARY    |       1940 |           30.31250000 | 27.87315369 |
...