Elevato utilizzo del tempo di sistema della CPU sul server MySQL


9

Un po 'di retroscena, qualche tempo fa abbiamo iniziato a sperimentare un elevato tempo di sistema della CPU su uno dei nostri database MySQL. Questo database soffriva anche di un elevato utilizzo del disco, quindi abbiamo pensato che quelle cose fossero connesse. E poiché avevamo già in programma di migrarlo su SSD abbiamo pensato che avrebbe risolto entrambi i problemi.

Mi ha aiutato ... ma non per molto.

Per un paio di settimane dopo la migrazione, il grafico della CPU è stato così: buon grafico del carico della cpu

Ma ora torniamo a questo: grafico di caricamento della CPU non valido

Ciò è accaduto dal nulla, senza cambiamenti apparenti nel carico o nella logica dell'applicazione.

Statistiche DB:

  • Versione MySQL - 5.7.20
  • OS - Debian
  • Dimensione DB - 1,2 TB
  • RAM - 700 GB
  • Core della CPU - 56
  • Peek load - circa 5kq / s in lettura, 600q / s in scrittura (anche se le query selezionate sono spesso piuttosto complesse)
  • Discussioni - 50 in esecuzione, 300 connesse
  • Ha circa 300 tavoli, tutti InnoDB

Configurazione MySQL:

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /opt/mysql-data
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
explicit_defaults_for_timestamp

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

log-error = /opt/mysql-log/error.log

# Replication

server-id = 76

gtid-mode = ON
enforce-gtid-consistency = true

relay-log = /opt/mysql-log/mysql-relay-bin
relay-log-index = /opt/mysql-log/mysql-relay-bin.index
replicate-wild-do-table = dbname.%

log-bin = /opt/mysql-log/mysql-bin.log
expire_logs_days = 7
max_binlog_size = 1024M
binlog-format = ROW
log-bin-trust-function-creators = 1
log_slave_updates = 1

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/

# Here goes

skip_name_resolve = 1
general_log = 0
slow_query_log = 1
slow_query_log_file = /opt/mysql-log/slow.log
long_query_time = 3

max_allowed_packet = 16M
max_connections = 700
max_execution_time = 200000

open_files_limit = 32000
table_open_cache = 8000
thread_cache_size = 128
innodb_buffer_pool_size = 550G
innodb_buffer_pool_instances = 28
innodb_log_file_size = 15G
innodb_log_files_in_group = 2
innodb_flush_method = O_DIRECT

max_heap_table_size = 16M
tmp_table_size = 128M
join_buffer_size = 1M
sort_buffer_size = 2M

innodb_lru_scan_depth = 256

query_cache_type = 0
query_cache_size = 0

innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:30G 

Altre osservazioni

perf del processo mysql durante il carico di picco:

68,31%    68,31%  mysqld  [kernel.kallsyms]    [k] _raw_spin_lock                                                                                                                                                                                                        
   - _raw_spin_lock                                                                                                                                                                                                                                                          
      + 51,63% 0x7fd118e9dbd9                                                                                                                                                                                                                                                
      + 48,37% 0x7fd118e9dbab                                                                                                                                                                                                                                                
