Puncte:0

Utilizare ridicată a procesorului de către Apache/MySQL

drapel cn
a b

Am o problemă cu utilizarea CPU pe site-ul web care utilizează WordPress, Apache și MySQL. În timpul zilei, din când în când, utilizarea procesorului de către MySQL și Apache crește până la 2400% (am 24 de nuclee în total), serverul îngheață, încărcarea medie urcă până la 24.

Recent, a fost puțin mai mult trafic decât de obicei, dar chestia asta nu ar trebui să fie permanentă, nu? Am actualizat nucleul, baza de date, bibliotecile, am repornit de multe ori. Și totuși, îngheață. M-am uitat la lista de procese a DB, dar nu este nimic extraordinar. În baza de date, există cantități destul de mari de date. Cu doar câteva săptămâni în urmă a funcționat bine, iar acum nu mai funcționează. Deci, nu ar trebui să fie interogări neoptimizate.

Care pot fi cauzele unui astfel de comportament?

Actualizați:

rezultatul A) AFIȘAȚI STARE GLOBALĂ CA „com_%r%_table”;

+-----------------------+-------+
| Nume_variabilă | Valoare |
+-----------------------+-------+
| Com_alter_table | 5 |
| Com_create_table | 34 |
| Com_drop_table | 0 |
| Com_rename_table | 0 |
| Com_show_create_table | 0 |
+-----------------------+-------+
5 rânduri în set (3,04 sec)

B) AFIȚI STAREA GLOBALĂ CA „uptime%”;

+---------------------------+--------+
| Nume_variabilă | Valoare |
+---------------------------+--------+
| Uptime | 455524 |
| Uptime_since_flush_status | 455524 |
+---------------------------+--------+
2 rânduri în set (0,01 sec)

C) AFIȚI STAREA GLOBALĂ CA „%dirty%”;

+--------------------------------+-------+
| Nume_variabilă | Valoare |
+--------------------------------+-------+
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
+--------------------------------+-------+
2 rânduri în set (0,00 sec)

p.s. Mai am probleme cu serverul. Trebuia să schimb setul de caractere dintr-una dintre bazele de date și a durat puțin mai mult de o zi pentru a termina, cu doar 400 000 de rânduri. Înainte, era nevoie de ceva timp, dar nu atât de mult. Mă întrebam, s-ar putea, că după atacul DDOS pot exista unele modificări la baza de date, astfel încât să funcționeze mai rău?

Actualizare 2:

rezultate mysqltuner:

[--] S-a omis verificarea versiunii pentru scriptul MySQLTuner
[OK] Conectat folosind acreditările din contul de întreținere Debian.
[OK] În prezent rulează versiunea MySQL acceptată 8.0.26-0ubuntu0.20.04.2
[OK] Funcționează pe arhitectură pe 64 de biți
 
-------- Fișier jurnal Recomandări --------------------------------------- ---------------------------
[OK] Fișierul jurnal /var/log/mysql/error.log există
[--] Fișier jurnal: /var/log/mysql/error.log(0B)
[--] Fișierul jurnal /var/log/mysql/error.log este gol. Presupunând rotire a jurnalului. Utilizați --server-log={fișier} pentru fișierul explicit
 
-------- Statistici motor de stocare ---------------------------------------- --------------------------
[--] Stare: +ARHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +MyISAM +PERFORMANCE_SCHEMA 
[--] Date în tabelele InnoDB: 262.4G (Tabelele: 179)
[OK] Total tabele fragmentate: 0
 
-------- Măsuri de performanță a analizei --------------------------------------- -----------------------
[--] innodb_stats_on_metadata: OFF
[OK] Nu există actualizări ale statisticilor în timpul interogării INFORMATION_SCHEMA.
 
-------- Recomandări de securitate ---------------------------------------- --------------------------
[--] Omis din cauza caracteristicii neacceptate pentru MySQL 8
 
-------- Recomandări de securitate CVE --------------------------------------- -----------------------
[OK] NICIUN CVE DE SECURITATE GĂSIT PENTRU VERSIUNEA DVS
 
