,

Optimalizace nastavení MySQL na VPS

|

Pro své projekty používám VPS u WEDOSu. Na jedné VPS jsou jednodušší weby, které nepotřebují tolik paměti. Na druhé VPS, s podstatně lepšími parametry (2 jádra CPU, 3GB RAM), běží můj zatím na zdroje nejnáročnější projekt – HamQTH. Databáze samotná na disku zabírá něco přes 8GB. V asi 30 tabulkách se nachází přes 10 milionů záznamů. S databází se hodně pracuje, neustále se do ní něco zapisuje. I takto vybavená VPS nestíhala, dusily ji požadavky na I/O.

Jak a co tedy optimalizovat?

Cache

Práci s databází velmi zrychlíte pokud bude mít v paměti co nejvíce dat. Jestliže používáte InnoDB engine, velmi doporučuji podívat se na nastavenou hodnotu pro tuto konfigurační proměnnou:

[cc lang=“bash“]
Innodb_buffer_po­ol_size = 1200
[/cc] kde
Innodb_buffer_po­ol_size – velikost paměti pro indexy a data v MB

Na svém serveru nastavuji tuto hodnotu asi na 40 až 50 procent dostupné RAM. Běží mi tam i Apache a další služby. Kdyby se jednalo pouze do databázový server, nastavte klidně 70% velikosti RAM. Aby se změny projevily je nutné restartovat MySQL server.

SQL dotazy

Dobře navržené dotazy a indexy v databázi jsou základ. V MySQL si můžete zapnout logování dotazů trvajících déle než je stanovený limit. V /etc/mysql/my.cnf přidejte resp. upravte tyto řádky:
[cc lang=“bash“]
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
[/cc] kde
log_slow_queries – cesta, kam logovat pomalé dotazy
long_query_time – logovat pouze dotazy trvající x sekund Po nastavení/změně hodnot je nutné restartovat MySQL server.

Zápisy na disk

I když máte na VPS vyhrazenou RAM, sdílíte procesor a co je hlavní, také disky. MySQL má ve výchozím nastavení zapnuto ukládání na disk po každém commitu. Pro bezpečnost dat je to velmi dobrá volba, bohužel v případě sdíleného I/O a velkého počtu zápisů, můžete stroj udusit. Pokud můžete přijmou malé riziko, kdy při pádu MySQL serveru přijdete o commity za poslední dvě sekundy, přidejte do my.cnf tento řádek:

[cc lang=“bash“]
innodb_flush_log_at_trx_commit = 2
[/cc]

Nyní po commitu zapíše MySQL data do cache operačního systému, která je na disk zapisována v pravidelných intervalech. Aby se změny projevily je nutné restartovat MySQL server.

Použitý engine

Pokud nepoužíváte fulltext nebo nemáte tabulky jen pro čtení, nemá smysl o MyISAM ani uvažovat. Tento engine při zápisu nebo změně kteréhokoliv řádku celou tabulku zamyká. Musí se tedy čekat až se operace provede a pak teprve je možné z tabulky číst. I malé procento zápisů způsobuje propad ve výkonu. Také nejsou podporovány transakce, cizí klíče a další funkce, které jsou pro InnoDB samozřejmostí.

A co dál?

Můžete ušetřit paměť nastavením mysql.allow_persistent na Off, použitím lehčí verze http serveru (lighttpdnginx), smazat nevyužívané indexy, pohrát si s nastavením innodb_log_fi­le_size atd.

4 komentáře: „Optimalizace nastavení MySQL na VPS“

  1. Petr avatar
  2. Petr Suchopár avatar
    1. Petr Hložek avatar
      Petr Hložek

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *