sql >> Databáze >  >> RDS >> Mysql

Jak srovnávat výkon MySQL pomocí SysBench

V tomto článku budeme diskutovat o sysbench, skutečném standardu pro benchmarking MySQL. Podíváme se na základy použití sysbench a na to, jak můžeme použít sysbench k učení o MySQL, a druhý je pro nás nejdůležitější aspekt. Prakticky použijeme sysbench jako nástroj pro generování provozu, o kterém toho víme hodně, protože sysbench každou sekundu zadrží nějaké informace o generovaném provozu.

Test MySQL SysBench 

Sysbench je vícevláknový benchmarkový nástroj založený na luaJIT, je to skutečný standard pro benchmarky MySQL, musí být schopen se připojit k databázi.

Instalace Sysbench

Nejprve musíme nainstalovat sysbench, instaluji sysbench na jiný server, abychom mohli otestovat skutečný dopad zátěže na náš server MySQL.

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bashyum -y install sysbench

To znamená, že je velmi snadné nainstalovat sysbench, je lepší povolit sysbench interakci se serverem MySQL na úrovni brány firewall, protože se jedná o testovací prostředí, na obou hostitelích jsem zakázal firewall, aby se předešlo jakýmkoli potížím.

Prostředí připravené pro SysBench:

Pro tento test vytvářím databázi sbtest a uživatele sbtest_user a udělím všechna PRIVILEGIA uživateli sbtest_user v databázi sbtest.

pomocí root;

mysql> vytvořit databázi sbtestmysql> vytvořit uživatele sbtest_user identifikovaného 'heslem';mysql> udělit vše na sbtest.* pro `sbtest_user`@`%`;mysql> zobrazit granty pro sbtest_user;+-------- -------------------------------------------------- +| Granty pro [email protected] %                                 |+------------------------------------------ ------------------+| GRANT VYUŽITÍ NA *.* TOMU `sbtest_user`@`%`                 || UDĚLEJTE VŠECHNA PRIVILEGIÍ PRO `sbtest`.* `sbtest_user`@`%` |+-------------------------------- --------------------------+

Výkon MySQL pomocí SysBench

Konfigurace srovnávacího testu:

Krok přípravy sysbench vytvoří tabulky s daty, které budou použity v benchmarku. V tomto příkladu spouštíme příkaz Prepare. Na začátku je u MySQL několik parametrů, to budou parametry připojení. Ostatní parametry jsou parametry testu oltp_read_write.lua a udáváme samotný test, kterým je oltp_read_write.lua a že spouštíme příkaz Prepare. Možnosti začínající na MySQL určují připojení MySQL, název hostitele a port, ke kterému se chcete připojit, uživatelské jméno a heslo pro připojení a výchozí schéma připojení. Tabulky a parametry table_size jsou vlastnosti testu oltp_read_write.lua.

To znamená, že přípravný krok vytvoří 16 tabulek s 10 000 pravidly v každé z nich. Dalším krokem je spuštění benchmarku.

Ke spuštění jsou obvykle předány všechny parametry, které budou předány připraveným a některé další, které jsme nyní kontrolovali, jsou specifické pro skutečný běh benchmarku. ČAS parametr určuje časový limit pro spuštění benchmarku, nula znamená neomezenou dobu, benchmark poběží, dokud nestiskneme control+c. Takto budeme používat sysbench v laboratoři a takto jej lidé obvykle používají při učení a ne v nastavení benchmarkingu.

Chceme jen rozpoutat provoz na něčem, co budeme zkoumat, a můžeme to zastavit pomocí control+c, jakmile s vyšetřením skončíme.

„interval zprávy“ parametry určují, jak často byly sysbench vytištěny statistiky. Typicky je toto nastaveno na 1 jako v našem příkladu, kdy sysbench vytiskne řádek každou sekundu. I v nastaveních benchmarkingu je tento parametr široce používán, protože představte si, že máme hodinový benchmark a na konci máme pouze agregované statistiky, nevypovídá to nic o distribuci dat, jako je výkon na serveru v čase. . „vlákno“ volba určuje počet klientských vláken nebo připojení MySQL k použití v sysbench. Počet vláken klienta bude mít také vliv na počet vláken serveru, která lze použít. „sazba“ parametr určuje rychlost příchodu transakcí sysbench jako způsob skutečného splnění zátěže způsobené benchmarkem. Pokud transakce mohou pokračovat, jsou zařazeny do fronty, to je opět něco, co se obvykle používá v tomto typu nastavení, které nyní použijeme v nastavení typu učení.

Z hostitele sysbench:

Připravte soubor dat:

Na srovnávacím virtuálním stroji spustíme příkaz sysbench Prepare k vytvoření databáze pro naše benchmarky.

Zde vidíme, že jako uživatelské jméno používáme sbtest_user it, heslo je password a jako databázový server se připojujeme k 192.168.66.5 DB.

sysbench \--db-driver=mysql \--mysql-user=sbtest_user \--mysql_password=heslo \--mysql-db=sbtest \--mysql-host=192.168.66.5 \--mysql-port =3306 \--tables=16 \--table-size=10000 \/usr/share/sysbench/oltp_read_write.lua Preparesysbench 1.0.20 (pomocí přibaleného LuaJIT 2.1.0-beta2)Vytváření tabulky 'sbtest1'...Vkládání 10000 záznamů do 'sbtest1'Vytvoření sekundárního indexu na 'sbtest1'......Vytvoření tabulky 'sbtest16'...Vložení 10000 záznamů do 'sbtest16'Vytvoření sekundárního indexu na 'sbtest16'..

Zde máte databázi sbtest, změňme výchozí schéma na databázi sbtest, zkontrolujte, jaké máme tabulky.

Zadali jsme, že benchmark by měl vytvořit šestnáct tabulek a vytvořil 16 tabulek, můžeme to vidět zde

mysql> zobrazit tabulky;+------------------+| Tables_in_sbtest +------------------+| sbtest1           || sbtest2          |...| sbtest16         |+------------------+16 řádků v sadě (0,01 s)

Podívejme se na několik záznamů z tabulky.

mysql> vyberte * z limitu sbtest1 6;

spustíme benchmark. Tento benchmark bude mít jeden řádek výstupu pro každou sekundu, protože interval rapport nastavíme na jeden a má čtyři klientská vlákna, protože vlákna nastavíme na čtyři.

--events=N                       limit pro celkový počet událostí [0]--time=N                         limit pro celkovou dobu provedení v sekundách [10]

Tato dvě výše uvedená nastavení (události a čas) určují, jak dlouho má SysBench běžet. Může buď provést určitý počet dotazů, nebo může běžet po předem definovanou dobu.

Na hostiteli sysbench:

sysbench \--db-driver=mysql \--mysql-user=sbtest_user \--mysql_password=heslo \--mysql-db=sbtest \--mysql-host=192.168.66.5 \--mysql-port =3306 \--tables=16 \--table-size=10000 \--threads=4 \--time=0 \--events=0 \--report-interval=1 \ /usr/share/sysbench/ oltp_read_write.lua runVAROVÁNÍ:Limity událostí i časů jsou deaktivovány, běží nekonečný testsysbench 1.0.20 (pomocí přibaleného LuaJIT 2.1.0-beta2) Spuštění testu s následujícími možnostmi:Počet vláken:4 Hlásit mezivýsledky každou 1 sekundu )Inicializace generátoru náhodných čísel z aktuálního času Inicializace pracovních vláken...Vlákna zahájena![ 1s ] thds:4 tps:62,79 qps:1320,63 (r/w/o:933,91/257,15/129,57) lat (ms, 0,903 %):err/s:0,00 reconn/s:0,00[ 2s ] thds:4 tps:77,01 qps:1530,26 (r/w/o:1065,18/312,05/153,03) lat (ms, 0,9080 %) šíř. /s:0,00[ 3s] thds:4 tps:74,03 qps:1463,67 (r/w/o:1025,47/289,13/149,07) šířka (ms, 95 %):70,55 err.0 [s/s:00n ] thds:4 tps:69,99 qps:1414. 84 (r/w/o:991,89/282,97/139,98) šířka (ms, 95 %):65,65 chyba/s:0,00 přepočet/s:0,00[5s] thds:4 tps:74,02 (r/s:74,02 qw/s:o:1048,24/292,07/148,03) šířka (ms, 95 %):74,46 chyb/s:0,00 průzkum/s:0,00[ 6s] thds:4 tps:72,99 qps:3r21/049 (9.8/02/09 145,99) šířka (ms, 95 %):70,55 chyba/s:0,00 přepočet/s:0,00[ 7s] thds:4 tps:63,00 qps:1271,04 (r/w/o:850,01 m/s, 855,01 m/2003 95 %):87,56 chyba/s:0,00 přehled/s:0,00[ 8 s] thds:4 tps:72,99 qps:1439,82 (r/w/o:1008,87/284,96/145,96/145,98 ms r %) /s:0,00 reconn/s:0,00[ 9s ] thds:4 tps:74,00 qps:1488,01 (r/w/o:1038,01/302,00/148,00) šířka (ms,901 %):recon./3 s:0,00

