Profilování dotazů v MySQL. Co jsou „protokoly serveru“, jak zobrazit protokoly serveru Jak zakázat protokol pomalých požadavků

Protokoly událostí jsou prvním a nejjednodušším nástrojem pro určování stavu systému a identifikaci chyb. V MySQL jsou čtyři hlavní protokoly:

  • Protokol chyb— standardní protokol chyb, který se shromažďuje za běhu serveru (včetně spuštění a zastavení);
  • Binární protokol— protokol všech příkazů pro úpravu databáze potřebných pro replikaci a zálohování;
  • Obecný protokol dotazů— hlavní protokol dotazů;
  • Protokol pomalého dotazu— protokol pomalých požadavků.

Protokol chyb

Tento protokol obsahuje všechny chyby, které se vyskytly při běhu serveru, včetně kritických chyb a také vypnutí serveru, spouštění serveru a varování. Zde byste měli začít v případě selhání systému. Ve výchozím nastavení jsou všechny chyby odesílány do konzole (stderr), chyby můžete také protokolovat do syslog (výchozí nastavení v Debianu) nebo do samostatného souboru protokolu:

Log_error=/var/log/mysql/mysql_error.log

# Chyby budou zapsány do mysql_error.log

Pro rychlou identifikaci chyb doporučujeme ponechat tento protokol povolený. A abychom pochopili, co ta či ona chyba znamená, má MySQL utilitu chyb:

Shell> perror 13 64 Kód chyby OS 13: Oprávnění odepřeno Kód chyby OS 64: Počítač není v síti

# Vysvětluje význam chybových kódů

Binární (neboli binární) log

Všechny příkazy pro úpravu databáze jsou zaznamenány v binárním protokolu, což je užitečné pro replikaci a obnovu.

Zapíná se takto:

Log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 5 max_binlog_size = 500 milionů

# Určuje umístění, životnost a maximální velikost souboru

Vezměte prosím na vědomí, že pokud se nechystáte škálovat systém a implementovat odolnost proti chybám, pak je lepší binární protokol nepovolovat. Je to náročné na zdroje a snižuje výkon systému.

Žádost o protokol

Tento protokol obsahuje všechny přijaté SQL dotazy a informace o připojení klientů. Může být užitečné pro analýzu a optimalizaci indexu a také pro identifikaci chybných dotazů:

General_log_file = /var/log/mysql/mysql.log obecný_log = 1

# Zahrnuje protokol a označuje umístění souboru

Můžete jej také povolit/zakázat, když je spuštěn MySQL server:

SET GLOBAL general_log = "ON"; SET GLOBAL general_log = "OFF";

# Chcete-li jej používat, nemusíte restartovat server

Pomalý protokol požadavků

Protokol je užitečný pro identifikaci pomalých, tedy neefektivních dotazů. Přečtěte si více v tomto článku.

Prohlížení protokolů

Chcete-li zobrazit protokoly na Debianu (Ubuntu), musíte spustit:

# Chyba log tail -f /var/log/syslog # Query log tail -f /var/log/mysql/mysql.log # Zaznamenejte pomalé požadavky tail -f /var/log/mysql/mysql-slow.log

# Pokud nejsou protokoly specifikovány samostatně, jsou umístěny v /var/lib/mysql

Rotace protokolu

Nezapomeňte komprimovat (archivovat, otáčet) soubory protokolu, aby zabíraly méně místa na serveru. Chcete-li to provést, použijte nástroj logrotateúpravou konfiguračního souboru /etc/logrotate.d/mysql-server:

# - Vložil jsem vše do jednoho bloku a přidal sdílené skripty, takže mysql dostane # flush-logs"d pouze jednou. # Jinak by se binární protokoly každý den automaticky zvýšily nkrát. # - Protokol chyb je zastaralý, zprávy nyní přecházejí do syslogu./var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log( denně otočit 7 chybějících vytvořit 640 mysql adm komprimovat sdílené skripty postrotate test -x /usr/bin/mysqladmin || exit 0 # Pokud to selže, zkontrolujte debian.conf! MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf" if [ -z "`$MYADMIN ping 2>/dev/null`" ]; pak # Opravdu žádný mysqld nebo spíše chybí uživatel debian-sys-maint? # Pokud k tomu dojde a nejedná se o chybu, nahlaste chybu. #if ps cax | grep -q mysqld; pak if killall -q -s0 -umysql mysqld; pak ukončete 1 fi else $MYADMIN flush-logs fi endscript )

# Komprimuje a archivuje potřebné protokoly, čistí soubory

Protokol DDL

MySQL také udržuje protokol datového jazyka. Shromažďuje data z operací jako DROP_TABLE a ALTER_TABLE. Protokol se používá k zotavení ze selhání, ke kterým došlo během takových operací. DDL Log je binární soubor a není určen ke čtení uživatelem, proto jej neupravujte ani nemažte.