-------- Măsuri de performanță ---------------------------------------- --------------------------------
[--] Până la: 5d 11h 4m 6s (15M q [31,945 qps], 191K conexiune, TX: 80G, RX: 2G)
[--] Citiri / Scrieri: 99% / 1%
[--] Înregistrarea binară este activată (MOD GTID: OFF)
[--] Memorie fizică: 31.4G
[--] Memoria MySQL maximă: 9.8G
[--] Altă memorie de proces: 0B
[--] Buffer-uri totale: 176,0 M globale + 65,1 M per thread (max. 151 fire)
[--] P_S Utilizare maximă a memoriei: 72B
[--] Galera GCache Utilizare maximă a memoriei: 0B
[OK] Utilizarea maximă a memoriei atinse: 9,8G (31,14% din RAM instalată)
[OK] Utilizare maximă posibilă a memoriei: 9,8G (31,14% din RAM instalată)
[OK] Utilizarea generală posibilă a memoriei cu alte procese este compatibilă cu memoria disponibilă
[OK] Interogări lente: 0% (0/15M)
[!!] Cea mai mare utilizare a conexiunii: 100% (151/151)
[OK] Conexiuni întrerupte: 0,09% (174/191712)
[!!] rezoluția numelui este activă: se face o rezoluție inversă a numelui pentru fiecare conexiune nouă și poate reduce performanța
[--] Cache-ul de interogări a fost eliminat în MySQL 8
[OK] Sortări care necesită tabele temporare: 0% (0 sortări temporale / 5M sortări)
[OK] Nicio unire fără indexuri
[OK] Tabelele temporare create pe disc: 0% (0 pe disc / 2M în total)
[OK] Rata de accesare a memoriei cache a firelor: 92% (15K create / 191K conexiuni)
[OK] Rata de accesări în memoria cache a tabelului: 99% (21 milioane de accesări / 21 milioane de solicitări)
[OK] table_definition_cache(2000) este mai mare decât numărul de tabele(506)
[OK] Limită de fișiere deschise utilizată: 0% (6/10K)
[OK] Blocări de masă achiziționate imediat: 100% (9 blocări imediate / 9 blocări)
[OK] Acces la memoria cache Binlog: 99,57% (25538 memorie / 25647 total)
 
-------- Schema de performanță ---------------------------------------- ---------------------------------
[--] Memorie folosită de P_S: 72B
[--] Schema de sistem este instalată.
 
-------- Măsuri ThreadPool ---------------------------------------- ---------------------------------
[--] Statul ThreadPool este dezactivat.
 
-------- Măsuri MyISAM ---------------------------------------- -------------------------------------
[--] Metricurile MyISAM sunt dezactivate pe ultimele versiuni MySQL.
 
-------- InnoDB Metrics ---------------------------------------- -------------------------------------
[--] InnoDB este activat.
[--] Concurența firelor InnoDB: 0
[OK] Fișierul InnoDB per tabel este activat
[!!] Pool de buffer InnoDB / dimensiunea datelor: 128.0M/262.4G
[!!] Raport dimensiunea fișierului jurnal InnoDB / dimensiunea pool-ului buffer InnoDB (75%): 48.0M * 2/128.0M ar trebui să fie egal cu 25%
[OK] Instanțele pool-ului de buffer InnoDB: 1
[--] Număr de bucăți de grup de tampon InnoDB: 1 pentru 1 instanță(e) de grup de tampon
[OK] Innodb_buffer_pool_size aliniat cu Innodb_buffer_pool_chunk_size și Innodb_buffer_pool_instances
[OK] Eficiența tamponului de citire InnoDB: 98,29% (925392031 accesări/ 941450541 în total)
[!!] Eficiența jurnalului de scriere InnoDB: 309,39% (25100125 accesări/ 8112662 în total)
[!!] Așteptări în jurnalul InnoDB: 0,00% (65 așteptări / 33212787 scrieri)
 
-------- Aria Metrics ---------------------------------------- --------------------------------------
[--] Aria Storage Engine nu este disponibil.
 
-------- Măsuri TokuDB ---------------------------------------- -------------------------------------
[--] TokuDB este dezactivat.
 
-------- XtraDB Metrics ---------------------------------------- -------------------------------------
[--] XtraDB este dezactivat.
 
-------- Galera Metrics ---------------------------------------- -------------------------------------
[--] Galera este dezactivată.
 
-------- Măsuri de replicare ---------------------------------------- --------------------------------
[--] Galera Replicare sincronă: NU
[--] Niciun sclav(i) de replicare pentru acest server.
[--] Format binlog: ROW
[--] Suport XA activat: ACTIVAT
[--] Replicare semi-sincronă Master: Neactivat
[--] Replicare semi-sincronă Slave: Neactivat
[--] Acesta este un server independent
 
-------- Recomandări ----------------------------------------- -----------------------------------
Recomandări generale:
    Reduceți sau eliminați conexiunile persistente pentru a reduce utilizarea conexiunii
    Configurați-vă conturile numai cu ip sau subrețele, apoi actualizați configurația cu skip-name-resolve=1
    Înainte de a schimba innodb_log_file_size și/sau innodb_log_files_in_group, citiți asta: *link*