takže vidíme, že na mém počítači provádí zhruba 70 80 transakcí za sekundu, což znamená zhruba více než tisíc dotazů za sekundu. Toto běží ve VirtualBoxu na notebooku.

Z těchto dotazů můžeme vidět, kolik z nich je čtení, kolik z nich je zápisů, kolik z nich je jiných, jaká je 95. percentilová latence pro transakci (r/w/o:1038.01/302.00/148.00), jak mnoho chyb za sekundu (err/s:0,00) máme a kolik spojení za sekundu (reconn/s:0,00) máme. Protože zadáme čas rovný nule, bude to běžet, dokud nestiskneme ctrl+c.

Podívejme se na seznam procesů show na hostiteli databáze.

mysql> zobrazit procesní seznam;+----+-----------------+------------------ --+--------+---------+-------+--------------------- --------+--------------------------------------+| Id | Uživatel             | Host               | db     | Příkaz | Čas  | Stát                       | Informace                                 |+----+------------------+-------------------+--- -----+---------+-------+-------------------------- --+---------------------------------------+| 5 | plánovač_událostí | localhost          | NULL   | Démon  | 23200 | Čekání na prázdnou frontu     | NULL                                 || 11 | kořen             | localhost          | NULL   | Spánek   | 18438 | | NULL                                 || 19 | kořen             | localhost          | sbtest | Dotaz   | 0 | začíná                    | zobrazit seznam procesů                     || 23 | kořen             | localhost          | NULL   | Spánek   | 4098 | | NULL                                 || 30 | sbtest_user     | 192.168.66.6:37298 | sbtest | Spánek   | 0 | | NULL                                 || 31 | sbtest_user     | 192.168.66.6:37300 | sbtest | Provést | 0 | čekání na potvrzení handleru | ZAMÍTNUTÍ                               || 32 | sbtest_user     | 192.168.66.6:37302 | sbtest | Spánek   | 0 | | NULL                                 || 33 | sbtest_user     | 192.168.66.6:37304 | sbtest | Provést | 0 | Otevírací stoly             | VYBERTE c Z sbtest13 WHERE id=4978 |+----+-----------------+----------------- ---+--------+---------+-------+-------------------- ---------+--------------------------------------+ 

8 řádků v sadě (0,00 s)

Databázový server byl prakticky vždy vytížený. Viděl jsem, že čas spuštění se prakticky nikdy nemění od nuly a bylo velmi snadné zachytit databázový server v akci, jako když běží „SELECT c FROM sbtest13 WHERE id=4978“. A rozhodně máme čtyři připojení z benchmarkovacího stroje

Ve výchozím nastavení se SysBench pokusí provádět dotazy co nejrychleji. Tuto možnost lze použít pro simulaci pomalejšího provozu. Zde můžete definovat, kolik transakcí se má provést za sekundu.