Nejdůležitější

Vždy zapněte protokol chyb, použijte protokol dotazů ke kontrole připojení aplikace k databázi, kontrole dotazů a provozu. Protokol pomalých dotazů je užitečný pro optimalizaci výkonu MySQL.

Profilování dotazů MySQL je užitečná technika pro analýzu celkového výkonu databázových aplikací. Při vývoji středních až velkých aplikací jsou obvykle stovky dotazů rozmístěných po rozsáhlé kódové základně a databáze zpracovává mnoho dotazů za sekundu. Bez profilování dotazů je velmi obtížné určit umístění a příčiny úzkých míst aplikace. Tento tutoriál popisuje některé užitečné techniky profilování dotazů pomocí vestavěných nástrojů MySQL.

Log pomalých dotazů MySQL

Protokol pomalých dotazů MySQL (nebo protokol pomalých dotazů) je protokol, kam MySQL odesílá pomalé a potenciálně problematické dotazy.

Tato funkce je dodávána s MySQL, ale ve výchozím nastavení je zakázána. MySQL určuje, které dotazy by měly být zahrnuty do tohoto protokolu, pomocí speciálních proměnných, které umožňují profilovat dotaz na základě požadavků na výkon aplikace. Do tohoto protokolu se obvykle zapisují dotazy, jejichž zpracování trvá déle, a dotazy s nesprávnými indexy.

Profilování proměnných

Základní proměnné serveru pro konfiguraci protokolu pomalých dotazů MySQL jsou:

slow_query_log globální
slow_query_log_file globální
long_query_time global/session
log_queries_not_using_indexes global
min_examined_row_limit global/session

slow_query_log – logická proměnná pro povolení nebo zakázání protokolu pomalých dotazů.

slow_query_log_file – absolutní cesta k souboru protokolu dotazu. Adresář souborů musí být ve vlastnictví uživatele mysqld a musí mít příslušná oprávnění pro čtení a zápis. Démon mysql bude s největší pravděpodobností spuštěn jako mysql, ale pro jistotu spusťte příkaz v terminálu Linux:

ps -ef | grep bin/mysqld | řez -d" " -f1

Výstup zobrazí aktuálního uživatele a uživatele mysqld.

cd /var/log
mkdir mysql
chmod 755 mysql
chown mysql:mysql mysql

  • long_query_time – čas v sekundách pro kontrolu délky dotazu. Pokud je hodnota 5, budou protokolovány všechny požadavky, jejichž zpracování trvá déle než 5 sekund.
  • log_queries_not_using_indexes – Booleovská hodnota, která určuje, zda mají být protokolovány dotazy, které nepoužívají indexy. Při analýze jsou takové dotazy důležité.
  • min_examined_row_limit – definuje minimální počet řádků, které mají být analyzovány. S hodnotou 1000 budou ignorovány všechny dotazy, které analyzují méně než 1000 řádků.

Proměnné serveru MySQL lze nastavit v konfiguračním souboru MySQL nebo dynamicky pomocí uživatelského rozhraní MySQL nebo příkazového řádku. Pokud jsou proměnné nastaveny v konfiguračním souboru, zůstanou zachovány i po restartování serveru, ale pro jejich aktivaci je nutné server restartovat. Konfigurační soubor MySQL se obvykle nachází v /etc/my.cnf nebo /etc/mysql/my.cnf. Chcete-li najít konfigurační soubor, zadejte (možná budete muset rozšířit vyhledávání do jiných kořenových adresářů):

najít /etc -name my.cnf
najít /usr -name my.cnf

Jakmile najdete konfigurační soubor, přidejte požadované proměnné do sekce:


….
slow-query-log = 1
slow-query-log-file = /var/log/mysql/localhost-slow.log
long_query_time = 1
log-queries-not-using-indexes

Aby se změny projevily, musíte restartovat server. Pokud je třeba změny aktivovat okamžitě, nastavte proměnné dynamicky:

mysql> SET GLOBAL slow_query_log = "ON";
mysql> SET GLOBAL slow_query_log_file = "/var/log/mysql/localhost-slow.log";
mysql> SET GLOBAL log_queries_not_using_indexes = "ON";
mysql> SET SESSION long_query_time = 1;
mysql> SET SESSION min_examined_row_limit = 100;

Chcete-li zkontrolovat hodnoty proměnných:

mysql> ZOBRAZIT GLOBÁLNÍ PROMĚNNÉ JAKO "slow_query_log";
mysql> ZOBRAZIT PROMĚNNÉ RElace JAKO "long_query_time";

Jednou z nevýhod dynamicky se měnících proměnných MySQL je, že se proměnné ztratí, když se server restartuje. Do souboru by proto měly být přidány všechny důležité proměnné, které je třeba uložit.

