Sysbench et la distribution des variables aléatoires

La traduction de l'article a été préparée spécialement pour les étudiants du cours «Bases de données» .




Ce que vous ignoriez peut-ĂȘtre sur la gĂ©nĂ©ration de nombres alĂ©atoires sysbench

Sysbench est un outil de test de performances populaire. Il a été écrit à l'origine par Peter Zaitsev au début des années 2000 et est devenu la norme de facto pour les tests et l'analyse comparative. Il est actuellement pris en charge par Alexei Kopytov et est publié sur Github à l' adresse .

Cependant, j'ai remarqué que, malgré sa large distribution, il y a des moments inconnus pour beaucoup dans sysbench. Par exemple, la possibilité de modifier facilement les tests MySQL en utilisant Lua ou de configurer les paramÚtres du générateur de nombres aléatoires intégré.

De quoi parle l'article?


J'ai écrit cet article pour montrer à quel point il est facile de personnaliser sysbench selon vos besoins. Il existe de nombreuses façons d'étendre les fonctionnalités de sysbench, et l'une d'elles consiste à configurer la génération d'identificateurs aléatoires (ID).

Par dĂ©faut, sysbench propose cinq options diffĂ©rentes pour gĂ©nĂ©rer des nombres alĂ©atoires. Mais trĂšs souvent (en fait, presque jamais), aucun d'entre eux n'est explicitement indiquĂ©, et encore moins souvent vous pouvez voir les paramĂštres de gĂ©nĂ©ration (pour les options oĂč ils sont disponibles).

Si vous avez une question: «Et pourquoi devrais-je ĂȘtre intĂ©ressĂ© par cela? AprĂšs tout, les valeurs par dĂ©faut sont tout Ă  fait appropriĂ©es », alors cet article est conçu pour vous aider Ă  comprendre pourquoi ce n'est pas toujours le cas.

commençons


