Mon application est très gourmande en bases de données, j'ai donc fait de mon mieux pour m'assurer que l'application et la base de données MySQL fonctionnent ensemble aussi efficacement que possible.
Actuellement, je règle le cache de requêtes MySQL pour le mettre en conformité avec les caractéristiques des requêtes exécutées sur le serveur.
query_cache_size
est la quantité maximale de données pouvant être stockée dans le cache et query_cache_limit
est la taille maximale d'un seul jeu de résultats dans le cache.
Mon cache de requêtes MySQL actuel est configuré comme suit:
query_cache_size=128M
query_cache_limit=1M
tuning-primer.sh
me donne les conseils de réglage suivants sur le système en cours d'exécution:
QUERY CACHE
Query cache is enabled
Current query_cache_size = 128 M
Current query_cache_used = 127 M
Current query_cache_limit = 1 M
Current Query cache Memory fill ratio = 99.95 %
Current query_cache_min_res_unit = 4 K
However, 21278 queries have been removed from the query cache due to lack of memory
Perhaps you should raise query_cache_size
MySQL won't cache query results that are larger than query_cache_limit in size
Et mysqltuner.pl
donne les conseils de réglage suivants:
[OK] Query cache efficiency: 31.3% (39K cached / 125K selects)
[!!] Query cache prunes per day: 2300654
Variables to adjust:
query_cache_size (> 128M)
Les deux scripts de réglage suggèrent que je devrais augmenter le query_cache_size
. Cependant, l'augmentation du query_cache size
plus de 128M peut réduire les performances selon mysqltuner.pl
(voir http://mysqltuner.pl/ ).
Comment aborderiez-vous ce problème? Souhaitez-vous augmenter le query_cache_size malgré mysqltuner.pl
est l'avertissement ou essayez d'ajuster la logique de requête d'une manière ou d'une autre? La plupart de l'accès aux données est géré par Hibernate, mais une grande partie du code SQL codé à la main est également utilisée dans l'application.
Habituellement, des avertissements "trop grande taille de cache" sont émis en supposant que vous avez peu de mémoire physique et que le cache lui-même doit être échangé ou prendra les ressources requises par le OS
(comme le cache de fichiers).
Si vous avez suffisamment de mémoire, il est prudent d'augmenter query_cache size
(J'ai vu des installations avec 1GB
cache de requête).
Mais êtes-vous sûr d'utiliser correctement le cache de requêtes? Avez-vous beaucoup de répétition textuelle requêtes? Pourriez-vous s'il vous plaît poster l'exemple d'une requête typique?
L'avertissement émis par mysqltuner.py est en fait pertinent même si votre cache n'a aucun risque d'être échangé. Il est bien expliqué dans ce qui suit: http://blogs.Oracle.com/dlutz/entry/mysql_query_cache_sizing
Fondamentalement, MySQL passe plus de temps à nettoyer le cache plus le cache est grand et comme le cache est très volatil sous des charges d'écriture même modérées (les requêtes sont souvent effacées), le mettre trop grand aura un effet négatif sur les performances de votre application. Ajustez le query_cache_size
et query_cache_limit
pour votre application, essayez de trouver un point de rupture où vous avez le plus de hits par insert, un faible nombre de lowmem_prunes
et surveillez de près la charge de vos serveurs de base de données.
Vous devriez être facile à augmenter votre cache, ce n'est pas seulement une chose "pas très disponible"!
En lisant par exemple le manuel vous obtenez cette citation:
Soyez prudent lorsque vous dimensionnez le cache de requêtes de manière excessive, ce qui augmente la surcharge requise pour maintenir le cache, peut-être au-delà de l'avantage de l'activer. Les tailles en dizaines de mégaoctets sont généralement bénéfiques. Les tailles dans les centaines de mégaoctets pourraient ne pas l'être.
Il y a divers autres sources vous pouvez vérifier!
Un taux de prune non nul peut indiquer que vous devez augmenter la taille de votre cache de requêtes. Cependant, gardez à l'esprit que la surcharge de maintenance du cache est susceptible d'augmenter avec sa taille, faites-le donc par petits incréments et surveillez le résultat. Si vous devez augmenter considérablement la taille du cache pour éliminer les pruneaux, il y a de fortes chances que votre charge de travail ne corresponde pas au cache de requêtes.
Donc, ne mettez pas autant que vous le pouvez dans ce cache de requêtes!
La meilleure chose serait d'augmenter progressivement le cache des requêtes et de mesurer les performances de votre site. C'est une sorte de défaut dans les questions de performances, mais dans des cas comme celui-ci, les "tests" sont l'une des meilleures choses que vous puissiez faire.
Soyez prudent lorsque vous définissez query_cache_size et limitez-le à élevé. MySQL n'utilise qu'un seul thread pour lire à partir du cache de requêtes.
Avec query_cache_size réglé sur 4G et query_cache_limit 12M, nous avions un taux de cache de requêtes de 85% mais nous avons remarqué des pics récurrents dans les connexions.
Après avoir changé le query_cache_size à 256M avec 64K query_cache_limit le ratio de cache de requête a chuté à 50% mais les performances globales ont augmenté.
La surcharge pour le cache de requête est d'environ 10%, donc je désactiverais la mise en cache de requête. Habituellement, si vous ne pouvez pas obtenir un taux de réussite supérieur à 40 ou 50%, le cache de requêtes n'est peut-être pas adapté à votre base de données.
J'ai un blog sur ce sujet ... Performances de mysql query_cache_size ici .
Le cache de requête est invalidé/vidé chaque fois qu'il y a une insertion, utilisez InnoDB/cache et évitez le cache de requête ou définissez-le sur une très petite valeur.