Mysql che si blocca, oom killer, fuori memory, problemi di sintonizzazione?

Ho appena spostato tutti i miei siti web su un nuovo server con 4 GB di RAM. Quasi immediatamente, mysql ha iniziato a schiantarsi e, ad un certo punto, non è stato riavviato che ha causato una grave interruzione (dato che non ho notato fino a quando qualcuno mi ha indicato).

Ecco il log con i processi CRON rimossi: http://pastebin.com/9SAUBcFp (apache2 invocato oom-killer, errori di memory fuori, ecc.)

Nulla in df -h è più del 4% di utilizzo.

Ecco un'output di free -m

  total used free shared buffers cached Mem: 4002 2090 1911 0 168 1015 -/+ buffers/cache: 906 3095 Swap: 255 8 247 

Ecco un'output di mysqlreport

 __ Key _________________________________________________________________ Buffer used 849.00k of 16.00M %Used: 5.18 Current 2.99M %Usage: 18.71 Write hit 44.87% Read hit 98.84% __ Questions ___________________________________________________________ Total 198.55k 33.8/s QC Hits 147.94k 25.1/s %Total: 74.51 DMS 31.35k 5.3/s 15.79 Com_ 14.20k 2.4/s 7.15 COM_QUIT 5.07k 0.9/s 2.55 -Unknown 9 0.0/s 0.00 Slow 2 s 0 0/s 0.00 %DMS: 0.00 Log: ON DMS 31.35k 5.3/s 15.79 SELECT 27.65k 4.7/s 13.93 88.19 UPDATE 1.78k 0.3/s 0.89 5.66 INSERT 1.73k 0.3/s 0.87 5.51 DELETE 199 0.0/s 0.10 0.63 REPLACE 0 0/s 0.00 0.00 Com_ 14.20k 2.4/s 7.15 set_option 9.29k 1.6/s 4.68 change_db 4.63k 0.8/s 2.33 show_tables 260 0.0/s 0.13 __ SELECT and Sort _____________________________________________________ Scan 850 0.1/s %SELECT: 3.07 Range 398 0.1/s 1.44 Full join 0 0/s 0.00 Range check 0 0/s 0.00 Full rng join 0 0/s 0.00 Sort scan 1.01k 0.2/s Sort range 361 0.1/s Sort mrg pass 0 0/s __ Query Cache _________________________________________________________ Memory usage 15.09M of 16.00M %Used: 94.30 Block Fragmnt 2.31% Hits 147.94k 25.1/s Inserts 21.70k 3.7/s Insrt:Prune 2.86:1 2.4/s Hit:Insert 6.82:1 __ Table Locks _________________________________________________________ Waited 0 0/s %Total: 0.00 Immediate 35.51k 6.0/s __ Tables ______________________________________________________________ Open 400 of 400 %Cache: 100.00 Opened 5.55k 0.9/s __ Connections _________________________________________________________ Max used 9 of 151 %Max: 5.96 Total 5.07k 0.9/s __ Created Temp ________________________________________________________ Disk table 554 0.1/s Table 1.61k 0.3/s Size: 16.0M File 6 0.0/s __ Threads _____________________________________________________________ Running 1 of 1 Cached 7 of 8 %Hit: 99.82 Created 9 0.0/s Slow 0 0/s __ Aborted _____________________________________________________________ Clients 0 0/s Connects 5 0.0/s __ Bytes _______________________________________________________________ Sent 3.57G 607.2k/s Received 34.01M 5.8k/s __ InnoDB Buffer Pool __________________________________________________ Usage 98.28M of 127.98M %Used: 76.79 Read hit 99.98% Pages Free 1.90k %Total: 23.21 Data 5.61k 68.50 %Drty: 0.00 Misc 679 8.29 Latched 0 0.00 Reads 21.60M 3.7k/s From file 4.62k 0.8/s 0.02 Ahead Rnd 0 0/s Ahead Sql 0/s Writes 10.83k 1.8/s Flushes 5.27k 0.9/s Wait Free 0 0/s __ InnoDB Lock _________________________________________________________ Waits 0 0/s Current 0 Time acquiring Total 0 ms Average 0 ms Max 0 ms __ InnoDB Data, Pages, Rows ____________________________________________ Data Reads 5.57k 0.9/s Writes 7.95k 1.4/s fsync 3.10k 0.5/s Pending Reads 0 Writes 0 fsync 0 Pages Created 48 0.0/s Read 5.56k 0.9/s Written 5.27k 0.9/s Rows Deleted 190 0.0/s Inserted 242 0.0/s Read 7.47M 1.3k/s Updated 1.36k 0.2/s 