Variabile de ajustat:
    max_connections (> 151)
    wait_timeout (< 28800)
    interactive_timeout (< 28800)
    innodb_buffer_pool_size (>= 262.4G) dacă este posibil.
    innodb_log_file_size ar trebui să fie (=16M) dacă este posibil, astfel încât dimensiunea totală a fișierelor jurnal InnoDB este egală cu 25% din dimensiunea pool-ului de buffer.
    innodb_log_buffer_size (>= 16M)

Actualizare 3:

Astăzi serverul meu a înghețat din nou. Procesul care a supraîncărcat CPU a fost apache2. Am reușit să opresc serviciul. Și deodată totul a început să funcționeze fără probleme. Am încercat să fac backup pentru baza de date, cea cu multe rânduri, și a funcționat foarte bine. Dar, după ceva timp, totul a înghețat din nou: utilizarea CPU de către unele procese a fost la 2400%, media de încărcare a depășit 24. Deci, sugestia mea, că nu apache-ul este cel care încarcă procesorul, nici MySQL. Unele dintre procese, cum ar fi htop sau gzip, pe care le folosesc pentru backup, au, de asemenea, o utilizare mare a procesorului, din când în când. Ce ar putea fi atunci? Ar putea fi acesta rezultatul unui atac DDOS și, dacă da, cum îl pot remedia?

Gerrit avatar
drapel cn
Rularea `perf top` în aceste cazuri de CPU ridicat ar putea fi un început. Lizibilitatea ar fi ajutată enorm prin instalarea pachetelor de simboluri de depanare Apache, PHP și Mysql pentru platforma dumneavoastră. Dacă problema se află în baza de date, atunci `mysqladmin extended-status` poate fi util. Vedeți în special dacă create_tmp_disk_tables sau sort_merge_passes crește mult.
Wilson Hauck avatar
drapel jp
Ați putea posta rezultate TEXT din A) AFIȚI STAREA GLOBALĂ CA „com_%r%_table”; și B) AFIȚI STAREA GLOBALĂ CA „uptime%”; și C) AFIȘAȚI STAREA GLOBALĂ CA „%dirty%”; pentru analiza? S-ar putea să existe indicii în rezultatele tale. Bun venit la serverfault.
a b avatar
drapel cn
a b
@WilsonHauck Am adăugat rezultatele solicitate
Michael Hampton avatar
drapel cz
Vă rugăm să postați rezultatul complet al mysqltuner.pl
a b avatar
drapel cn
a b
@MichaelHampton a adăugat ieșirea mysqltuner
Wilson Hauck avatar
drapel jp
@ab Rezultatele dvs. din informațiile selective SHOW GLOBAL STATUS elimină deplasarea tabelului DROP/CREATE, care poate provoca blocări momentane. Nu există pagini DIRTY care să cauzeze probleme sau întârzieri. Va solicita informații suplimentare pentru a continua să caute datele din instanța dvs.
Wilson Hauck avatar
drapel jp
Cerere de informații suplimentare. Există dispozitive SSD sau NVME pe serverul MySQL Host? Postați pe pastebin.com și distribuiți linkurile. Din rădăcina dvs. de conectare SSH, rezultă text de: B) AFIȚI STAREA GLOBALĂ; după minim 24 de ore UPTIME C) AFIȘAȚI VARIABILELE GLOBALE; D) AFIȚI LISTA COMPLETĂ DE PROCES; E) STARE; nu AFIȚI STARE, doar STARE; ȘI informații opționale foarte utile, dacă sunt disponibile includ - htop SAU top pentru majoritatea aplicațiilor active, ulimit -a pentru o listă de limite Linux/Unix, iostat -xm 5 3 pentru IOPS în funcție de dispozitiv și număr de nuclee/procesoare, pentru analiza de reglare a sarcinii de lucru a serverului pentru a oferi sugestii.
a b avatar
drapel cn
a b
@WilsonHauck A) Îmi pare rău, nu prea știu despre asta și nu sunt sigur cum să o verific. B) AFIȚI STARE GLOBALĂ; https://pastebin.com/hafPj9f3.C) AFIȘAȚI VARIABILELE GLOBALE; https://pastebin.com/WSEYa9EL. D) AFIȚI LISTA COMPLETĂ DE PROCES; https://pastebin.com/LYhVkDR6. Interogarea audio_records este copia de rezervă a bazei de date. E) STARE; https://pastebin.com/ziTNcE0Z. htop - https://ibb.co/0sTy30r. ulimit -a - https://pastebin.com/F9XnG7hZ. iostat - https://ibb.co/5YrzvbJ
a b avatar
drapel cn
a b
De asemenea, tocmai am observat, chiar dacă atunci când media de încărcare a fost mai mică de 5, iar utilizarea generală a procesorului a fost destul de scăzută, site-ul a avut încă mult mai mult timp pentru a răspunde, decât de obicei. Unele dintre solicitări au fost anulate din cauza expirării timpului
Wilson Hauck avatar
drapel jp
@ab Analiza datelor dvs. este în curs. Sper să postez sugestii în următoarele 12 ore. Mulțumesc.
Puncte:1
drapel jp

