it-swarm-eu.dev

Jak vyřešit příliš mnoho připojení a fatální chyby v mysql běžícím na vps

Na svém linodovém serveru provozuji aplikační PHPlist a současně spouštím 12 PHP skripty, z nichž každý otevírá spojení MySQL. Když nyní přistupuji k PHPlistu, často se zobrazuje tato chyba:

Závažná chyba: Litujeme, server je v současné době příliš zaneprázdněn, zkuste to prosím znovu později.

Když se pokouším získat přístup k phpMyAdmin, ukazuje mi chybu # 1040. Výstup mých PHP skriptů, které běží skrze cron úloh ukazuje:

Upozornění PHP: mysqli_connect (): (HY000/1040): Příliš mnoho připojení

Používám zásobník LAMP na serveru s phpMyAdmin; výstup top zobrazuje v terminálu mysqld pomocí 100-130% CPU. Když se pokouším tento problém vyřešit, dostal jsem několik vodítek:

  • Zvýšení proměnné max_connection: Používám 200 (ve výchozím nastavení 100)
  • Mezipaměť otevřené tabulky: 512 (ve výchozím nastavení 400)

Existuje mnoho proměnných, které lze nastavit, ale nemůžu určit, jaké konkrétní jsou, dostávám nějaké reference od: příliš mnoho spojení a http://dev.mysql.com/doc /refman/5.5/en/table-cache.html

Ale podle mého použití, jak zvýšit paměť a jaká je pro mě maximální paměť obtížná.

Na mém serveru používám kolem 12 PHP skripty, PHPlist aplikaci pro odesílání e-mailů a hlavní databázi pro registraci uživatelů).

Laskavě mi pomozte tento problém vyřešit.

9
Shashank

Nejprve musíte spustit tento dotaz:

SELECT user,Host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',Host) <> '[email protected]';

Zobrazí se seznam všech uživatelů, kteří mají SUPER privilegium . Většina uživatelů, kteří provádějí zpracování DB související s aplikací, toto oprávnění nevyžadují. Podle Dokumentace MySQL mohou ti, kteří mají oprávnění SUPER, dělat následující:

  • Spusťte CHANGE MASTER TO pro řízení souřadnic replikace
  • KILL or mysqladmin kill zabít vlákna patřící k jiným účtům
  • PURGE BINARY LOGS pro systematické mazání binárních protokolů
  • Proveďte změny konfigurace pomocí SET GLOBAL k úpravě globálních systémových proměnných
  • příkaz ladq mysminladmin
  • povolení nebo zakázání protokolování
  • provádění aktualizací, i když je povolena systémová proměnná * read_only *
  • spuštění a zastavení replikace na slave serverech
  • specifikace libovolného účtu v atributu DEFINER uložených programů a pohledů
  • ZDE IS NEJDŮLEŽITĚJŠÍ JEDEN PRO VAŠE PROBLÉM: : Umožňuje vám připojení (jednou), i když je limit připojení řízeno systémovou proměnnou max_connections .

Budete se muset přihlásit jako root @ localhost a zrušit SUPER oprávnění následujícím způsobem:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',Host) <> '[email protected]';
FLUSH PRIVILEGES;

Jakmile to uděláte, kdykoli všichni uživatelé zaplaví připojení mysql, pouze [email protected] se může přihlásit. Koneckonců, kdyby všichni a jeho babička měli SUPER privilegium, toto by znamenalo [email protected] od navázání spojení před ostatními. Pokud je max_connections na 200 a je třeba jej zvýšit na 300 bez nutnosti restartovat mysqld, můžete dynamicky zvýšit max_connections tímto příkazem:

mysql> SET GLOBAL max_connections = 300;

To umožní okamžité další připojení, ale nejen to svévolné zvýšení počtu rozmarů. Musíte se ujistit, že mysql má dost RAM), aby se přizpůsobilo zvýšení.

CAVEAT: Pokud dynamicky změníte max_connections na 300, vložte jej do souboru /etc/my.cnf

[mysqld]
max_connections=300

Na serveru MySQL DB Server můžete spustit mysqltuner.pl. Pokud jej nemáte, spusťte následující:

cd
wget mysqltuner.pl
Perl mysqltuner.pl

Třetí řádek v části Metriky výkonu má toto

-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)

Vidíte 5,4M na vlákno? To se vynásobí max_connections. V tomto příkladu to bude maximum asi 10,8 G RAM. Proto pokaždé, když narážíte na max_connections, měli byste spustit mysqltuner.pl a zkontrolovat, zda stisknete OS pro příliš mnoho paměti.

V každém případě omezení toho, kdo má SUPER oprávnění, dává těmto uživatelům příležitost zmírnit záplavy mysqld pomocí DB Connections.

12
RolandoMySQLDBA
  1. Globální proměnná max_connections určuje maximální počet souběžných připojení k MySQL. Ujistěte se, že máte pro tuto proměnnou vysokou hodnotu. Tuto hodnotu můžete zvýšit na 300 nebo 400 a po tomto nastavení zkuste restartovat MySQL.
  2. Navrhněte svou aplikaci tak, aby připojení MySQL zůstalo otevřené po velmi krátkou dobu.
  3. Měli byste také zkontrolovat, že klientský kód nesprávně nepoužívá perzistentní připojení (například mysql_pconnect ()).

Spustit také Flush status; příkaz na serveru MySQl ke snížení této hodnoty.

Doufám, že tyto návrhy pomohou.

2
Mahesh Patil

Zkontrolujte, zda je disk plný, může to způsobit stejnou chybu:

df -h

zobrazí zbývající místo v každém oddílu, pravděpodobně budete muset zkontrolovat kořenový oddíl / (nebo/var/v případě, že na to máte zvláštní oddíl):

df -h /
0
rubo77