<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Monitoring_PostgreSQL</id>
	<title>Monitoring PostgreSQL - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Monitoring_PostgreSQL"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Monitoring_PostgreSQL&amp;action=history"/>
	<updated>2026-05-12T22:30:25Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Monitoring_PostgreSQL&amp;diff=579&amp;oldid=prev</id>
		<title>imported&gt;Pavel: Založena nová stránka s textem „Autor: &#039;&#039;Pavel Stěhule&#039;&#039; Category:Články  Ať už používáme jakoukoliv databázi, je nutné monitorovat jak databázi, tak databázový server. D…“</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Monitoring_PostgreSQL&amp;diff=579&amp;oldid=prev"/>
		<updated>2016-12-16T04:44:49Z</updated>

		<summary type="html">&lt;p&gt;Založena nová stránka s textem „Autor: &amp;#039;&amp;#039;Pavel Stěhule&amp;#039;&amp;#039; &lt;a href=&quot;/wiki/Kategorie:%C4%8Cl%C3%A1nky&quot; title=&quot;Kategorie:Články&quot;&gt;Category:Články&lt;/a&gt;  Ať už používáme jakoukoliv databázi, je nutné monitorovat jak databázi, tak databázový server. D…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Autor: &amp;#039;&amp;#039;Pavel Stěhule&amp;#039;&amp;#039;&lt;br /&gt;