Generování profilovacího dotazu

Nyní jste obeznámeni s nastavením protokolu pomalých dotazů. Zkuste vygenerovat data dotazu pro profilování.

Poznámka: Zde uvedený příklad byl spuštěn na běžící instanci MySQL bez nakonfigurovaných protokolů pomalých dotazů. Tyto testovací dotazy lze spustit prostřednictvím GUI nebo příkazového řádku MySQL.

Při sledování protokolu pomalých dotazů je užitečné otevřít dvě terminálová okna: jedno připojení pro odesílání příkazů MySQL a druhé pro prohlížení protokolu dotazů.

Přihlaste se k serveru MySQL pomocí konzoly jako uživatel s oprávněními SUPER ADMIN. Chcete-li začít, vytvořte testovací databázi a tabulku, přidejte do ní fiktivní data a povolte pomalé protokolování dotazů.

Poznámka: V ideálním případě je tento příklad nejlepší spustit v prostředí bez dalších aplikací používajících MySQL, aby nedošlo k zahlcení protokolu dotazů.

$> mysql -u -p
mysql> CREATE DATABASE profile_sampling;

mysql> USE profile_sampling;


mysql> CREATE TABLE uživatelé (id TINYINT PRIMARY KEY AUTO_INCREMENT, jméno VARCHAR(255));


mysql> INSERT INTO users (name) VALUES ("Walter"),("Skyler"),("Jesse"),("Hank"),("Walter Jr."),("Marie"),("Saul "),("Gustavo"),("Hector"),("Mike");


mysql> SET GLOBAL slow_query_log = 1;


mysql> SET GLOBAL slow_query_log_file = "/var/log/mysql/localhost-slow.log";


mysql> SET GLOBAL log_queries_not_using_indexes = 1;


mysql> SET long_query_time = 10;


mysql> SET min_examined_row_limit = 0;

Nyní máte testovací databázi a tabulku s některými daty. Je povolen protokol pomalého dotazu. Záměrně jsme nastavili dobu zpracování požadavku na vysokou a zakázali jsme kontrolu počtu řádků. Chcete-li zobrazit protokol, zadejte:

cd /var/log/mysql
ls -l

Prozatím by ve složce neměl být žádný protokol pomalých požadavků, protože v tuto chvíli žádné požadavky nebyly. Pokud takový protokol již existuje, znamená to, že databáze již zaznamenala pomalé dotazy, protože jste povolili podporu pro protokol pomalých dotazů. To může zkreslit výsledky tohoto příkladu. Vraťte se na kartu MySQL a spusťte:

mysql> USE profile_sampling;
mysql> SELECT * FROM users WHERE id = 1;

Provedený dotaz jednoduše načte data a použije index prvního klíče z tabulky. Tento dotaz byl rychlý a používal index, takže není zaznamenán v protokolu pomalých dotazů. Vraťte se do adresáře a ujistěte se, že nebyl vytvořen žádný protokol dotazů. Nyní se vraťte do okna MySQL a spusťte:

mysql>

Tento dotaz nepoužívá index. Nyní by se něco takového mělo objevit v protokolu /var/log/mysql/localhost-slow.log:

# Čas: 140322 13:54:58

použijte profile_sampling;
SET časové razítko=1395521698;

Další příklad. Zvyšte minimální počet řádků pro analýzu a odešlete požadavek takto:

mysql> SET min_examined_row_limit = 100;
mysql> SELECT * FROM users WHERE name = "Walter";

Data nebudou přidána do protokolu, protože během požadavku bylo analyzováno méně než 100 řádků.

Poznámka: Pokud data nebyla přidána do protokolu, musíte zkontrolovat několik faktorů. Nejprve zkontrolujte oprávnění adresáře, ve kterém je protokol vytvořen. Musí být vlastněn uživatelem/skupinou mysqld a mít oprávnění chmod 755. Poté byste měli zkontrolovat, zda na serveru nejsou další nastavení pomalého dotazu, která přepisují vaše nastavení. Obnovte výchozí nastavení, abyste odstranili všechny proměnné pomalého požadavku z konfiguračního souboru a restartujte server. Můžete také dynamicky nastavit globální proměnné na jejich výchozí hodnoty. Pokud provádíte změny dynamicky, odhlaste se a přihlaste se zpět do MySQL, abyste aktualizovali nastavení.

Analýza dat profilování dotazů

Zvažte následující údaje:

# Čas: 140322 13:54:58
#User@Host: root@localhost
# Query_time: 0,000303 Lock_time: 0,000090 Rows_sent: 1 Rows_examined: 10
použijte profile_sampling;
SET časové razítko=1395521698;
SELECT * FROM uživatelů WHERE jméno = "Jesse";

