¿Qué configurar innodb_buffer_pool y por qué ...?


20

Tengo 170 GB de InnoDBíndice y datos.

Tengo que reajustar el tamaño innodb_buffer_pool para un mejor rendimiento. El tamaño máximo de la tabla de una tabla InnoDB (índice + datos) es de 28 GB.

Entonces, ¿cuál debería ser el tamaño óptimo de innodb_buffer_pool?

ACTUALIZAR

vamos a migrar nuestra base de datos local a ec2, por lo que configuraremos la RAM de acuerdo con las estadísticas actuales de innodb, por eso necesito el tamaño de la agrupación de almacenamiento intermedio para que podamos tener RAM disponible allí.

Archivo por tabla está habilitado.

Estoy usando una máquina Linux.


¿Cuál es la RAM disponible en la máquina que no está siendo utilizada por otros procesos? ¿Estás usando Windows, Linux o alguna otra cosa? ¿Qué versión de MySQL estás usando? ¿Por qué el tamaño de la mesa está limitado a 28 GB?
Craig Efrein

El tamaño de la mesa no está limitado ... He dado el tamaño de la mesa hasta un punto de tiempo. Aumentará ya que habrá inserciones en el futuro ...
Abdul Manaf

Respuestas:


25

La tabla más grande que tiene representa el 16.47% (28/170) del total de datos. Incluso si la tabla fue altamente escrita y altamente leída, no todos los 28G de la tabla se cargan en el grupo de búferes en un momento dado. Lo que necesita calcular es la cantidad de InnoDB Buffer Pool que se carga en un momento dado en el servidor DB actual .

Aquí hay una forma más granular de determinar innodb_buffer_pool_size para un nuevo Servidor DB dado el conjunto de datos actualmente cargado en el InnoDB Buffer Pool del Servidor DB actual.

Ejecute lo siguiente en su instancia actual de MySQL (servidor desde el que está migrando)

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

Ejecuta la fórmula IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages.

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

Si IBPPctFull es 95% o más, debe establecer innodb_buffer_pool_size en 75% de la RAM del servidor de base de datos.

Si IBPPctFull es menor que 95%, ejecutar esta fórmula: IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05.

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

El número para IBPSize (en GB) es el número que más se ajusta a su conjunto de datos de trabajo real.

Ahora, si IBPSize sigue siendo demasiado grande para la configuración de RAM más grande de Amazon EC2, use el 75% de la RAM para el servidor de base de datos Amazon EC2.


Esa es una gran información ... Una cosa más que necesito saber es cómo el servidor MySQL carga los datos e índices en el grupo de búferes. He revisado la documentación y he comprobado que usa LRU, pero cómo los carga en la memoria, como si tuviera 2GB para grupo de búferes, pero el tamaño de la tabla que se solicita en la consulta es mucho más que eso ... ??
Abdul Manaf

Solo las páginas de datos e índices necesarias para satisfacer la consulta se cargan en el grupo de búferes, no en la tabla completa. Páginas de datos e índice de edad, se colocan fuera basado en el algoritmo LRU enumerados en dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
RolandoMySQLDBA

Abdul, deberías ir con la respuesta de Rolando, que contesta tu pregunta mejor que la mía. Voy a reescribir mi propia respuesta solo porque necesito ser más claro.
Craig Efrein

13

Proporciono esta respuesta como información complementaria a la respuesta de Rolando a continuación.

Antes de que el servidor esté en producción

Calcule innodb_buffer_pool_size en función de las tablas más grandes que MySQL usa con mayor frecuencia. Para identificar las tablas más grandes en función de su tamaño en la base de datos, puede usar este script:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

Ahora que sabemos qué tablas son las más grandes en nuestra base de datos, necesitamos determinar cuáles son las más utilizadas. Para hacer eso, usaría un programa de creación de perfiles como Jet Profiler (JP) para ver a qué tablas se accede más. JP le mostrará a qué tablas se accede con más frecuencia. Aquí hay una captura de pantalla de esa sección en JP

ingrese la descripción de la imagen aquí

Con esto en mente, ahora sé que las tablas de usuarios y ofertas ocupan alrededor de 640 MB de espacio en disco, se usan con mucha frecuencia según JP y lo que significa que MySQL almacenará sus índices y datos en el grupo de búferes como Rolando Menciona a continuación en sus comentarios.

Para asegurarme de que MySQL tuviera suficiente memoria para almacenar datos para mis tablas más grandes y de uso más frecuente, definiría innodb_buffer_pool_size a 640 MB.

Hay algunas consideraciones adicionales, pero no se aplican a innodb_buffer_pool_size.

¿Es este un sistema de 32 bits o 64 bits? En un sistema de 32 bits, está limitado a 4 GB a menos que active PAE. En Windows, esto significa ejecutar las ediciones de Windows Enterprise o Datacenter.

¿Cuánta memoria necesitan los otros procesos que se ejecutan en su sistema? En un servidor MySQL dedicado, dejaré entre 5% y 10% para el sistema operativo. En Windows puede usar Process Explorer para analizar el uso de memoria. En Linux, tiene sysstat, free, htop, top y vmstat.

¿La base de datos está compuesta solo por tablas Innodb o una mezcla de Innodb y MyISAM? Si es una mezcla de los dos, entonces reservaré memoria para key_cache, uniré variables, consultaré caché, etc. Más tarde podrá calcular su índice de aciertos MyISAM una vez que el servidor esté en producción.

Después de que el servidor esté en producción

¿Cuál es el índice de aciertos actual para Innodb?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests).

¿Cuál es la proporción de aciertos de caché clave?

1 - (Key_reads / Key_read_requests)

Por lo general, trato de obtener la proporción lo más cercana posible al 100%.

¿Qué tan bien encajan sus tablas en el grupo de búferes?

También puede ver qué tan bien se ajustan los datos de su tabla en su buffer_pool consultando este enlace, que proporciona una forma de mostrar "cuántas páginas hay en la agrupación de almacenamientos intermedios para una tabla dada (cnt), cuántas de ellas están sucias (sucias) , y cuál es el porcentaje de ajustes de índice en la memoria (fit_pct) ". Solo se aplica al servidor Percona

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.