--rate=N                        průměrná míra transakcí. 0 za neomezenou sazbu [0]

Na hostiteli sysbench

[[email protected] ~]# sysbench \--db-driver=mysql \--mysql-user=sbtest_user \--mysql_password=heslo \--mysql-db=sbtest \--mysql-host=192.168.66.5 \--mysql-port=3306 \--tables=16 \--table-size=10000 \--threads=4 \--time=0 \--events=0 \--report-interval=1 \--rate=40 \/usr/share/sysbench/oltp_read_write.lua runUPOZORNĚNÍ:Událost i časové limity jsou zakázány, běží nekonečný testsysbench 1.0.20 (pomocí přibaleného LuaJIT 2.1.0-beta2) Spuštění testu s následujícím možnosti:Počet vláken:4Cílová rychlost transakce:40/s Hlásit mezivýsledky každou 1 sekundu Inicializace generátoru náhodných čísel z aktuálního času Inicializace pracovních vláken...Vlákna spuštěna![ 1s ] thds:4 tps:42,87 qps:858,43 (r /w/o:600,20/171,49/86,74) lat (ms, 95 %):73,13 err/s:0,00 reconn/s:0,00[ 1s ] délka fronty:0, souběžnost:1[ 2s ] 4 thtds:qps:857,25 (r/w/o:609,17/164,05/84,02) lat (ms, 95 %):101,13 err/s:0,00 reconn/s:0,00[ 2s ] délka fronty:0, 3 [souběžnost] :4 tps:57,01 qps:1119,29 (r/w/o:778,20/228,06/113,03) lat (ms, 95 %):73,13 err/s:0,00 reconn/s:0,00 [ 3s ] 0, 2 fronta délka:[ 15s ] thds:4 tps:0,00 qps:0,00 (r/w/o:0,00/0,00/0,00) šířka (ms, 95 %):0,00 chyba/s:0,00 opakování/s:0,00] [ 15 délka fronty 145, souběžnost:4[ 16s] thds:4 tps:0,00 qps:0,00 (r/w/o:0,00/0,00/0,00) šířka (ms, 95 %):0,00 chyba/s:0:00 reconn/0 16s ] délka fronty:179, souběžnost:4

Nový parametr je zde tedy –rate rovná se 40, což znamená, že budeme mít dva řádky za sekundu dva řádky výstupu a ne jeden. Protože jsme nastavili rychlost příchodu srovnávacích událostí na 40 za sekundu, uvidíme aktuální TPS.

To sice není zaručeno 40/sekundu, ale příchod zaručuje, že v průměru uděláme zhruba 40 transakcí za sekundu a na druhém řádku můžeme sledovat délku fronty a souběh. Pokud uděláme krátký seznam procesů, je mnohem snazší zachytit databázi ve stavu, kdy zde některá spojení teprve čekají.

Když je relace zaneprázdněná, můžete vidět, že transakce za sekundu je nula (tps:0,00).

mysql> zobrazit procesní seznam;+----+-----------------+------------------ --+--------+---------+-------+--------------------- ----+--------------------------------------------- -------------------------------------------------- -------+| Id | Uživatel             | Host               | db     | Příkaz | Čas  | Stát                  | Info                                                                                                                                                                                                           - ---------------------------------- -----+---------+-------+------------------------+- -------------------------------------------------- -------------------------------------------------- -+| 5 | plánovač_událostí | localhost          | NULL   | Démon  | 19162 | Čekání na prázdnou frontu | NULL                                                                                                 | 8 | kořen             | localhost          | NULL   | Dotaz   | 0 | začíná               | zobrazit seznam procesů                                                                                         | || 21 | sbtest_user     | 192.168.66.6:49060 | sbtest | Provést | 33 | aktualizace               | AKTUALIZOVAT SET sbtest8 k=k+1 WHERE id=5005                                                                 || 22 | sbtest_user     | 192.168.66.6:49062 | sbtest | Provést | 22 | aktualizace               | AKTUALIZACE sbtest14 SET c='54592761471-89397085016-24424731626-29460127219-18466786462-73074657089-48925 | 23 | sbtest_user     | 192.168.66.6:49064 | sbtest | Provést | 21 | aktualizace               | AKTUALIZACE sbtest10 SET c='68520795048-46094139936-88850487689-12482054639-29231339380-71050139550-93403 || 24 | sbtest_user     | 192.168.66.6:49066 | sbtest | Provést | 31 | aktualizace               | DELETE FROM sbtest14 WHERE id=4994                                                                      - - -   ------------------------------------------ --+--------+---------+-------+--------------------- ----+--------------------------------------------- -------------------------------------------------- -------+10 řádků v sadě (0,00 s)

