Назад | Перейти на главную страницу

Виртуальная машина CentOS использует только треть доступной памяти

У меня есть часть виртуальной машины под управлением CentOS на Parallels.

Вот результат free -m

[root@server ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           960        272        687          0          0          0
-/+ buffers/cache:        272        687
Swap:            0          0          0

Это сервер LAMP, а размер самой базы данных превышает 1000 МБ.

Разве «буферы» и «кэшированные» не должны показывать более высокие значения при кэшировании файлов базы данных? Похоже, что используется только 1/3 памяти.

Отображаемые буферы и кэши даны с точки зрения ОС.

Чтобы узнать, что кэширует MySQL, вы должны выполнить следующие запросы

MYSQL_CONN="-uroot -prootpassword"
BPSIZE=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size'" | awk '{print $2}'`
BPDATA=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data'" | awk '{print $2}'`
BPPAGE=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL STATUS LIKE 'Innodb_page_size'" | awk '{print $2}'`
BPDATABYTES=`echo ${BPDATA}*${BPPAGE}|bc`
BPPCTUSED=`echo ${BPDATABYTES}00/${BPSIZE}|bc`
KBSIZE=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL VARIABLES LIKE 'key_buffer_size'" | awk '{print $2}'`
KBUSED=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL STATUS LIKE 'Key_blocks_used'" | awk '{print $2}'`
KCSIZE=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL STATUS LIKE 'key_cache_block_size'" | awk '{print $2}'`
KBDATABYTES=`echo ${KBUSED}*${KCSIZE}|bc`
KBPCTUSED=`echo ${KBDATABYTES}00/${KBSIZE}|bc`
echo "InnoDB Buffer Pool Size : ${BPSIZE}, (${BPPCTUSED}) Percent Full"
echo "MyISAM Key Buffer Size : ${KBSIZE}, (${KBPCTUSED}) Percent Full"

Если вы хотите узнать, сколько данных вы на самом деле выполнили:

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size",
CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size",
CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,(SELECT 3 pw) A
ORDER BY TSize;

Это покажет, сколько данных InnoDB и MyISAM у вас есть в экземпляре MySQL.

Пожалуйста помни

  • сумма индексов MyISAM - это максимальный размер key_buffer_size, который вы можете выделить для своего экземпляра
  • сумма данных InnoDB и индексных страниц является максимальным innodb_buffer_pool_size для вашего экземпляра

Для получения дополнительной информации о том, как изменить размер key_buffer_size и innodb_buffer_pool_size, см. мой пост в DBA StackExchange.