Calculez un scénario de mémoire InnoDB et serveur à partir de vos réglages effectifs. Les valeurs préremplies illustrent un serveur de 16 GiB ; elles ne sont pas des recommandations.
Unités binaires : 1 GiB = 1024 MiB. Accepte des octets ou K/M/G/T, par exemple 268435456, 256M, 8G. Tout reste dans votre navigateur.
Activez JavaScript pour utiliser le calculateur. Les explications et les requêtes restent accessibles ci-dessous.
Résultats du scénario
- Mémoire InnoDB
- Scénario de charge
- Stress à max_connections
- Marge du scénario
- Allocations globales et provisions
- Base des connexions
- Buffers des requêtes actives
- Tables temporaires et blocs locaux
- Budget du serveur de base de données
- InnoDB instrumenté, mesure actuelle
- RSS du processus, mesure actuelle
Une estimation, pas une borne maximale garantie
La charge, les réglages de session et les allocations non instrumentées peuvent dépasser ce modèle. Le stress garde les mêmes multiplicités et rend toutes les connexions actives. Vérifiez RSS, limite cgroup, swap et pics sur une charge représentative. Les fichiers redo/undo et innodb_redo_log_capacity représentent du stockage, pas une allocation RAM équivalente.
Formules et hypothèses
C = connexions ; A = requêtes actives ; T = tables temporaires par requête. Les provisions sont ajoutées une seule fois.
InnoDB = innodb_buffer_pool_size × (1 + overhead / 100) + innodb_log_buffer_size + dictionary + locks + transactions + adaptive_hash + compression + InnoDB_extra
G = InnoDB + key_buffer_size + aria_pagecache_buffer_size (MariaDB) + query_cache_size (MariaDB / MySQL 5.7) + other_global
B = thread_stack + 2 × net_buffer_length + max_digest_length + session_extra
Q = sort_buffer_size × sorts + join_buffer_size × joins + read_buffer_size × scans + read_rnd_buffer_size × random_reads + query_extra
Total = G + C × B + A × Q + Temp
Stress: C = A = max_connections
Estimer précisément la mémoire InnoDB
La mémoire InnoDB dépasse innodb_buffer_pool_size. Le calcul inclut le buffer pool, une provision ajustable pour ses structures, le buffer global innodb_log_buffer_size et les autres allocations InnoDB que vous renseignez. MySQL documente environ 10 % de mémoire supplémentaire pour les structures du pool ; la provision réelle dépend du binaire et de la charge, notamment avec MariaDB. Utilisez la valeur effective en cours, qui peut différer de la configuration demandée après arrondi du pool.
Le dictionnaire, l’index adaptive hash, les verrous, les structures de transaction et la compression peuvent ajouter de la mémoire. Mesurez-les si possible et ajoutez uniquement les allocations absentes du pool ou de sa provision. Les capacités redo, les fichiers redo et les tablespaces undo sont du stockage : n’ajoutez pas leur taille de fichier à la RAM. Le sous-total InnoDB exclut les autres moteurs, Performance Schema, les buffers de connexion/requête et le système.
Relever les paramètres actifs
Exécutez ces requêtes en lecture seule sur le serveur cible. Les variables absentes sont ignorées par SHOW ... WHERE. Threads_running inclut la requête de mesure et reste une photographie ; utilisez une concurrence représentative et les pics enregistrés. Max_used_connections est un pic de connexions, pas de requêtes actives. Vérifiez aussi les paramètres depuis les connexions applicatives : la session actuelle ne décrit pas toutes les sessions.
SELECT VERSION();
SHOW GLOBAL VARIABLES WHERE Variable_name IN (
'innodb_buffer_pool_size', 'innodb_log_buffer_size', 'innodb_page_size',
'key_buffer_size', 'aria_pagecache_buffer_size', 'query_cache_size',
'max_connections', 'thread_handling', 'thread_stack', 'net_buffer_length',
'max_digest_length', 'max_allowed_packet', 'sort_buffer_size',
'join_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size',
'tmp_table_size', 'max_heap_table_size', 'internal_tmp_mem_storage_engine',
'temptable_max_ram', 'temptable_max_mmap', 'temptable_use_mmap'
);
SHOW GLOBAL STATUS WHERE Variable_name IN (
'Threads_connected', 'Threads_running', 'Max_used_connections',
'Created_tmp_tables', 'Created_tmp_disk_tables',
'Innodb_buffer_pool_pages_total', 'Innodb_buffer_pool_pages_data',
'Innodb_buffer_pool_pages_free'
);
SHOW SESSION VARIABLES WHERE Variable_name IN (
'sort_buffer_size', 'join_buffer_size', 'read_buffer_size',
'read_rnd_buffer_size', 'tmp_table_size', 'max_heap_table_size',
'internal_tmp_mem_storage_engine', 'max_allowed_packet'
);
SHOW ENGINE INNODB STATUS;
Mesurer InnoDB et le processus
Si votre version expose cette table mémoire Performance Schema et que les instruments InnoDB sont actifs, examinez les allocations actuelles ci-dessous. La couverture varie selon la version ; activer les compteurs tardivement ne reconstitue pas toutes les allocations antérieures. Des lignes absentes ou nulles ne prouvent pas une consommation nulle. Ne sommez pas les maxima par instrument pour déduire un pic simultané. Renseignez la somme actuelle dans la mesure InnoDB facultative ; elle reste séparée du modèle.
SELECT EVENT_NAME,
ROUND(CURRENT_NUMBER_OF_BYTES_USED / 1048576, 2) AS current_mib,
ROUND(HIGH_NUMBER_OF_BYTES_USED / 1048576, 2) AS high_mib
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'memory/innodb/%'
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC;
SELECT ROUND(SUM(CURRENT_NUMBER_OF_BYTES_USED) / 1048576, 2)
AS instrumented_innodb_mib
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'memory/innodb/%';
Sous Linux, le RSS ci-dessous est en KiB ; utilisez le suffixe K ou divisez par 1024 pour obtenir des MiB. Il couvre le processus entier. Tenez compte des limites cgroup, du cache système, de la rétention de l’allocateur et des autres services.
ps -C mariadbd,mysqld -o pid=,rss=,comm=
Tables temporaires et limites pratiques
Pour MariaDB et MySQL utilisant MEMORY pour les tables temporaires internes, la plus petite valeur entre tmp_table_size et max_heap_table_size limite chaque table. Plusieurs tables et buffers de jointure peuvent coexister dans une requête. Le modèle applique vos multiplicités aux requêtes actives ; il n’alloue pas tous les buffers à chaque connexion inactive.
Pour MySQL TempTable, temptable_max_ram est partagé entre les sessions. Depuis 8.0.28, tmp_table_size limite aussi chaque table. Le profil antérieur applique seulement le plafond partagé. Les blocs locaux sont hors plafond RAM ; le modèle provisionne un bloc par connexion, car il peut rester jusqu’à la fin du thread. Ce bloc peut dépasser l’exemple de 1 MiB. Les fichiers temporaires mmap peuvent ajouter des pages résidentes : leur plafond de fichier n’équivaut pas à une allocation RAM.
Le stress rend toutes les connexions max_connections actives avec la même forme de requête. Ce n’est pas une borne maximale garantie. Provisionnez tables MEMORY utilisateur, croissance réseau, données SQL/BLOB, caches binlog, réplication, requêtes préparées, cache de threads et allocations absentes. Confrontez le modèle aux pics du processus sur une charge représentative. Ni cette estimation ni une cible de réglage n’impose un plafond mémoire.
Sources et vérification
Vérifié le 13 octobre 2026. Les explications originales s’appuient sur Releem et les manuels serveur. L’exemple Releem indique 200 connexions et des limites de 32 MiB, puis multiplie par 16 MB ; le résultat cohérent avec une table par connexion est 6400 MiB = 6,25 GiB. Les règles propres au moteur priment sur une formule générique.