Quels sont les moyens de générer des nombres aléatoires dans sysbench? Les éléments suivants sont actuellement implémentés (vous pouvez facilement les voir grùce à l'option --help):

  • SpĂ©cial (distribution spĂ©ciale)
  • Gaussien (distribution gaussienne)
  • Pareto (distribution Pareto)
  • Zipfian (distribution Zipf)
  • Uniforme (distribution uniforme)

Par défaut, Special est utilisé avec les paramÚtres suivants:

  • rand-spec-iter = 12 - nombre d'itĂ©rations pour une distribution spĂ©ciale
  • rand-spec-pct = 1 - pourcentage de toute la plage dans laquelle les valeurs «spĂ©ciales» tombent avec une distribution spĂ©ciale
  • rand-spec-res = 75 - pourcentage de valeurs «spĂ©ciales» Ă  utiliser dans une distribution spĂ©ciale

Comme j'aime les tests et les scripts simples et faciles à reproduire, toutes les données suivantes seront collectées à l'aide des commandes sysbench suivantes:

  • sysbench ./src/lua/oltp_read.lua -mysql_storage_engine = innodb –db-driver = mysql –tables = 10 –table_size = 100 prepare
  • sysbench ./src/lua/oltp_read_write.lua –db-driver=mysql –tables=10 –table_size=100 –skip_trx=off –report-interval=1 –mysql-ignore-errors=all –mysql_storage_engine=innodb –auto_inc=on –histogram –stats_format=csv –db-ps-mode=disable –threads=10 –time=60 –rand-type=XXX run

N'hĂ©sitez pas Ă  vous expĂ©rimenter. La description et les donnĂ©es du script peuvent ĂȘtre trouvĂ©es ici .

Pourquoi sysbench utilise-t-il un gĂ©nĂ©rateur de nombres alĂ©atoires? L'un des objectifs est de gĂ©nĂ©rer des ID qui seront utilisĂ©s dans les requĂȘtes. Ainsi, dans notre exemple, des nombres entre 1 et 100 seront gĂ©nĂ©rĂ©s, en tenant compte de la crĂ©ation de 10 tables avec 100 lignes dans chacune.

Que faire si vous exécutez sysbench comme décrit ci-dessus et ne changez que -rand-type?

J'ai exécuté ce script et utilisé le journal général pour collecter et analyser la fréquence des valeurs d'ID générées. Voici le résultat: Uniforme

spécial Zipfian Pareto Gaussian On peut voir que ce paramÚtre est important, non? AprÚs tout, sysbench fait exactement ce que nous attendions de lui.
















Examinons de plus prĂšs chacune des distributions.

Spécial


Special est utilisĂ© par dĂ©faut, donc si vous ne spĂ©cifiez PAS de type rand, sysbench utilisera special. Special utilise un nombre trĂšs limitĂ© de valeurs ID. Dans notre exemple, nous pouvons voir que les valeurs 50-51 sont principalement utilisĂ©es, les valeurs restantes entre 44-56 sont extrĂȘmement rares, tandis que d'autres ne sont pratiquement pas utilisĂ©es. Veuillez noter que les valeurs sĂ©lectionnĂ©es se situent au milieu de la plage disponible de 1-100.

Dans ce cas, le pic est d'environ deux ID représentant 2% de l'échantillon. Si j'augmente le nombre d'enregistrements à un million, le pic restera, mais ce sera à 7493, soit 0,74% de l'échantillon. Comme cela sera plus restrictif, le nombre de pages sera probablement supérieur à un.

Uniforme (distribution uniforme)


Comme son nom l'indique, si nous utilisons Uniform, toutes les valeurs seront utilisées pour l'ID, et la distribution sera ... uniforme.

Zipfian (distribution Zipf)


La distribution Zipf, parfois appelĂ©e distribution zĂȘta, est une distribution discrĂšte couramment utilisĂ©e en linguistique, en assurance et en modĂ©lisation d'Ă©vĂ©nements rares. Dans ce cas, sysbench utilisera des nombres commençant par le plus petit (1) et rĂ©duira trĂšs rapidement la frĂ©quence d'utilisation, en passant Ă  de plus grands nombres.

Pareto (Pareto)


Pareto applique la rÚgle «80-20» . Dans ce cas, les identifiants générés seront encore moins étalés et seront plus concentrés dans un petit segment. Dans notre exemple, 52% de tous les identifiants avaient une valeur de 1 et 73% des valeurs étaient dans les 10 premiers nombres.

Gaussien (distribution gaussienne)


La distribution gaussienne (distribution normale) est bien connue et familiÚre . Il est principalement utilisé dans les statistiques et les prévisions autour d'un facteur central. Dans ce cas, les ID utilisés sont distribués le long de la courbe en forme de cloche, en commençant par la valeur moyenne, puis en diminuant lentement vers les bords.

À quoi ça sert?


Chacune des options ci-dessus a son propre usage et peut ĂȘtre regroupĂ©e par objectif. Pareto et Focus spĂ©cial sur les points chauds. Dans ce cas, l'application utilise encore et encore la mĂȘme page / donnĂ©e. C'est peut-ĂȘtre ce dont nous avons besoin, mais nous devons comprendre ce que nous faisons et ne pas faire d'erreurs ici.

Par exemple, si nous testons les performances de la compression de page InnoDB pendant la lecture, nous devons Ă©viter d'utiliser la valeur par dĂ©faut de Special ou Pareto. Si nous avons un ensemble de donnĂ©es de 1 To et un pool de mĂ©moire tampon de 30 Go et que nous demandons la mĂȘme page plusieurs fois, cette page sera dĂ©jĂ  lue sur le disque et sera disponible non compressĂ©e en mĂ©moire.

Bref, un tel test est une perte de temps et d'efforts.

La mĂȘme chose si nous devons vĂ©rifier les performances de l'enregistrement. Écrire la mĂȘme page encore et encore n'est pas la meilleure option.

Qu'en est-il des tests de performances?

Encore une fois, nous voulons tester les performances, mais dans quel cas? Il est important de comprendre que la méthode de génération de nombres aléatoires affecte considérablement les résultats du test. Et vos «défauts assez bons» peuvent conduire à des conclusions erronées.

Les graphiques suivants montrent diffĂ©rentes latences en fonction du type de rand (type de test, temps, paramĂštres supplĂ©mentaires et le nombre de threads sont les mĂȘmes partout).

De type à type, les délais sont sensiblement différents:



ici, je lisais et j'écrivais, et les données étaient extraites du schéma de performances (sys.schema_table_statistics) Comme prévu, Pareto et Special prennent beaucoup plus de temps que d'autres, ce qui fait que le systÚme (MySQL-InnoDB) souffre artificiellement de la concurrence dans un «point chaud».

La modification du type rand affecte non seulement le délai, mais également le nombre de lignes traitées, comme indiqué par le schéma de performances.





Compte tenu de tout ce qui précÚde, il est important de comprendre ce que nous essayons d'évaluer et de tester.

Si mon objectif est de tester les performances du systĂšme Ă  tous les niveaux, je prĂ©fĂ©rerais peut-ĂȘtre utiliser Uniform, qui chargera Ă©galement l'ensemble de donnĂ©es / le serveur de base de donnĂ©es / le systĂšme et sera plus susceptible de rĂ©partir uniformĂ©ment la lecture / la charge / l'Ă©criture.

Si mon travail consiste Ă  travailler avec des points chauds, alors Pareto et Special sont probablement le bon choix.

Mais n'utilisez pas aveuglĂ©ment les valeurs par dĂ©faut. Ils peuvent vous convenir, mais ils sont souvent destinĂ©s aux cas extrĂȘmes. D'aprĂšs mon expĂ©rience, vous pouvez souvent ajuster les paramĂštres pour obtenir le rĂ©sultat dont vous avez besoin.

Par exemple, vous souhaitez utiliser les valeurs du milieu en élargissant l'intervalle de sorte qu'il n'y ait pas de pic pointu (spécial par défaut) ou de cloche (gaussien).

Vous pouvez configurer Special pour obtenir quelque chose comme ceci:



dans ce cas, les ID sont toujours Ă  proximitĂ© et il y a de la concurrence. Mais l'influence d'un «point chaud» est moindre, donc les conflits possibles seront dĂ©sormais avec plusieurs identifiants, qui, selon le nombre d'enregistrements sur une page, peuvent ĂȘtre sur plusieurs pages.

Un autre exemple est le partitionnement. Par exemple, comment vérifier le fonctionnement de votre systÚme avec les partitions, en vous concentrant sur les derniÚres données, en archivant les anciennes?

Facile! Rappelez-vous le tableau de distribution de Pareto? Vous pouvez le changer selon vos besoins.



En spécifiant la valeur -rand-pareto, vous pouvez obtenir exactement ce que vous vouliez en forçant sysbench à se concentrer sur les grandes valeurs d'ID.

Zipfian peut Ă©galement ĂȘtre configurĂ© et, bien que vous ne puissiez pas obtenir une inversion, comme c'est le cas avec Pareto, vous pouvez facilement passer d'un pic sur une valeur Ă  une distribution plus uniforme. Un bon exemple est le suivant:



La derniĂšre chose Ă  garder Ă  l’esprit, et il me semble que ce sont des choses Ă©videntes, mais il vaut mieux dire que ne pas dire que lors de la modification des paramĂštres de gĂ©nĂ©ration de nombres alĂ©atoires, les performances changeront.

Comparer la latence:



ici, le vert montre les valeurs modifiées par rapport au bleu d'origine.



résultats


À ce stade, vous devez dĂ©jĂ  comprendre Ă  quel point il est facile de configurer la gĂ©nĂ©ration de nombres alĂ©atoires dans sysbench et Ă  quel point cela peut vous ĂȘtre utile. Gardez Ă  l'esprit que ce qui prĂ©cĂšde s'applique Ă  tous les appels, par exemple lorsque vous utilisez sysbench.rand.default:

local function get_id()
   return sysbench.rand.default(1, sysbench.opt.table_size)
End

Compte tenu de cela, ne copiez pas inconsciemment le code des articles d'autres personnes, mais réfléchissez et explorez ce dont vous avez besoin et comment y parvenir.

Avant d'exécuter les tests, vérifiez les options de génération de nombres aléatoires pour vous assurer qu'elles sont appropriées et adaptées à vos besoins. Pour simplifier ma vie, j'utilise ce test simple . Ce test affiche des informations de distribution d'ID assez claires.

Mon conseil est que vous devez comprendre vos besoins et effectuer correctement des tests / benchmarking.

Références


Tout d'abord, c'est sysbench lui-mĂȘme .

Articles sur Zipfian:


Pareto:


L'article de Percona sur la façon d'écrire vos scripts dans sysbench

Tous les matériaux utilisés pour cet article sont sur GitHub .



→ En savoir plus sur le cours



All Articles