+   37,36%     0,02%  mysqld  libc-2.19.so         [.] 0x00000000000f4bd9                                                                                                                                                                                                    
+   33,83%     0,01%  mysqld  libc-2.19.so         [.] 0x00000000000f4bab                                                                                                                                                                                                    
+   26,92%     0,00%  mysqld  libpthread-2.19.so   [.] start_thread                                                                                                                                                                                                          
+   26,82%     0,00%  mysqld  mysqld               [.] pfs_spawn_thread                                                                                                                                                                                                      
+   26,82%     0,00%  mysqld  mysqld               [.] handle_connection                                                                                                                                                                                                     
+   26,81%     0,01%  mysqld  mysqld               [.] do_command(THD*)                                                                                                                                                                                                      
+   26,65%     0,02%  mysqld  mysqld               [.] dispatch_command(THD*, COM_DATA const*, enum_server_command)                                                                                                                                                          
+   26,29%     0,01%  mysqld  mysqld               [.] mysql_parse(THD*, Parser_state*)                                                                                                                                                                                      
+   24,85%     0,01%  mysqld  mysqld               [.] mysql_execute_command(THD*, bool)                                                                                                                                                                                     
+   23,61%     0,00%  mysqld  mysqld               [.] handle_query(THD*, LEX*, Query_result*, unsigned long long, unsigned long long)                                                                                                                                       
+   23,54%     0,00%  mysqld  mysqld               [.] 0x0000000000374103                                                                                                                                                                                                    
+   19,78%     0,00%  mysqld  mysqld               [.] JOIN::exec()                                                                                                                                                                                                          
+   19,13%     0,15%  mysqld  mysqld               [.] sub_select(JOIN*, QEP_TAB*, bool)                                                                                                                                                                                     
+   13,86%     1,48%  mysqld  mysqld               [.] row_search_mvcc(unsigned char*, page_cur_mode_t, row_prebuilt_t*, unsigned long, unsigned long)                                                                                                                       
+    8,48%     0,25%  mysqld  mysqld               [.] ha_innobase::general_fetch(unsigned char*, unsigned int, unsigned int)                                                                                                                                                
+    7,93%     0,00%  mysqld  [unknown]            [.] 0x00007f40c4d7a6f8                                                                                                                                                                                                    
+    7,57%     0,00%  mysqld  mysqld               [.] 0x0000000000828f74                                                                                                                                                                                                    
+    7,25%     0,11%  mysqld  mysqld               [.] handler::ha_index_next_same(unsigned char*, unsigned char const*, unsigned int)                                                                                                                                       

Mostra che mysql sta trascorrendo molto tempo su spin_locks . Speravo di avere qualche indizio su da dove vengano quelle serrature, purtroppo, senza fortuna.

Il profilo della query durante un carico elevato mostra una quantità estrema di switch di contesto. Ho usato select * da MyTable dove pk = 123 , MyTable ha circa 90 milioni di righe. Profilo di output:

Status               Duration CPU_user CPU_system Context_voluntary Context_involuntary Block_ops_in Block_ops_out Messages_sent Messages_received Page_faults_major Page_faults_minor Swaps Source_function       Source_file          Source_line
starting             0,000756 0,028000 0,012000   81                1                   0            0             0             0                 0                 0                 0                             
checking permissions 0,000057 0,004000 0,000000   4                 0                   0            0             0             0                 0                 0                 0     check_access          sql_authorization.cc 810
Opening tables       0,000285 0,008000 0,004000   31                0                   0            40            0             0                 0                 0                 0     open_tables           sql_base.cc          5650
init                 0,000304 0,012000 0,004000   31                1                   0            0             0             0                 0                 0                 0     handle_query          sql_select.cc        121
System lock          0,000303 0,012000 0,004000   33                0                   0            0             0             0                 0                 0                 0     mysql_lock_tables     lock.cc              323
optimizing           0,000196 0,008000 0,004000   20                0                   0            0             0             0                 0                 0                 0     optimize              sql_optimizer.cc     151
statistics           0,000885 0,036000 0,012000   99                6                   0            0             0             0                 0                 0                 0     optimize              sql_optimizer.cc     367
preparing            0,000794 0,000000 0,096000   76                2                   32           8             0             0                 0                 0                 0     optimize              sql_optimizer.cc     475
executing            0,000067 0,000000 0,000000   10                1                   0            0             0             0                 0                 0                 0     exec                  sql_executor.cc      119
Sending data         0,000469 0,000000 0,000000   54                1                   32           0             0             0                 0                 0                 0     exec                  sql_executor.cc      195
end                  0,000609 0,000000 0,016000   64                4                   0            0             0             0                 0                 0                 0     handle_query          sql_select.cc        199
query end            0,000063 0,000000 0,000000   3                 1                   0            0             0             0                 0                 0                 0     mysql_execute_command sql_parse.cc         4968
closing tables       0,000156 0,000000 0,000000   20                4                   0            0             0             0                 0                 0                 0     mysql_execute_command sql_parse.cc         5020
freeing items        0,000071 0,000000 0,004000   7                 1                   0            0             0             0                 0                 0                 0     mysql_parse           sql_parse.cc         5596
cleaning up          0,000533 0,024000 0,008000   62                0                   0            0             0             0                 0                 0                 0     dispatch_command      sql_parse.cc         1902

Peter Zaitsev ha recentemente pubblicato un post sui cambi di contesto, in cui afferma:

Nel mondo reale, tuttavia, non mi preoccuperei che la contesa sia un grosso problema se hai meno di dieci cambi di contesto per query.