Ecco un'output di mysqltuner

 -------- General Statistics -------------------------------------------------- [--] Skipped version check for MySQLTuner script [OK] Currently running supported MySQL version 5.5.35-0+wheezy1-log [OK] Operating on 64-bit architecture -------- Storage Engine Statistics ------------------------------------------- [--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster [--] Data in MyISAM tables: 1005M (Tables: 335) [--] Data in InnoDB tables: 143M (Tables: 68) [--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17) [!!] Total fragmented tables: 76 -------- Security Recommendations ------------------------------------------- [OK] All database users have passwords assigned -------- Performance Metrics ------------------------------------------------- [--] Up for: 1h 28m 55s (154K q [28.899 qps], 4K conn, TX: 3B, RX: 25M) [--] Reads / Writes: 83% / 17% [--] Total buffers: 192.0M global + 2.7M per thread (151 max threads) [OK] Maximum possible memory usage: 597.8M (14% of installed RAM) [OK] Slow queries: 0% (0/154K) [OK] Highest usage of available connections: 5% (9/151) [OK] Key buffer size / total MyISAM indexes: 16.0M/264.4M [OK] Key buffer hit rate: 98.8% (77K cached / 912 reads) [OK] Query cache efficiency: 87.2% (116K cached / 133K selects) [!!] Query cache prunes per day: 5182 [OK] Sorts requiring temporary tables: 0% (0 temp sorts / 1K sorts) [OK] Temporary tables created on disk: 24% (427 on disk / 1K total) [OK] Thread cache hit rate: 99% (9 created / 4K connections) [!!] Table cache hit rate: 9% (400 open / 4K opened) [OK] Open file limit used: 61% (631/1K) [OK] Table locks acquired immediately: 100% (18K immediate / 18K locks) [!!] InnoDB data size / buffer pool: 143.3M/128.0M -------- Recommendations ----------------------------------------------------- General recommendations: Run OPTIMIZE TABLE to defragment tables for better performance MySQL started within last 24 hours - recommendations may be inaccurate Increase table_cache gradually to avoid file descriptor limits Variables to adjust: query_cache_size (> 16M) table_cache (> 400) innodb_buffer_pool_size (>= 143M) 

Dato le "variables da adattare" sopra, ho apportto le seguenti modifiche a /etc/mysqld/my.cnf:

  • Aggiunta linea: key_buffer_size = 280M
  • Aggiunta linea: innodb_buffer_pool_size = 150M
  • table_cache non table_cache e modificato a 100 (che continuerò ad aumentare continuamente fino a oltre 400)
  • Ha modificato il valore di query_cache_size da 16M a 32M

Ci sono problemi di quiete che io sto trascurando o qualcosa che dovrei fare?

  • Le performance della networking ESXi 5 sono lente
  • Prestazioni sul disco rigido su Azure Virtual Machine
  • Differenti comportmenti della cache di pagina Linux per i server che eseguono lo stesso lavoro
  • Differenze di performance tra SQL Server 2008 Standard e Enterprise
  • Richieste molto basse / secondo con installazione NGINX fresca
  • Associare le performance alle tabelle MyISAM e InnoDB
  • Devo aspettarmi un grande aumento delle performance di Oracle in termini di gestione di richieste multiple che passano da singolo a dual core?
  • Le performance NFS di Linux rispetto alle altre FS
  • 3 Solutions collect form web for “Mysql che si blocca, oom killer, fuori memory, problemi di sintonizzazione?”

    Non hai quasi nessun swap (256M), come misura temporanea, aggiungerei più scambi e ruotare la swappiness (vm.swappiness) in modo da evitare inutili I / O attendere. SWAP è lento, ma può mantenere il tuo PIDS da crash. Inoltre, indica i tuoi OOM e controlla i timestamp per vedere se c'è nessuna regolarità con gli arresti nel tempo. Ho dovuto sparare attraverso alcuni lavori di cron poco elaborati nel mio tempo. Vorrei assicurarsi di avere alless 2 GB di swap se hai <8 GB di RAM. Come ho detto, lo scambio di cose rallenterà, ma è meglio che schiantare il DB e perdere le transactions e wherer controllare / riparare le tabelle all'avvio.

    Sembrerebbe essere la conclusione logica di aggiungere più memory.

    BTW, non hai mai parlato se consolasti i tuoi siti web da una serie di macchine diverse a uno o che tutti i siti web funzionavano su un vecchio server (di quanta memory). Queste informazioni sarebbero MOLTO utili ma comunque penso che hai solo bisogno di più memory.

    Immagino che il tuo problema è in realtà troppi clienti Apache per la memory del tuo server. Quando si ottiene un grosso surge nel traffico i processi di Apache si accumulano alla fine usando tutta la RAM. Ciò obbliga il sistema operativo a iniziare a scambiare forzatamente i processi dentro e fuori che tende a rendere le cose molto peggiori. Alla fine la tua memory di scambio esaurisce e il sistema operativo uccide qualunque cosa pensa sia meglio … in questo caso MySQL in quanto utilizza un sacco di memory. Notare che aumentare la memory di scambio sarà solo il ritardo dell'inevitabile arresto anomalo.

    Vorrei iniziare riducendo i MAXCLIENTS di Apache a un valore più ragionevole basato sulla capacità del tuo server. È ansible effettuare una stima approssimativa eseguendo in top e guardando le colonne RES/SHR per i processi httpd . La differenza tra di loro è di gran lunga quanto utilizza each process figlio. Ad esempio, sui miei server l'utilizzo della memory media per bambino è di 40 MB e voglio che Apache utilizzi solo 3 GB, quindi i miei MAXCLIENTS sono impostati su 75 (3000/40). È ansible giocare con questo valore e alcune delle altre impostazioni di connessione Apache un po 'come necessario per impedire a Apache di utilizzare tutta la RAM e di iniziare a colpire lo swap.

    Puoi anche guardarla dalla prospettiva di ciò che causa il grande numero di clienti Apache. Se si tratta di un vero aumento di traffico / spike, probabilmente hai bisogno di un server più big o di più server o aggiunge un livello di caching per ridurre il carico su Apache. Se il tuo server è troppo lento per gestire il numero normale di richieste in entrata, vuoi ridurre i MAXCLIENTS di Apache a un livello in grado di gestire senza richiedere il backup. O forse c'è un problema di server, app o database che sta causando le cose a bloccarsi oa congelare che deve essere trovato e risolto.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.