Tento záznam zobrazuje:

  • Doba provádění dotazu
  • Kdo to poslal
  • Jak dlouho trvalo vyřízení žádosti?
  • Délka
  • Kolik řádků bylo vráceno
  • Kolik řádků bylo analyzováno

To je užitečné, protože jakýkoli požadavek, který porušuje požadavky na výkon zadané v proměnných, skončí v protokolu. To umožňuje vývojáři nebo správci rychle vysledovat požadavky, které nefungují. Data profilování dotazů vám navíc mohou pomoci určit, jaké okolnosti způsobují špatný výkon vaší aplikace.

Pomocí mysqldumpslow

Profilování může být zahrnuto do databázových aplikací, aby se zajistil mírný tok dat.

S rostoucí velikostí protokolu je obtížné analyzovat všechna data a problematické dotazy se v nich mohou snadno ztratit. MySQL nabízí nástroj nazvaný mysqldumpslow, který pomáhá vyhnout se tomuto problému rozdělením protokolu pomalých dotazů. Binární soubor je propojen s MySQL (v Linuxu), takže můžete jednoduše spustit příkaz:

mysqldumpslow -t 5 -s na /var/log/mysql/localhost-slow.log

Příkaz může přijímat různé parametry pro přizpůsobení jeho výstupu. Výše uvedený příklad zobrazí 5 nejlepších požadavků seřazených podle průměrné doby požadavku. Takové řetězce jsou čitelnější a jsou také seskupeny podle požadavku.

Počet: 2 Čas=68,34s (136s) Zámek=0,00s (0s) Řádky=39892974,5 (79785949), root@localhost
SELECT PL.pl_title, P.page_title
ZE stránky P
INNER JOIN pagelinks PL
ON PL.pl_namespace = P.page_namespace
WHERE P.page_namespace = N

Výstup zobrazuje následující údaje:

  • Počet: kolikrát byl požadavek zaznamenán.
  • Čas: průměrná a celková doba požadavku (v závorkách).
  • Zámek: čas uzamčení stolu.
  • Řádky: Počet vrácených řádků.

Příkaz vylučuje číselné a řetězcové hodnoty, takže identické dotazy s různými podmínkami WHERE jsou považovány za stejné. Nástroj mysqldumpslow eliminuje potřebu neustále kontrolovat protokol pomalých dotazů a umožňuje místo toho spouštět pravidelné automatické kontroly. Volby příkazu mysqldumpslow vám umožňují spouštět složité výrazy.

Požadavek na rozdělení

Dalším nástrojem pro profilování, který je třeba mít na paměti, je nástroj Complex Query Breakdown Tool. Umožňuje identifikovat problematické dotazy v protokolu pomalých dotazů a spustit je v MySQL. Nejprve musíte povolit profilování a poté spustit dotaz:

mysql> SET SESSION profilování = 1;
mysql> USE profile_sampling;
mysql> SELECT * FROM users WHERE name = "Jesse";
mysql> ZOBRAZIT PROFILY;