Ma mostra più di 600 interruttori!

Cosa può causare questi sintomi e cosa si può fare al riguardo? Apprezzerò qualsiasi suggerimento o informazione in merito, tutto ciò che ho incontrato finora è piuttosto vecchio e / o inconcludente.

PS Fornirò volentieri ulteriori informazioni, se necessario.

Uscita di SHOW GLOBAL STATUS e SHOW VARIABLES

Non posso pubblicarlo qui perché i contenuti superano il limite della dimensione del post.

MOSTRA LO STATO GLOBALE
VISUALIZZA VARIABILI

iostat

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7,35    0,00    5,44    0,20    0,00   87,01

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0,00     0,00    0,00    0,00     0,00     0,00     8,00     0,00   32,00   32,00    0,00  32,00   0,00
sda               0,04     2,27    0,13    0,96     0,86    46,52    87,05     0,00    2,52    0,41    2,80   0,28   0,03
sdb               0,21   232,57   30,86  482,91   503,42  7769,88    32,21     0,34    0,67    0,83    0,66   0,34  17,50

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9,98    0,00   77,52    0,46    0,00   12,04

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
sda               0,00     1,60    0,00    0,60     0,00     8,80    29,33     0,00    0,00    0,00    0,00   0,00   0,00
sdb               0,00   566,40   55,60  981,60   889,60 16173,60    32,90     0,84    0,81    0,76    0,81   0,51  53,28

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          11,83    0,00   72,72    0,35    0,00   15,10

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
sda               0,00     2,60    0,00    0,40     0,00    12,00    60,00     0,00    0,00    0,00    0,00   0,00   0,00
sdb               0,00   565,20   51,60  962,80   825,60 15569,60    32,32     0,85    0,84    0,98    0,83   0,54  54,56

Aggiornamento 15-03-2018

> show global status like 'uptime%'
Uptime;720899
Uptime_since_flush_status;720899

> show global status like '%rollback'
Com_rollback;351422
Com_xa_rollback;0
Handler_rollback;371088
Handler_savepoint_rollback;0

Quanto tempo (tempo trascorso) select * from MyTable where pk = 123impiega in media?
Rick James,

1
@RickJames In media ci vogliono circa 5ms.
chimmi,

1
I test di @WilsonHauck mostrano circa 30k di scrittura di IOps. Per quanto riguarda le pagine sporche, la quantità del 9% che abbiamo, non mi sembra un problema. Abbiamo scoperto che dopo il riavvio l'utilizzo della CPU rimane normale per circa una settimana, quindi il piano è di attendere il prossimo riavvio e monitorare global statusper vedere se qualcosa è correlato all'aumento dell'utilizzo della CPU. Non credo che si possano ottenere risultati con i dati disponibili al momento. Farò un'altra domanda se trovo qualcosa di nuovo.
Chimmi,

1
@WilsonHauck Abbiamo avuto un riavvio ed è andato come prima: il tempo di sistema ha iniziato a crescere. Sto ancora cercando la fonte del problema.
chimmi,

1
@WilsonHauck Domanda aggiornata.
chimmi,

Risposte:


6

600q / s in scrittura con un flush per commit probabilmente sta colpendo il limite dei tuoi attuali dischi rotanti. Il passaggio agli SSD allevierebbe la pressione.

La soluzione rapida (prima di ottenere SSD) è probabilmente quella di cambiare a questa impostazione:

innodb_flush_log_at_trx_commit = 2

Ma leggi le avvertenze su come apportare quel cambiamento.

Avere quell'impostazione e SSD ti permetterebbe di crescere ulteriormente.

Un'altra possibile soluzione è combinare alcune scritture in un singolo COMMIT(in cui la logica non viene violata).

Quasi sempre, CPU e / o I / O elevati sono dovuti a indici scarsi e / o alla scarsa formulazione delle query. Attiva il slowlog con long_query_time=1, attendi qualche istante, quindi vedi cosa succede. Con le query in mano, fornire SELECT, EXPLAIN SELECT ...e SHOW CREATE TABLE. Idem per le query di scrittura. Da quelli, possiamo probabilmente domare la CPU e / o l'I / O. Anche con l'impostazione attuale di 3, pt-query-digestpotresti trovare alcune cose interessanti.