[[Category:Články]]&lt;br /&gt;
&lt;br /&gt;
Ať už používáme jakoukoliv databázi, je nutné monitorovat jak databázi,&lt;br /&gt;
tak databázový server. Dnes si ani nedovedu představit provoz nějaké náročnější&lt;br /&gt;
aplikace bez základního monitoringu. V praxi se ale setkávám s tím, že dobře&lt;br /&gt;
nastavený monitoring databáze a databázového serveru je spíše výjimkou,&lt;br /&gt;
která potvrzuje pravidlo. Opět se pokusím ukázat, že se nejedná o nic&lt;br /&gt;
komplikovaného a je velká škoda, že se vývojáři připravují o množství&lt;br /&gt;
nedocenitelných informací, které jim monitoring může přinést.&lt;br /&gt;
&lt;br /&gt;
Asi každá aplikace má lepší nebo horší logování, které je možné využít i&lt;br /&gt;
pro analýzy výkonu. Monitoring na straně klienta poskytuje pouze část obrazu.&lt;br /&gt;
V případě výkonnostních problémů nevíme, jestli už vzniká problém v databázi&lt;br /&gt;
(případně v zdrojích O.S. serveru) nebo až na straně klienta. Z pohledu&lt;br /&gt;
klienta nevíme, kde na serveru narážíme na limity. &lt;br /&gt;
&lt;br /&gt;
U databázových aplikací je samotná databáze přirozeným úzkým hrdlem, a jakákoliv&lt;br /&gt;
informace ohledně výkonu je jedna z mála objektivních vyčíslitelných zpětných&lt;br /&gt;
vazeb pro vývojáře. Bohužel hodně vývojářů netuší, že tyto informace existují,&lt;br /&gt;
a tak je vůbec nepožadují. Důvodů je několik - někdy nezkušenost, někdy&lt;br /&gt;
organizační překážky, někdy i osobní averze mezi administrátory a vývojáři.&lt;br /&gt;
Často je to bludná víra, že databáze si už nějak poradí, a běžný programátor&lt;br /&gt;
nemá šanci nějak ovlivnit výkon - případně, že to už je práce databázového&lt;br /&gt;
administrátora a nikoliv programátora. Nic není vzdálenější pravdě.&lt;br /&gt;
&lt;br /&gt;
Výkon aplikace je dán primárně použitou architekturou, potom návrhem interface&lt;br /&gt;
a použitými algoritmy, dále pak vlastní implementací - skoro až na úplném konci&lt;br /&gt;
je konfigurace databáze. Databázový administrátor může leccos pokazit, ale už toho&lt;br /&gt;
nemůže moc zachránit. Co ale může, a měl by, je poskytování zpětné vazby vývojářům.&lt;br /&gt;
Přeci jen má informace z první ruky - a přeci jen vývojáři by se neměli dostat&lt;br /&gt;
blízko k produkčním serverům (z mnoha důvodů). Vím o týmech, kde to funguje.&lt;br /&gt;
Samozřejmě, že jsem viděl i týmy, kde vývojáři obviňují adminy z neschopnosti,&lt;br /&gt;
a admini vývojáře z pitomosti. To ale žádný výkonnostní problém nevyřeší.&lt;br /&gt;
&lt;br /&gt;
==Analýza pomalých dotazů==&lt;br /&gt;
Prvním nástrojem pro sledování databázového serveru je sledování pomalých&lt;br /&gt;
dotazů (případně všech dotazů). Téměř v každé aplikaci se objeví dotazy, které&lt;br /&gt;
server, z nějakého důvodu, nemůže efektivně provést. Ke všemu se často&lt;br /&gt;
jedná o chybně napsané dotazy - kdy dostaneme nesprávný výsledek a ještě&lt;br /&gt;
si na něj musíme dlouho počkat. S logem pomalých dotazů se vývojář může &lt;br /&gt;
zaměřit na několik málo dotazů a ty prověřit po všech stránkách. Pokud se &lt;br /&gt;
používají ORM systémy, tak log pomalých dotazů je často prvním místem, kde&lt;br /&gt;
může vývojář vidět dotaz v celku, vidět dobu provádění dotazu a četnost&lt;br /&gt;
jeho provádění. Když už nic jiného, tak by vývojáři měli používat log&lt;br /&gt;
pomalých dotazů - je to jednostranná informace, ale už jenom s tím se dá žít.&lt;br /&gt;
Ne každý pomalý dotaz je možné vyřešit (odstranit). Počítání reportu můžeme&lt;br /&gt;
zrychlit do určité míry, ale nemůžeme oblafnout fyziku - ať už je to rychlost &lt;br /&gt;
čtení dat z disků, počet IOPS disků nebo rychlost čtení z operační paměti.&lt;br /&gt;
O každém pomalém dotazu bychom měli ovšem vědět, a měli bychom vědět, proč&lt;br /&gt;
je pomalý.&lt;br /&gt;
&lt;br /&gt;
===pg_stat_statements===&lt;br /&gt;
V Postgresu máme pro sledování pomalých dotazů tři nástroje. Nejjednodušším&lt;br /&gt;
na použití je extenze [https://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]. Ta se instaluje registrací v konfigurační&lt;br /&gt;
proměnné &amp;lt;i&amp;gt;shared_preload_libraries&amp;lt;/i&amp;gt;. Po restartu je nutné ještě extenzi zaregistrovat&lt;br /&gt;
příkazem &amp;lt;code&amp;gt;CREATE EXTENSION pg_stat_statements&amp;lt;/code&amp;gt; v těch databázích,&lt;br /&gt;
kde chceme mít dostupnou statistiku SQL příkazů.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /&lt;br /&gt;
               nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent&lt;br /&gt;
          FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;&lt;br /&gt;
-[ RECORD 1 ]---------------------------------------------------------------------&lt;br /&gt;
query       | UPDATE pgbench_branches SET bbalance = bbalance + ? WHERE bid = ?;&lt;br /&gt;
calls       | 3000&lt;br /&gt;
total_time  | 9609.00100000002&lt;br /&gt;
rows        | 2836&lt;br /&gt;
hit_percent | 99.9778970000200936&lt;br /&gt;
-[ RECORD 2 ]---------------------------------------------------------------------&lt;br /&gt;
query       | UPDATE pgbench_tellers SET tbalance = tbalance + ? WHERE tid = ?;&lt;br /&gt;
calls       | 3000&lt;br /&gt;
total_time  | 8015.156&lt;br /&gt;
rows        | 2990&lt;br /&gt;
hit_percent | 99.9731126579631345&lt;br /&gt;
-[ RECORD 3 ]---------------------------------------------------------------------&lt;br /&gt;
query       | copy pgbench_accounts from stdin&lt;br /&gt;
calls       | 1&lt;br /&gt;
total_time  | 310.624&lt;br /&gt;
rows        | 100000&lt;br /&gt;
hit_percent | 0.30395136778115501520&lt;br /&gt;
-[ RECORD 4 ]---------------------------------------------------------------------&lt;br /&gt;
query       | UPDATE pgbench_accounts SET abalance = abalance + ? WHERE aid = ?;&lt;br /&gt;
calls       | 3000&lt;br /&gt;
total_time  | 271.741999999997&lt;br /&gt;
rows        | 3000&lt;br /&gt;
hit_percent | 93.7968855088209426&lt;br /&gt;
-[ RECORD 5 ]---------------------------------------------------------------------&lt;br /&gt;
query       | alter table pgbench_accounts add primary key (aid)&lt;br /&gt;
calls       | 1&lt;br /&gt;
total_time  | 81.42&lt;br /&gt;
rows        | 0&lt;br /&gt;
hit_percent | 34.4947735191637631&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===pgFouine===&lt;br /&gt;
Dalším, dnes už letitým nástrojem je analyzátor logu pomalých dotazů [http://pgfouine.projects.pgfoundry.org/ pgFouine] - &lt;br /&gt;
Mně osobně se velice líbí. Generované [http://pgfouine.projects.pgfoundry.org/reports/sample_default.html reporty] jsou přehledné, názorné. Dělá&lt;br /&gt;
to přesně to, co je potřeba. Jedná se ale o  aplikaci, která dnes už není udržovaná, a nějakou modernizaci by potřebovala.&lt;br /&gt;
Výhodou pgFouine je možnost se v reportu podívat na příklady pomalých dotazů&lt;br /&gt;
a minimální dopad na výkon aplikace.&lt;br /&gt;
&lt;br /&gt;
===pgBadger===&lt;br /&gt;
Moderním a rozvíjený nástroj na zpracování Postgresových logů je [http://dalibo.github.io/pgbadger/ pgBadger].&lt;br /&gt;
Umí z Postgresových logů vyčíst maximum možných informací a poskytuje relativně&lt;br /&gt;
ucelený náhled na provoz. Pro samotnou analýzu pomalých dotazů mám ale raději&lt;br /&gt;
jednodušší (skromnější) jednoúčelový pgFouine.&lt;br /&gt;
&lt;br /&gt;
Z logu pomalých dotazů nevyčteme nic o důvodech, proč jsou dotazy pomalé. Jestli&lt;br /&gt;
v tu dobu bylo zrovna přetížené IO, nebo databáze odbavovala tisíce dotazů za &lt;br /&gt;
vteřinu nebo naráz prováděla stovky dotazů. Pro plastičtější obraz potřebujeme &lt;br /&gt;
nástroj pro monitoring operačního systému. Určitě některý znáte: munin, nagios, Grafana.&lt;br /&gt;
&lt;br /&gt;
==Zobrazení dalších metrik==&lt;br /&gt;
&lt;br /&gt;
Subjektivně mi stále nejvíc vyhovuje [https://en.wikipedia.org/wiki/Munin_(software) munin]. Jeho výstupy jsou pro mne dobře čitelné, zřetelné - &lt;br /&gt;
vyhovuje mi výchozí barevné schéma. Jedná se o poměrně letitý software s určitými&lt;br /&gt;
muškami - z GoodData vím o výkonnostních problémech při monitoringu větších desítek&lt;br /&gt;
serverů. Jeho visual je docela archaický - pro každodenní práci ale ocením čitelnost&lt;br /&gt;
na první pohled. Je úplně jedno, který nástroj používáte. Důležité je mít alespoň&lt;br /&gt;
jeden monitoring a ten aktivně používat - tj jednou za týden, jednou denně (podle&lt;br /&gt;
důležitosti aplikace) se na něj podívat, plus samozřejmě v případě problémů.&lt;br /&gt;
&lt;br /&gt;
===Zátěž IO===&lt;br /&gt;
Výkon jakékoliv transakční databáze závisí od stavu IO. IO samozřejmě může mít vliv&lt;br /&gt;
i na netransakční databáze. Monitorování IO je základ. Je velice praktické sledovat&lt;br /&gt;
metriky jako je počet IO operací/sec, intenzita zápisu(čtení)/sec, utilizaci IO,&lt;br /&gt;
případně inverzní hodnotu IO waits. Ve chvíli, kdy máte v databázovém serveru dlouhodobě&lt;br /&gt;
velké IO waits, tak se razantně prodlužuje zpracování příkazů (z ms i na desítky&lt;br /&gt;
vteřin).&lt;br /&gt;
&lt;br /&gt;
===Využití disků===&lt;br /&gt;
&amp;lt;p&amp;gt;Další extrémně zajímavou metrikou je obsazenost disků - u dnešních relativně&lt;br /&gt;
velkých a rychlých disků se doporučuje si udržovat v lepším případě 50% volného&lt;br /&gt;
místa, v horším případě alespoň 30%. Často je problém s výkonem spojený s nárůstem&lt;br /&gt;
velikosti databáze - atypicky velký nárůst databáze může signalizovat útok,&lt;br /&gt;
chyby v čištění, archivaci - v designu skriptů, které realizují upload dat.&lt;br /&gt;
Ve větších organizacích už nemusí být přehled o všech činnostech, které se dějí&lt;br /&gt;
na databázovém serveru - upload 100GB databáze hodně zacvičí s IO - při monitoringu&lt;br /&gt;
uvidíme novou databázi s velkým intenzivním nárůstem. To už stačí k tomu, aby &lt;br /&gt;
člověk věděl koho se zeptat, případně na co se zeptat.&lt;br /&gt;
&lt;br /&gt;
===Spojení do databáze===&lt;br /&gt;
Zajímavou informací jsou počty spojení - aktivní, neaktivní, čekající na zámek,&lt;br /&gt;
s otevřenými transakcemi. To hodně říká o designu aplikace, o tom jak náročné&lt;br /&gt;
jsou dotazy, kde jsou úzká hrdla. Pokud aplikace správně neuvolňuje spojení,&lt;br /&gt;
neukončuje transakce, tak má neobvykle velké požadavky na počet otevřených&lt;br /&gt;
spojení do databáze. V grafu počtu spojení je takový problém perfektně vidět.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Nejdelší transakce, nejdelší dotazy, počty transakcí===&lt;br /&gt;
V SQL databázi zajímavou informací může být graf vykreslující dobu nejdelší aktivní &lt;br /&gt;
transakce, dobu nejdelšího aktivního dotazu. Zajímavé jsou i počty transakcí.&lt;br /&gt;
Z nich je vidět, kdy jsou špičky, jak jsou velké - je možné propojit vliv&lt;br /&gt;
transakcí na zátěž IO. Z počtu transakcí je vidět i dostupnost aplikace. Pokud&lt;br /&gt;
na Firewallu zaříznete velkého aktivního zákazníka, tak výrazně klesne počet&lt;br /&gt;
transakcí. Log firewallu běžně nikdo nestuduje - o jednu IP adresu více nebo méně.&lt;br /&gt;
Propad počtu transakcí je perfektně vidět.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Autovacuum===&lt;br /&gt;
V PostgreSQL je extrémně důležité vakuování tabulek. Většinu situací řeší&lt;br /&gt;
automat autovacuum. Tento automat iteruje nad tabulkami, a pokud najde tabulku&lt;br /&gt;
s 10% změn, tak vytvoří nový proces a v něm spustí příkaz &amp;lt;code&amp;gt;ANALYZE&amp;lt;/code&amp;gt; nad tabulkou.&lt;br /&gt;
V případě tabulky s 20% změn vytvoří nový proces a v něm provede &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; tabulky.&lt;br /&gt;
Počet procesů, které může autovacuum vytvořit je omezený. Je nutné sledovat,&lt;br /&gt;
jestli je tento limit dostatečný - počet procesů vytvořených automatem nesmí&lt;br /&gt;
být dlouhodobě na maximu. To by znamenalo, že Postgres nestíhá vacuovat, a docházelo&lt;br /&gt;
by k zbytečnému nafukování tabulek.&lt;br /&gt;
&lt;br /&gt;
===Ostatní===&lt;br /&gt;
Není od věci si nechat vykreslovat běh delších operací, které mohou mít vliv&lt;br /&gt;
na zátěž databáze - zálohování, masivní exporty a importy, výpočet fakturace,&lt;br /&gt;
párování přijatých faktur a plateb. Pokud zjistím například vysokou utilizaci&lt;br /&gt;
disku, pak si ji mohu jednoduše spojit např. se zálohováním (pokud mám zálohování&lt;br /&gt;
zobrazené). Tam, kde už na produktu pracuje víc lidí, víc nezávislých týmů&lt;br /&gt;
je to nedocenitelné.&lt;br /&gt;
&lt;br /&gt;
==Závěr==&lt;br /&gt;
Monitoring je dobré doplnit nástrojem na zpracování logů - občas je nutné&lt;br /&gt;
provést podrobnější analýzu - a tam už obrázky nestačí. Když se umí zacházet&lt;br /&gt;
ze [https://cs.wikipedia.org/wiki/Splunk splunkem], tak to člověk&lt;br /&gt;
jen zírá. Dost možná, že na většinu zdejších aplikací&lt;br /&gt;
by splunk byl tím kanónem na vrabce - postačí [https://www.elastic.co/products/logstash Logstash] a Elasticsearch. Proti&lt;br /&gt;
klasickému procházení logů je to neskutečný komfort. Nehledě na to, že opět&lt;br /&gt;
odstiňuje vývojáře od produkce.&lt;br /&gt;
&lt;br /&gt;
U trochu důležitějších aplikací je vhodné monitoring doplnit alertingem. &lt;br /&gt;
Dochází místo disku, některá důležitá operace běží neobvykle dlouhou &lt;br /&gt;
dobu, dochází k několika hodinovému čekání na zámek, k několika hodinovým&lt;br /&gt;
dotazům, transakcím - to vše může vyžadovat pozornost administrátora. Je &lt;br /&gt;
hloupé, když Vás na kritické problémy upozorňují uživatelé.&lt;br /&gt;
&lt;br /&gt;
Postavení základního monitoringu databázového serveru je práce na maximálně &lt;br /&gt;
na půl dne. Fungující monitoring umožňuje vidět problémy, vidět trendy, lépe&lt;br /&gt;
identifikovat úzká hrdla. S těmito znalostmi lze využít maximálně výkon&lt;br /&gt;
hardware - nemusíte už pak řešit jestli Vaše aplikace letos přežije předvánoční&lt;br /&gt;
nákupní šílenství, protože máte dostatek výkonu.&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>