Jakmile je profilování povoleno, SHOW PROFILES zobrazí tabulku, která spojuje Query_ID s výrazem SQL. Najděte Query_ID odpovídající běžícímu dotazu a spusťte následující dotaz (nahraďte # vaším Query_ID):

mysql> SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=#;

Příkaz vrátí tabulku:

SEKV STÁT TRVÁNÍ
1 spouštění 0.000046
2 kontrola oprávnění 0.000005
3 otevírání stolů 0.000036

STATE je krok v procesu provádění dotazu a DURATION je čas potřebný k dokončení tohoto kroku v sekundách. Toto není příliš užitečný nástroj, ale může pomoci určit, která část provádění dotazu způsobuje největší latenci.

Poznámka Poznámka: Tento nástroj by se neměl používat v produkčním prostředí.

Pomalý výkon protokolu dotazů

Zbývá pouze zjistit, jak pomalý protokol dotazů ovlivňuje výkon. Obecně je bezpečné spouštět pomalé protokoly dotazů v produkčním prostředí; Nemělo by to být ovlivněno CPU ani I/O. Měli byste však mít strategii pro monitorování velikosti protokolu, abyste zajistili, že protokol nebude pro souborový systém příliš velký. Navíc při spuštění pomalého protokolu dotazů v produkčním prostředí byste měli nastavit long_query_time na 1 nebo vyšší.

Závěr

Pomalý protokol dotazů vám může pomoci identifikovat problematické dotazy a vyhodnotit celkový výkon dotazů. Tímto způsobem může vývojář získat podrobné informace o tom, jak jsou v aplikaci prováděny dotazy MySQL. Nástroj mysqldumpslow vám umožňuje spravovat pomalé protokoly dotazů a snadno je začlenit do vašeho vývojového procesu. Identifikací problematických dotazů můžete optimalizovat zpracování dotazů pro zvýšení výkonu.

Štítky:

Profilování dotazů v Mysql slouží k vyhodnocení výkonu vaší aplikace. Při vývoji středních až velkých aplikací se musíte vypořádat se stovkami požadavků distribuovaných ve vašem kódu, které jsou prováděny každou sekundu. Bez technik profilování dotazů může být velmi obtížné zjistit, co způsobuje zhoršení výkonu vaší aplikace.

Co je protokol pomalého dotazu v MySQL?

MySQL Slow Query Log – protokol, který označuje pomalé a potenciálně problematické dotazy. MySQL tuto funkci standardně podporuje, ale je vypnutá. Nastavením určitých proměnných serveru můžeme určit, o které požadavky máme zájem. Nejčastěji potřebujeme dotazy, jejichž dokončení vyžaduje určitý čas, nebo dotazy, které nezpracovávají indexy správně.

Nastavení proměnných profilování

Hlavní proměnné pro nastavení protokolu dotazů:

Slow_query_log G slow_query_log_file G long_query_time G/S log_queries_not_using_indexes G min_examined_row_limit G/S

Komentář: G - globální proměnné, S - systémové proměnné

  • slow_query_log - logická hodnota včetně log
  • slow_query_log_file - absolutní cesta k souboru protokolu. Vlastníkem adresáře musí být uživatel mysqld a adresář musí mít správná oprávnění pro čtení a zápis. Nejčastěji démon mysql běží jako uživatel mysql.

Pro kontrolu spusťte následující příkazy:

Ps-ef | grep bin/mysqld | řez -d" " -f1

Výstup příkazu vám poskytne jméno aktuálního uživatele a uživatele mysqld. Příklad nastavení adresáře /var/log/mysql:

Cd /var/log sudo mkdir mysql sudo chmod 755 mysql sudo chown mysql:mysql mysql

  • long_query_time - čas v sekundách pro kontrolu trvání dotazu. Například s hodnotou 5 bude zaznamenán každý požadavek trvající déle než 5 sekund.
  • log_queries_not_using_indexes - logická hodnota, umožňuje ukládání dotazů, které nepoužívají indexy. Takové dotazy jsou v analýze velmi důležité.
  • min_examined_row_limit - určuje minimální hodnotu pro počet datových řádků, které mají být analyzovány. Hodnota 1000 bude ignorovat dotazy vracející méně než 1000 řádků hodnot.

Tyto proměnné lze nastavit v konfiguračním souboru MySQL dynamicky prostřednictvím GUI MySQL nebo příkazového řádku MySQL. Pokud jsou proměnné uvedeny v konfiguračním souboru, server je nainstaluje při příštím spuštění. Obvykle se tento soubor nachází v /etc, /usr, /etc/my.cnf nebo /etc/mysql/my.cnf. Zde jsou příkazy pro vyhledání konfiguračního souboru (někdy byste měli rozšířit vyhledávání do dalších kořenových adresářů):

Najít /etc -name my.cnf najít /usr -name my.cnf

Když soubor najdete, přidejte požadované proměnné do sekce:

; ... slow-query-log = 1 slow-query-log-file = /var/log/mysql/localhost-slow.log long_query_time = 1 log-queries-not-using-indexes ; zde není potřeba žádný význam

Změny se projeví až při příštím spuštění MySQL, pokud potřebujete dynamicky měnit parametry, použijte pro nastavení proměnných jiné metody:

Mysql> SET GLOBAL slow_query_log = "ON"; mysql> SET GLOBAL slow_query_log_file = "/var/log/mysql/localhost-slow.log"; mysql> SET GLOBAL log_queries_not_using_indexes = "ON"; mysql> SET SESSION long_query_time = 1; mysql> SET SESSION min_examined_row_limit = 100;

Hodnoty proměnných můžete zkontrolovat následovně:

Mysql> ZOBRAZIT GLOBÁLNÍ PROMĚNNÉ JAKO "slow_query_log"; mysql> ZOBRAZIT PROMĚNNÉ RElace JAKO "long_query_time";

Hlavní nevýhodou dynamické instalace je, že při spuštění systému dojde ke ztrátě hodnot. Doporučuje se zadat důležité parametry v konfiguraci MySQL.

Poznámka: Syntaxe pro dynamické nastavování parametrů pomocí příkazu SET a použití konfiguračního souboru je mírně odlišná, například slow_query_log / slow-query-log . Kompletní popis syntaxe naleznete v oficiální dokumentaci DBMS. Pro konfigurační soubor se používá formát Option-File, System Variable Name - názvy proměnných při dynamickém nastavování hodnot.

Generování dat pro profilování dotazů

Probrali jsme hlavní body pro nastavení profilování, nyní vytvoříme dotazy, které nás zajímají. Tento příklad byl použit na běžícím serveru MySQL bez jakéhokoli předběžného nastavení protokolu. Ukázkové dotazy lze spouštět jak prostřednictvím GUI MySQL, tak příkazových nástrojů DBMS. Při sledování protokolu pomalých dotazů je běžné otevřít dvě okna s připojením: jedno pro spouštění dotazů, druhé pro prohlížení protokolu.

$> mysql -u -p mysql> CREATE DATABASE profile_sampling; mysql> USE profile_sampling; mysql> CREATE TABLE uživatelé (id TINYINT PRIMARY KEY AUTO_INCREMENT, jméno VARCHAR(255)); mysql> INSERT INTO users (name) VALUES ("Walter"),("Skyler"),("Jesse"),("Hank"),("Walter Jr."),("Marie"),("Saul "),("Gustavo"),("Hector"),("Mike"); mysql> SET GLOBAL slow_query_log = 1; mysql> SET GLOBAL slow_query_log_file = "/var/log/mysql/localhost-slow.log"; mysql> SET GLOBAL log_queries_not_using_indexes = 1; mysql> SET long_query_time = 10; mysql> SET min_examined_row_limit = 0;

Nyní máme databázi s testovacími daty. Spustili jsme profilování, ale schválně jsme nastavili dobu odezvy a počet linek na malé. Pro zobrazení protokolu použijte příkaz:

Cd /var/log/mysql ls -l

Teoreticky by soubor protokolu ještě neměl existovat, protože jsme neprováděli dotazy do databáze. Pokud existuje, znamená to, že profilování bylo nakonfigurováno dříve, což může zkreslit výsledky příkladu. Spusťte v konzoli:

Mysql> USE profile_sampling; mysql> SELECT * FROM users WHERE id = 1;

Náš dotaz používá index primárního klíče z tabulky. Požadavek byl pomocí indexu zpracován velmi rychle, takže by se neměl projevit v protokolu. Vezměte prosím na vědomí, že soubor protokolu neměl být vytvořen.

Nyní proveďte následující:

Mysql> SELECT * FROM uživatelů WHERE jméno = "Jesse";

Zde jsme indexy nepoužili. Nyní bychom měli v protokolu vidět tento požadavek:

Sudo cat /var/log/mysql/localhost-slow.log # Čas: 140322 13:54:58 # User@Host: root @ localhost # Query_time: 0,000303 Lock_time: 0,000090 Rows_sent: 1 Rows_examined_ampling: 10 použití SET časové razítko=1395521698; SELECT * FROM uživatelů WHERE jméno = "Jesse";

Podívejme se na další příklad. Zvedněte laťku počtu řádků v odpovědi a spusťte následující dotaz:

Mysql> SET min_examined_row_limit = 100; mysql> SELECT * FROM users WHERE name = "Walter";

Požadavek se v protokolu neprojeví, protože jsme v odpovědi na požadavek nepřekročili 100 řádků.

Poznámka: Pokud se data v protokolu nezobrazují, musíte nejprve zvážit následující faktory. Prvním z nich jsou práva k adresáři, kde je uložen soubor protokolu. Skupina a uživatel musí odpovídat uživateli mysqld, práva musí být chmod 755. Za druhé, profilování mohlo být nakonfigurováno dříve. Odstraňte všechny existující hodnoty proměnných profilování z konfiguračního souboru a restartujte server nebo nastavte proměnné dynamicky. Pokud jste použili dynamickou metodu, ukončíte a přihlásíte se zpět do konzole MySQL.

Analýza dat profilování dotazů

Zvažte výše uvedený příklad:

# Čas: 140322 13:54:58 # User@Host: root @ localhost # Query_time: 0,000303 Lock_time: 0,000090 Rows_sent: 1 Rows_examined: 10 use profile_sampling; SET časové razítko=1395521698; SELECT * FROM uživatelů WHERE jméno = "Jesse";

Zde vidíme:

  • Čas, kdy byl požadavek spuštěn
  • Uživatel, který podal požadavek
  • Požadavky na otevírací dobu
  • Doba trvání zámku
  • Počet vybraných řádků
  • Počet analyzovaných řádků

Tato data jsou velmi užitečná, protože s jejich pomocí můžeme najít a odstranit příčinu zpomalení systému. Také vývojář nebo správce MySQL bude vždy schopen vidět problematické dotazy a rád bych poznamenal, že je zde najít mnohem rychleji než studiem kódu aplikace. Díky dlouhodobému profilování můžete sledovat provozní podmínky při nízké rychlosti.

Pomocí mysqldumpslow

Log neustále zaznamenává data, zpravidla mnohem více zapisuje, než se z něj čte. Pokud je velikost protokolu velká, jeho čtení se stává problematickým. MySQL obsahuje nástroj zvaný mysqldumpslow, který pomáhá udržovat integritu protokolů. Samotný program je kombinován s MySQL (na systémech Linux). Chcete-li jej použít, spusťte potřebný příkaz a předejte mu cestu k souboru protokolu:

Sudo mysqldumpslow -t 5 -s na /var/log/mysql/localhost-slow.log

Existuje řada parametrů, které vám pomohou přizpůsobit výstup příkazu. V níže uvedeném příkladu uvidíme posledních pět požadavků seřazených podle průměrné doby trvání. V důsledku toho je čtení protokolu mnohem pohodlnější. (výstup upraven tak, aby zobrazoval skutečné hodnoty protokolu):

Počet: 2 Čas=68,34s (136s) Zámek=0,00s (0s) Řádky=39892974,5 (79785949), root@localhost VYBERTE PL.pl_title, P.page_title ZE stránky P VNITŘNÍ PŘIPOJIT se ke stránkám PL ON PL.jmenný_prostor = P.page WHERE P.page_namespace = N ...

Co vidíme:

  • Počet - počet výskytů požadavku v protokolu
  • Čas – průměrný a celkový čas požadavku
  • Zámek - čas uzamčení stolu
  • Řádky - Počet vybraných řádků

Příkaz vylučuje číselná a řetězcová data dotazu, což znamená, že dotazy se stejnou klauzulí WHERE budou považovány za stejné. Díky tomuto nástroji se nemusíte neustále dívat do protokolu. Vzhledem k velkému množství parametrů příkazu můžete výstup třídit dle libosti. Existují také vývoje třetích stran s podobnou funkčností, například pt-query-digest.

Požadavek na rozdělení

Měli byste věnovat pozornost dalšímu nástroji, který vám umožní rozdělit složité dotazy. Nejčastěji musíte vzít dotaz z logu a poté jej spustit přímo v konzoli MySQL. Nejprve musíte povolit profilování a poté spustit dotaz:

Mysql> SET SESSION profilování = 1; mysql> USE profile_sampling; mysql> SELECT * FROM users WHERE name = "Jesse"; mysql> ZOBRAZIT PROFILY;

Po povolení profilování zobrazí SHOW PROFILES tabulku propojující Query_ID a SQL výraz. Najděte odpovídající Query_ID a spusťte následující dotaz (nahraďte # vaším Query_ID):

Mysql> SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=#;

Příklad výstupu:

DÉLKA STAVU SEQ 1 počínaje 0,000046 2 kontrola oprávnění 0,000005 3 otevření tabulek 0,000036

STÁT- krok v procesu vyřízení žádosti, TRVÁNÍ- délka kroku v sekundách. Tento nástroj se nepoužívá příliš často, ale někdy může být velmi užitečný při určování příčiny pomalého výkonu dotazu.

Podrobný popis sloupců:

Podrobný popis kroků:

Poznámka: Tento nástroj by se neměl používat v produkčním režimu serveru, s výjimkou analýzy konkrétních dotazů.

Pomalý výkon protokolu dotazů

Poslední otázkou je, jak profilování ovlivňuje výkon serveru jako celku. V produkčním režimu serveru můžete takové protokolování celkem bezpečně používat, nemělo by to mít vliv na CPU ani I/O. Je však vhodné věnovat pozornost velikosti souboru protokolu, který by neměl být příliš velký. Ze zkušenosti bych také rád poznamenal, že nastavení hodnoty proměnné long_query_time na 1 sekundu nebo vyšší.

Důležité: Pro záznam všech požadavků byste neměli používat profilovací nástroj - SET profilování = 1, tzn. Nedoporučuje se používat proměnnou general_log v režimu produktu a při velkém zatížení.

Závěr

Profilování dotazů vám může hodně pomoci při izolování problematického dotazu a posouzení celkového výkonu. Vývojář může také studovat, jak fungují dotazy MySQL jeho aplikace. Nástroj mysqldumpslow vám pomůže prohlížet a zpracovávat protokoly dotazů. Po identifikaci problematických dotazů zbývá jen vyladit je pro maximální výkon.

Pojem

Protokoly serveru (soubory protokolu, protokol serveru)- soubory uložené na serveru, které obsahují systémové informace serveru, jakož i protokolování všech možných údajů o návštěvníkovi webového zdroje.

Protokoly používají správci systému k analýze návštěvníků, studium vzorců chování určitých skupin uživatelů a také získávání různých informací o nich, jako jsou: použitý prohlížeč, IP adresa, údaje o geografické poloze klienta a mnoho dalšího. Kromě analýzy můžete tímto způsobem zjistit neoprávněný přístup na stránku, přesněji zjistit, kdo to přesně udělal, a předat údaje o tomto případu příslušným úřadům.

Data v log souboru ve své čisté podobě nebudou srozumitelná běžným uživatelům, kteří v tom všem uvidí jen sadu znaků v nesrozumitelném pořadí. Pro systémové administrátory a webové vývojáře je to ale naprosto čtivý text a docela užitečné informace.


Sled událostí

Pokaždé, když klient přistoupí k webovému prostředku, spustí se několik událostí najednou, o jejichž posloupnosti si povíme.

1. Vytvoření požadavku na stránku. Když zadáte adresu do řádku prohlížeče nebo když následujete aktivní webový odkaz, například ze stránky s výsledky vyhledávače, prohlížeč vyhledá a připojí se k serveru, na kterém se stránka nachází, a požádá o něj. Současně předává serveru následující informace:
- IP adresa klientského počítače, který požaduje stránku (pokud používáte proxy server, IP adresa vašeho proxy);
- adresa internetové stránky požadovaná uživatelem (IP adresa);
- přesný čas a datum, kdy byla žádost podána;
- údaje o skutečném umístění klienta (pokud je použit proxy server, pak skutečná proxy adresa);
- informace o prohlížeči, který klient používá (název, verze atd.);
- údaje o webové stránce, ze které klient přešel.

2. Přenos požadovaných dat. Požadovaná data (webová stránka, soubory, cookies atd.) jsou přenášena ze serveru do počítače uživatele.

3. Zapište do protokolu serveru. Po všem dojde k záznamu protokolu, který označuje všechna data, která se objevila v posledních dvou událostech. To jsou všechny informace zaslané v prvním odstavci a také informace o přenesených datech.

Jak zobrazit protokoly serveru

Soubory protokolu jsou uloženy v souboru access.log bez ohledu na to, jaký typ webového serveru používáte (Apache, Nginx, squid proxy server atd.) Tento soubor je textový dokument, na jehož každém řádku je zaznamenán jeden požadavek. Formáty nahrávání v access.log poměrně hodně, ale nejoblíbenější je kombinovaná, ve které má záznam následující formu a pořadí:

Kód: %h %l %u %t \"%r\" %>s %b \"%(Referer)i\" \"%(User-Agent)i\"
Kde:

%h- adresa hostitele/IP, ze které byl požadavek podán;
%t- čas požadavku na server a časové pásmo serveru;
%r- verze, obsah a typ požadavku;
%s- stavový kód HTTP;
%b- počet bajtů odeslaných serverem;
%(Referer)- zdroj URL požadavku;
%(User-Agent)- HTTP hlavička s informacemi o požadavku (klientská aplikace, jazyk atd.);
%(Hostitel)- název virtuálního hostitele, ke kterému se přistupuje.

Po dokončení tento řádek vypadá asi takto:

127.0.0.1 - - "GET /index.php HTTP/1..0 (kompatibilní; MSIE 7.0; Windows NT 5.1)"

Ruční čtení protokolů zabere poměrně hodně času a úsilí. Zkušení webmasteři proto používají speciální software nazvaný “Log File Analyzers”. Analyzují všechna data, která jsou pro lidi poměrně obtížně čitelná, a vytvářejí strukturovaná data. Jedná se o programy jako: Analog, WebAnalizer, Webalizer, Awstats, Webtrends atd. Existuje několik typů speciálního softwaru, včetně placených i bezplatných programů. Jsem si proto jist, že každý si najde to své.

Kde najít protokoly stránek

Pokud máte pravidelný hosting, pak s největší pravděpodobností budete muset napsat svému hostiteli a vyžádat si od něj logy. Poměrně často je také můžete požádat prostřednictvím hostitelského panelu. Různí hostitelé to dělají jinak. Chcete-li například požádat svého hostitele, stačí kliknout na hlavní stránku panelu:


Pokud máte přístup k systémovým složkám serveru, najdete protokoly na /etc/httpd/logs/access_log v 99 případech ze 100.

Protokol chyb error.log

Error.log- soubor, ve kterém jsou také vedeny protokoly. Ale ne návštěvníci, ale chyby, které se vyskytly na serveru. Jak je tomu v případě access.log, každý řádek souboru je zodpovědný za jednu chybu, ke které došlo. Záznam se provádí s přihlédnutím k takovým informacím, jako jsou: přesné datum a čas výskytu chyby, IP adresa, na kterou byla chyba vydána, typ chyby a také důvod jejího výskytu.

Závěr

Protokoly jsou docela mocným a informativním nástrojem pro práci. V dnešní době je však nahrazují nástroje jako Yandex.Metrica, Google Analytics atd., čímž nám usnadňují život. Pokud se však plánujete rozvíjet, růst a učit se něco nového, určitě doporučuji toto téma lépe poznat.




Nahoru