Jak rozwiązać zbyt wiele połączeń i błąd krytyczny w mysql uruchomionym na vps

9

Korzystam z aplikacji PHPlist na moim serwerze linode, jednocześnie uruchamiając 12 skryptów PHP, z których każdy otwiera połączenie MySQL. Teraz, kiedy uzyskuję dostęp do listy PHP, często pokazuje ten błąd:

Błąd krytyczny: Niestety serwer jest obecnie zbyt zajęty, spróbuj ponownie później.

Kiedy próbuję uzyskać dostęp do phpMyAdmin, pokazuje mi błąd # 1040. Dane wyjściowe moich skryptów PHP uruchamianych przez cronzadania pokazują:

Ostrzeżenie PHP: mysqli_connect (): (HY000 / 1040): Zbyt wiele połączeń

Używam stosu LAMP na serwerze z phpMyAdmin; topwyjściowy w programach końcowych mysqldwykorzystujących 100-130% CPU. Kiedy próbuję rozwiązać ten problem, mam kilka wskazówek:

  • Zwiększ zmienną max_connection: używam 200 (domyślnie 100)
  • Pamięć podręczna otwartej tabeli: 512 (domyślnie 400)

Jest wiele zmiennych, które należy ustawić, ale nie mogę określić, które z nich są określone, otrzymuję referencje od: zbyt wielu połączeń i http://dev.mysql.com/doc/refman/5.5/en/table-cache. HTML

Ale zgodnie z moim użyciem, jak zwiększyć pamięć i jaka jest maksymalna trudna dla mnie pamięć.

Na moim serwerze używam około 12 skryptów PHP, aplikacji PHPlist do wysyłania e-maili oraz dużej bazy danych do rejestracji użytkowników.

Uprzejmie pomóż mi rozwiązać ten problem.

Shashank
źródło

Odpowiedzi:

12

Najpierw musisz uruchomić to zapytanie:

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

Spowoduje to wyświetlenie listy wszystkich użytkowników, którzy mają uprawnienia SUPER . Większość użytkowników przetwarzających aplikacje związane z bazą danych nie wymaga tego uprawnienia. Zgodnie z Dokumentacją MySQL osoby z uprawnieniami SUPER mogą wykonywać następujące czynności:

  • Uruchom CHANGE MASTER TO, aby kontrolować współrzędne replikacji
  • KILL lub mysqladmin killzabić wątki należące do innych kont
  • WYPEŁNIJ DZIENNIKI BINARNE, aby systematycznie usuwać dzienniki binarne
  • Wprowadź zmiany konfiguracji za pomocą SET GLOBAL, aby zmodyfikować globalne zmienne systemowe
  • polecenie debugowania mysqladmin
  • włączanie lub wyłączanie rejestrowania
  • przeprowadzanie aktualizacji, nawet jeśli włączona jest zmienna systemowa * read_only *
  • uruchamianie i zatrzymywanie replikacji na serwerach podrzędnych
  • specyfikacja dowolnego konta w atrybucie DEFINER przechowywanych programów i widoków
  • TUTAJ JEST NAJWAŻNIEJSZY DLA TWOJEGO PROBLEMU: Umożliwia połączenie (jeden raz), nawet jeśli limit połączenia kontrolowany przez zmienną systemową max_connections jest osiągnięty.

Musisz zalogować się jako root @ localhost i odebrać uprawnienia SUPER w następujący sposób:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

Gdy to zrobisz, za każdym razem, gdy wszyscy użytkownicy zalewają połączenia mysql, tylko root@localhostlogować się. W końcu, jeśli wszyscy i jego babcia mieliby SUPER przywilej, uniemożliwiłoby to root@localhostkiedykolwiek połączenie przed wszystkimi innymi. Jeśli maksymalna liczba połączeń wynosi 200 i musisz ją podnieść do 300 bez konieczności ponownego uruchamiania mysqld, możesz dynamicznie zwiększać liczbę połączeń za pomocą tego polecenia:

mysql> SET GLOBAL max_connections = 300;

Umożliwi to natychmiastowe zwiększenie liczby połączeń, ale nie tylko arbitralnie zwiększy liczbę pod wpływem kaprysu. Musisz upewnić się, że mysql ma wystarczającą ilość pamięci RAM, aby pomieścić wzrost.

CAVEAT: Jeśli zmienisz dynamicznie max_connections na 300, umieść go w /etc/my.cnf

[mysqld]
max_connections=300

Możesz uruchomić mysqltuner.pl na swoim serwerze MySQL DB. Jeśli go nie masz, uruchom następujące polecenie:

cd
wget mysqltuner.pl
perl mysqltuner.pl

Trzecia linia pod Performance Metrics ma to

-------- 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)

Widzisz 5,4 mln na wątek? To jest mnożone przez max_connections. W tym przykładzie byłoby to maksymalnie około 10,8 GB pamięci RAM. Dlatego za każdym razem, gdy podbijasz max_connections, powinieneś uruchomić mysqltuner.pl i sprawdzić, czy naciskasz system operacyjny za dużo pamięci.

W każdym razie ograniczenie, kto ma uprawnienia SUPER, daje takim użytkownikom możliwość złagodzenia zalania mysqld za pomocą DB Connections.

RolandoMySQLDBA
źródło
pojawia się ten błąd podczas próby użycia perla mysqltuner.pl „Próbowano użyć danych logowania z konta serwisowego Debiana, ale się nie udało”.
Shashank,
Próbuję tego na moim lokalnym serwerze Ubuntu, pokazuje maksymalne wykorzystanie pamięci, ale na moim vps pokazuje błąd i nie mogę się zalogować w phpmyadmin, ale z powodzeniem loguję się w terminalu mysql
Shashank
To polecenie cmd wget mysqltuner.plpobrało plik index.html, ale był to plik perla, więc zmieniłem jego nazwę na mysqltuner.pl i następne polecenie cmd perl mysqltuner.pldziałało.
MotsManish
2
  1. Zmienna globalna max_connectionsokreśla maksymalną liczbę równoczesnych połączeń z MySQL. Upewnij się, że masz wysoką wartość dla tej zmiennej. Możesz zwiększyć tę wartość do 300 lub 400 i spróbować ponownie uruchomić MySQL po tych ustawieniach.
  2. Zaprojektuj aplikację tak, aby połączenie MySQL było otwarte przez bardzo krótki czas.
  3. Powinieneś również sprawdzić, czy kod klienta nie korzysta z trwałych połączeń (takich jak mysql_pconnect ()) w niewłaściwy sposób.

Wykonaj także Flush status;polecenie na serwerze MySQl, aby zmniejszyć tę wartość.

Mam nadzieję, że te sugestie pomogą.

Mahesh Patil
źródło
0

Sprawdź, czy dysk jest pełny, może to powodować ten sam błąd:

df -h

pokaże ci pozostałe miejsce na każdej partycji, prawdopodobnie musisz sprawdzić partycję root /(lub / var / w przypadku, gdy masz do tego dodatkową partycję):

df -h /
rubo77
źródło