Rata pe secundă = RPS

Sugestii de luat în considerare pentru secțiunea dvs. my.cnf [mysqld].

innodb_buffer_pool_size=22G # de la 128M pentru a vă adapta mai bine 262G de date
max_connections=256 # din 151, deoarece toate conexiunile au fost folosite
thread_cache_size=150 # de la 9 pentru a reduce threads_created RPhr de 111
innodb_log_file_size=4G # de la 50M pentru a suporta mai mult de o oră înainte de rotație
innodb_log_buffer_size=1G # de la 16M pentru a suporta ~ 30 de minute înainte de a scrie pe media

Performanța ar trebui îmbunătățită semnificativ. Există mai multe oportunități de îmbunătățire a performanței. Vizualizați profilul pentru informații de contact și scripturi utilitare descărcabile gratuit pentru a îmbunătăți performanța.

a b avatar
drapel cn
a b
Multumesc pentru sugestii. Le-am adăugat și deocamdată performanța s-a îmbunătățit. Dar utilizarea memoriei a crescut. Am doar 32 Gb de memorie, iar utilizarea maximă a MySQL a fost de 32 Gb. Când am încercat să optimizez tabelul, a supraîncărcat memoria. Acum memoria virtuală a mysqld este pe 31,4 Gb. Dar problema rămâne aceeași. Am găsit o modalitate de a o reproduce. Când încerc să deschid 6-10 pagini în același timp, utilizarea procesorului crește. În lista de procese există o mulțime de procese de dormit, care solicită date din baza de date a site-ului web. Nu stau acolo prea mult timp, cel mai mult timp pe care l-am văzut este de ~500 de secunde.
Wilson Hauck avatar
drapel jp
Topul dvs. postat de acum câteva zile arată multe procese cu un timp mai mare de 1 oră, când doriți să discutați despre ele, contactați-vă. Dacă sugestiile au fost pozitive, luați în considerare un vot pozitiv sau acceptați, vă rugăm. Vă rugăm să postați interogarea care deschide 6-10 pagini.
Wilson Hauck avatar
drapel jp
@ab Ați putea posta rezultate TEXT pe pastebin.com rezultatele arată starea schemei de performanță a motorului; Mulțumesc.
a b avatar
drapel cn
a b
Iată „show engine performance_schema status;” ieșire: https://pastebin.com/yKjjqZPt. După aceea, am dezactivat MySQL și problema era încă acolo, nu sunt sigur că aceasta este problema DB. Trebuie să fie ceva la un nivel mai profund.
Wilson Hauck avatar
drapel jp
Ultima linie a postării indică 228 M de RAM utilizată pentru a stoca informațiile performance_schema. Cu 32G, nu este o problemă. Când veți avea timp să discutați despre htop-ul dvs. cu procesele care rulează de ore întregi. Găzduiți software-ul zabbix pe același server? Software-ul zabbix nu ar trebui să fie NICIODATĂ găzduit pe un server de producție.
Puncte:0
drapel us

Este foarte greu de spus, dar spui că rulezi WordPress și că atinge vârful celor 24 de nuclee la 100%, doar amintește-ți că o singură interogare nu poate folosi doar un fir la momentul respectiv.

Deci ceva sună ca performanțe foarte proaste de interogare și nu direct în serverul dvs. web Apache, ați încercat pluginul „WP Redis Cache” pentru a stoca în cache interogările dvs. în Redis pentru a salva căutarea interogărilor?

Următorul plugin pe care îl puteți încerca să îl instalați este „Query Monitor”, acesta vă va arăta interogările SQL pe care le apelați din mers, este un instrument de depanare foarte bun pentru WordPress.

Amintiți-vă, dacă vă dezvoltați propriile plugin-uri în WordPress, ar trebui să aveți grijă de Redis, folosind funcțiile încorporate pentru a stoca în cache rezultatul interogării.

Și la sfârșitul acestui mod de depanare, vă voi recomanda să activați interogarea jurnal lent pentru MySQL pentru tot ce depășește 1 secundă, este posibil să găsiți interogări unde lipsește/lipsește indexul coloanelor.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.