Vidíme, že to na pár sekund spí, to bylo v předchozím scénáři téměř nemožné získat něco takového.

Zapisovaný provoz s koncovým hlášením:

Proveďme zátěž pro zápis (ale ne pouze pro zápis) a například výkon testovacího I/O subsystému, jak jsem zmínil time=300 poté benchmark poběží 300 sekund a poskytne nám závěrečnou zprávu, abychom jej mohli analyzovat.

[[email protected] ~]#   sysbench \--db-driver=mysql \--mysql-user=sbtest_user \--mysql_password=heslo \--mysql-db=sbtest \--mysql-host=192.168.66.5 \--mysql-port=3306 \--tables=16 \--table-size=10000 \--threads=8 \--time=300 \--events=0 \--report-interval=1 \--rate=40 \/usr/share/sysbench/oltp_read_write.lua runsysbench 1.0.20 (pomocí přibaleného LuaJIT 2.1.0-beta2) Spuštění testu s následujícími možnostmi:Počet vláken:8Cílová rychlost transakce:40/sec Report mezivýsledky každou 1 sekundu Inicializace generátoru náhodných čísel od aktuálního času Inicializace pracovních vláken...Vlákna spuštěna![ 1s ] thds:8 tps:39,87 qps:810,27 (r/w/o:570,08/159,46/80,73) lat ( ms,95%):82,96 err/s:0,00 reconn/s:0,00[ 1s ] délka fronty:0, souběžnost:1[ 2s] thds:8 tps:43,02 qps:847,39 (r/o,70,29 (r/w/w/w /85,04) šíř. (ms, 95 %):125,52 chyb/s:0,00 znovuobjevení/s:0,00[ 2s] délka fronty:0, souběžnost:0...[ 350s] thds:8 tps:0,00,0 qps:/w/o:0,00/0,00/0,00) lat (ms, 95 %):0,00 err/s :0,00 Reconn/S:0,00 [350S] Délka fronty:6545, Souběžnost:1SQL Statistika:Dotazy Provedené:Číst:78624 PÍSEM:22385 Další:11205 Celkem:112214 Transakce:5589 (15,94 za sekundu) Sec.) Ignorované chyby:27 (0,08 za sekundu) Opětovné připojení:0 (0,00 za sekundu) Obecná statistika:Celkový čas:350,6412 Celkový počet událostí:5589Latence (MS):Min:12,45 AVG:74639,59 Max:213244444,02 95. percentil:                   100 000,00         součet:                             417160677,24 Spravedlnost vláken:5 v/09 6.     událostí (prům. d. d)    doba provedení (prům./stddev):   52145.0847/15557.93

ANALÝZA PŘEHLEDŮ:

To je docela užitečné pro kontrolu, že závěrečná zpráva vám poskytne pouze průměry. Průběžné výsledky umožní sledovat výkon sekundu po sekundě. Závěrečná zpráva může vypadat jako výše, Najdete zde informace o provedených dotazech, transakcích, kolik se stalo chyb, došlo ke ztrátě spojení, jaká byla propustnost a celkový uplynulý čas. Můžete také zkontrolovat metriky latence a rozložení dotazů mezi vlákny.


  1. Jak se připojit k databázi MySQL

  2. Jak uložit podpis v MySQL

  3. Nahrazení funkcí mysql_* PDO a připravenými příkazy

  4. Připojení Orbeon Forms Postgres DB