Nota che con 50 thread "in esecuzione", c'è molta contesa; ciò potrebbe causare la commutazione, ecc. che hai notato. È necessario che le query finiscano più rapidamente. Con 5.7, il sistema potrebbe chinarsi con 100 thread in esecuzione . Aumentando oltre 64, il contesto cambia, mutex, blocchi, ecc., Cospirano per rallentare ogni thread, portando a nessun miglioramento del throughput mentre la latenza passa attraverso il tetto.

Per un approccio diverso all'analisi del problema, si prega di fornire SHOW VARIABLESe SHOW GLOBAL STATUS? Altre discussioni qui .

Analisi di VARIABILI E STATUS

(Mi dispiace, nulla salta fuori come affrontare la tua domanda.)

osservazioni:

  • Versione: 5.7.20-log
  • 700 GB di RAM
  • Uptime = 36d 13:21:34
  • Non stai eseguendo su Windows.
  • Esecuzione della versione a 64 bit
  • Sembra che tu stia eseguendo interamente (o principalmente) InnoDB.

I problemi più importanti:

Molte tabelle temporanee, in particolare basate su disco, vengono create per query complesse. Speriamo che il registro lento identifichi alcune query che possono essere migliorate (tramite indicizzazione / riformulazione / ecc.) Altri indicatori sono join senza indici e sort_merge_passes; tuttavia, nessuno di questi è conclusivo, dobbiamo vedere le domande.

Max_used_connections = 701è> = Max_connections = 700, quindi probabilmente sono state rifiutate alcune connessioni. Inoltre, se ciò indicava più di, diciamo, 64 thread in esecuzione , le prestazioni del sistema probabilmente risentono in quel momento. Considerare la limitazione del numero di connessioni limitando i client. Stai usando Apache, Tomcat o qualcos'altro? 70 Threads_runningindica che, al momento SHOW, il sistema era in difficoltà.

Aumentare il numero di dichiarazioni in ciascuna COMMIT(quando ragionevole) può aiutare alcune prestazioni.

innodb_log_file_size, a 15 GB, è più grande del necessario, ma non vedo la necessità di cambiarlo.

Migliaia di tavoli di solito non sono un buon design.

eq_range_index_dive_limit = 200mi preoccupa, ma non so come consigliarlo. È stata una scelta deliberata?

Perché così tante CREATE + DROP PROCEDURE?

Perché così tanti comandi SHOW?

Dettagli e altre osservazioni:

( Innodb_buffer_pool_pages_flushed ) = 523,716,598 / 3158494 = 165 /sec - Scrive (arrossisce) - controlla innodb_buffer_pool_size

( table_open_cache ) = 10,000 - Numero di descrittori di tabelle da memorizzare nella cache - Diverse centinaia sono generalmente valide.

( (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) ) = ((61,040,718 + 523,716,598) ) / 3158494 = 185 /sec - I / O InnoDB

( Innodb_dblwr_pages_written/Innodb_pages_written ) = 459,782,684/523,717,889 = 87.8% - Sembra che questi valori dovrebbero essere uguali?

( Innodb_os_log_written ) = 1,071,443,919,360 / 3158494 = 339226 /sec- Questo è un indicatore di quanto InnoDB sia occupato. - InnoDB molto occupato.

( Innodb_log_writes ) = 110,905,716 / 3158494 = 35 /sec

( Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 1,071,443,919,360 / (3158494 / 3600) / 2 / 15360M = 0.0379 - Rapporto - (vedi minuti)

( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 3,158,494 / 60 * 15360M / 1071443919360 = 791- Minuti tra le rotazioni del registro di InnoDB A partire da 5.6.8, questo può essere modificato in modo dinamico; assicurati di cambiare anche my.cnf. - (La raccomandazione di 60 minuti tra le rotazioni è in qualche modo arbitraria.) Regola innodb_log_file_size. (Impossibile modificare in AWS.)

( Com_rollback ) = 770,457 / 3158494 = 0.24 /sec- ROLLBACK in InnoDB. - Una frequenza eccessiva di rollback può indicare una logica app inefficiente.

( Innodb_row_lock_waits ) = 632,292 / 3158494 = 0.2 /sec- Quanto spesso c'è un ritardo nell'ottenere un blocco di riga. - Può essere causato da query complesse che potrebbero essere ottimizzate.

( Innodb_dblwr_writes ) = 97,725,876 / 3158494 = 31 /sec- "Doublewrite buffer" scrive su disco. "Doublewrites" sono una caratteristica di affidabilità. Alcune versioni / configurazioni più recenti non ne hanno bisogno. - (Sintomo di altri problemi)

( Innodb_row_lock_current_waits ) = 13- Il numero di blocchi di riga attualmente attesi dalle operazioni sulle tabelle InnoDB. Zero è abbastanza normale. - Sta succedendo qualcosa di grosso?

( innodb_print_all_deadlocks ) = OFF- Se registrare tutti i deadlock. - Se sei afflitto da deadlock, attiva questo. Attenzione: se si hanno molti deadlock, questo può scrivere molto sul disco.

( local_infile ) = ON - local_infile = ON è un potenziale problema di sicurezza

( bulk_insert_buffer_size / _ram ) = 8M / 716800M = 0.00%- Buffer per INSERTI multi-riga e CARICO DATI - Troppo grande potrebbe minacciare la dimensione della RAM. Troppo piccolo potrebbe ostacolare tali operazioni.

( Questions ) = 9,658,430,713 / 3158494 = 3057 /sec- Query (al di fuori di SP) - "qps" -> 2000 potrebbe essere un server stressante

( Queries ) = 9,678,805,194 / 3158494 = 3064 /sec- Le query (incluso all'interno di SP) -> 3000 potrebbero essere stressanti per il server

( Created_tmp_tables ) = 1,107,271,497 / 3158494 = 350 /sec - Frequenza di creazione di tabelle "temp" come parte di SELECT complessi.

( Created_tmp_disk_tables ) = 297,023,373 / 3158494 = 94 /sec- Frequenza di creazione di tabelle "temp" su disco come parte di SELECT complessi - aumenta tmp_table_size e max_heap_table_size. Controlla le regole per le tabelle temporanee su quando viene utilizzato MEMORY invece di MyISAM. Forse modifiche minori dello schema o delle query possono evitare MyISAM. Migliori indici e riformulazione delle query hanno maggiori probabilità di aiutare.

( (Com_insert + Com_update + Com_delete + Com_replace) / Com_commit ) = (693300264 + 214511608 + 37537668 + 0) / 1672382928 = 0.565- Dichiarazioni per commit (assumendo tutto InnoDB) - Basso: potrebbe aiutare a raggruppare le query nelle transazioni; Alto: le transazioni lunghe mettono a dura prova varie cose.

( Select_full_join ) = 338,957,314 / 3158494 = 107 /sec - unisce senza indice - Aggiunge gli indici adatti alle tabelle utilizzate nei JOIN.

( Select_full_join / Com_select ) = 338,957,314 / 6763083714 = 5.0% -% di selezioni che si uniscono senza indice - Aggiunge un indice o indici adeguati alle tabelle utilizzate nei JOIN.

( Select_scan ) = 124,606,973 / 3158494 = 39 /sec - scansioni di tabelle complete - Aggiungi indici / ottimizza query (a meno che non siano tabelle minuscole)

( Sort_merge_passes ) = 1,136,548 / 3158494 = 0.36 /sec - Tipi pesanti - Aumenta sort_buffer_size e / o ottimizza query complesse.

( Com_insert + Com_delete + Com_delete_multi + Com_replace + Com_update + Com_update_multi ) = (693300264 + 37537668 + 198418338 + 0 + 214511608 + 79274476) / 3158494 = 387 /sec - scritture / sec - 50 scritture / sec + log flush probabilmente aumenteranno al massimo la capacità di scrittura I / O delle unità normali

( ( Com_stmt_prepare - Com_stmt_close ) / ( Com_stmt_prepare + Com_stmt_close ) ) = ( 39 - 38 ) / ( 39 + 38 ) = 1.3%- Stai chiudendo le tue dichiarazioni preparate? - Aggiungi si chiude.

( Com_stmt_close / Com_stmt_prepare ) = 38 / 39 = 97.4%- Le dichiarazioni preparate devono essere chiuse. - Controllare se tutte le istruzioni preparate sono "Chiuse".

( innodb_autoinc_lock_mode ) = 1- Galera: desideri 2 - 2 = "interlacciato"; 1 = "consecutivo" è tipico; 0 = "tradizionale".

( Max_used_connections / max_connections ) = 701 / 700 = 100.1% - Picco% di connessioni: aumenta max_connections e / o diminuisce wait_timeout

( Threads_running - 1 ) = 71 - 1 = 70 - Thread attivi (concorrenza quando vengono raccolti i dati) - Ottimizza le query e / o lo schema

Anormalmente grande: (la maggior parte di questi deriva dall'essere un sistema molto impegnato.)

Com_commit = 529 /sec
Com_create_procedure = 0.01 /HR
Com_drop_procedure = 0.01 /HR
Com_delete = 12 /sec
Com_delete_multi = 63 /sec
Com_insert = 219 /sec
Com_kill = 0.69 /HR
Com_reset = 0.0011 /HR
Com_revoke = 0.0023 /HR
Com_select = 2141 /sec
Com_show_binlogs = 12 /HR
Com_show_create_func = 0.011 /HR
Com_show_privileges = 0.0034 /HR
Com_show_profile = 0.027 /HR
Com_show_profiles = 0.028 /HR
Com_show_slave_status = 0.037 /sec
Com_show_storage_engines = 12 /HR
Com_show_warnings = 0.14 /sec
Com_slave_stop = 0.0011 /HR
Com_update_multi = 25 /sec
Created_tmp_files = 0.3 /sec
Handler_commit = 3251 /sec
Handler_external_lock = 18787 /sec
Handler_prepare = 615 /sec
Handler_read_first = 239 /sec
Handler_read_key = 173669 /sec
Handler_read_next = 1291439 /sec
Handler_read_prev = 28535 /sec
Handler_read_rnd = 32789 /sec

(Continua)

Innodb_buffer_pool_bytes_dirty = 7.03e+10
Innodb_buffer_pool_pages_data = 3.41e+7
Innodb_buffer_pool_pages_dirty = 4.29e+6
Innodb_buffer_pool_pages_misc = 2.15e+6
Innodb_buffer_pool_pages_total = 3.62e+7
Innodb_data_fsyncs = 132 /sec
Innodb_data_writes = 232 /sec
Innodb_data_written = 5440151 /sec
Innodb_dblwr_pages_written = 145 /sec
Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group = 582.3MB
Innodb_pages_written = 165 /sec
Innodb_row_lock_time = 5.97e+7
Innodb_rows_deleted + Innodb_rows_inserted = 2180 /sec
Innodb_rows_inserted = 2155 /sec
Innodb_rows_read = 1398531 /sec
Max_used_connections = 701
Open_tables = 10,000
Select_full_range_join = 2.57e+7
Select_range = 130 /sec
Sort_range = 30 /sec
Sort_scan = 332 /sec
Table_open_cache_hits = 9354 /sec
Threads_running = 71
eq_range_index_dive_limit = 200
innodb_purge_threads = 4
innodb_thread_sleep_delay = 16,925

1
Sì, grazie, apprezzo il tuo lavoro. Sfortunatamente, non vedo nulla che possa spiegare il nostro improvviso cambiamento nell'uso della CPU (che è avvenuto sostanzialmente durante la notte senza cambiamenti apparenti nella dimensione del DB, nel carico o nell'applicazione). innodb_flush_log_at_trx_commit = 2non sembra avere alcun effetto e la contesa tra thread non sembra essere il problema perché anche a carichi moderati (Threads runnig <50) CPU sys / CPU user è qualcosa di simile a 3 a 1.
chimmi

4

Non abbiamo mai capito quale fosse la causa esatta di questo problema, ma per offrire un po 'di chiusura ho intenzione di dire cosa posso.

Il nostro team ha effettuato alcuni test di carico e ha concluso che si MySQLsono verificati problemi nell'allocazione della memoria. Quindi hanno provato a utilizzare jemallocinvece di glibce il problema è scomparso. Usiamo jemallocin produzione da più di 6 mesi ormai, senza mai più vedere questo problema.

Non sto dicendo che jemallocè meglio, o che tutti dovrebbero usarlo MySQL. Ma sembra che il nostro caso specifico glibcnon funzionasse correttamente.


2

I miei 2 centesimi.

Esegui "iostat -xk 5" per provare a vedere se il disco è ancora un problema. Anche il sistema della CPU è correlato al codice di sistema (kernell), ricontrolla il nuovo disco / driver / config.


1
iostat non mostra grandi numeri.
chimmi,

Sì, posso vedere lo iostat sopra, ma i numeri visualizzati non corrispondono al grafico. Hai eseguito iostat nello stesso lasso di tempo?
andres

1
Più o meno, abbiamo apportato alcune modifiche all'applicazione per ridurre il numero di query che colpiscono questo DB, quindi la CPU non si attacca più al 100%. Ho collegato un'altra uscita iostat, al momento la CPU media era al 75%, 60% di sistema.
chimmi,

0

Suggerimenti per la sezione my.cnf / ini [mysqld] per il tuo MOLTO OCCUPATO

max_heap_table_size=128M  # from 16M to match tmp_table_size
innodb_lru_scan_depth=100  # from 256 to reduce depth every second
innodb_change_buffer_max_size=15  # from 25 max used misc is 6%
innodb_flush_neighbors=0  # from 1 with SSD there is no rotational delay
innodb_read_ahead_threshold=8  # from 56 to expedite RD nxt extent
read_rnd_buffer_size=128K  # from 256K to reduce RD RPS

La mia aspettativa è una graduale riduzione dei risultati di SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_dirty'; con questi suggerimenti applicati. Il 13/01/18 avevi oltre 4 milioni di pagine sporche.

Spero che questi aiuti. Questi possono essere modificati dinamicamente. Esistono molte più opportunità, se le vuoi, fammi sapere.


Grazie per i tuoi suggerimenti, ma questo problema è stato risolto molto tempo fa. Vedi la mia risposta per i dettagli.
chimmi,

0

Con IOPS a 30K testato (abbiamo bisogno di un numero di IOPS per scritture casuali), considera questo suggerimento per la sezione my.cnf / ini [mysqld]

innodb_io_capacity_max=20000  # from 2000 and keep top 10000 free for now
innodb_io_capacity=10000  # from 200 to ensure we stay away from the limits

può essere modificato dinamicamente con SET GLOBAL e dovrebbe ridurre rapidamente innodb_buffer_pool_pages_dirty.

La causa della media di COM_ROLLBACK 1 ogni 4 secondi rimarrà un problema di prestazioni fino alla risoluzione.

@chimmi, 9 aprile 2018 Prendi questo script MySQL da https://pastebin.com/aZAu2zZ0 per un rapido controllo delle risorse di stato globale utilizzate o rilasciate per nn secondi che puoi impostare in SLEEP. Questo ti permetterà di vedere se qualcuno ha contribuito a ridurre la frequenza COM_ROLLBACK. Mi piacerebbe sentirti via email.


@chimmi Si prega di iniziare una nuova domanda con richiesta di informazioni aggiuntive, per favore. Pubblica su pastebin.com o qui. completo (non modificato) my.cnf-ini Risultati testuali di: A) MOSTRA STATO GLOBALE; B) MOSTRA VARIABILI GLOBALI; C) completare il report MySQLTuner.com se immediatamente disponibile - 7 o più giorni di disponibilità sono utili D) MOSTRARE LO STATO INNODB DEL MOTORE; Informazioni facoltative molto utili, se disponibili includono - htop O top per la maggior parte delle app attive, ulimit -a per un elenco di limiti, df -h per un elenco di spazi liberi per dispositivo, free -m per una memoria libera linux / unix per il server corrente analisi.
Wilson Hauck,

@chimmi Inoltre, si prega di pubblicare cat / proc / meminfo per il conteggio dei cambi di contesto. Fammi sapere il link per la nuova domanda, per favore. Grazie
Wilson Hauck,

0

Il tuo SHOW GLOBAL STATUS indica che innodb_buffer_pool_pages_dirty erano 4.291.574.

Per monitorare il conteggio corrente,

SHOW GLOBAL STATUS LIKE '%pages_dirty';

Per incoraggiare a ridurre questo conteggio,

SET GLOBAL innodb_flushing_avg_loops=5;

In un'ora esegui la richiesta di monitoraggio per vedere dove ti trovi con le pagine sporche.

Per favore fatemi sapere i conteggi all'inizio e un'ora dopo.

Applica la modifica a my.cnf per una migliore salute a lungo termine della riduzione delle pagine sporche.


@chimmi Grazie per aver condiviso la risoluzione primaria jemalloc. Questo processo di monitoraggio per pages_dirty potrebbe essere utile per l'ambiente di produzione. Per favore, provalo e condividi i tuoi numeri con me. Grazie
Wilson Hauck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.