sql >> Database teknologi >  >> RDS >> MariaDB

Hvad skal du kontrollere, hvis MySQL I/O-udnyttelsen er høj

I/O-ydeevnen er afgørende for MySQL-databaser. Data læses og skrives til disken adskillige steder. Redo logs, tablespaces, binære og relæ logs. Med en stigning i brugen af ​​solid state-drev er I/O-ydeevnen øget betydeligt, hvilket giver brugerne mulighed for at presse deres databaser endnu hurtigere, men selv da kan I/O blive en flaskehals og en begrænsende faktor for hele databasens ydeevne. I dette blogindlæg vil vi tage et kig på de ting, du vil tjekke, hvis du bemærker, at din I/O-ydelse er høj på din MySQL-instans.

Hvad betyder "Høj" I/O-udnyttelse? Kort sagt, hvis ydeevnen af ​​din database påvirkes af det, er den høj. Typisk vil du bemærke det, som skriver, der går langsommere i databasen. Det vil også tydeligt vise sig som høj I/O-ventetid på dit system. Vær dog opmærksom på, at på værter med 32 eller flere CPU-kerner, selvom en kerne vil vise 100 % I/O-ventetid, vil du muligvis ikke bemærke det i en aggregeret visning - det vil kun repræsentere 1/32 af hele belastningen . Det ser ikke ud til at påvirke, men faktisk mætter nogle enkelttrådede I/O-operationer din CPU, og nogle applikationer venter på, at I/O-aktiviteten er færdig.

Lad os sige, at vi bemærkede en stigning i I/O-aktiviteten, bare som på skærmbilledet ovenfor. Hvad skal du se på, hvis du bemærkede høj I/O-aktivitet? Tjek først listen over processerne i systemet. Hvem er ansvarlig for en I/O-ventetid? Du kan bruge iotop til at kontrollere, at:

I vores tilfælde er det helt klart, at det er MySQL, der er ansvarlig for det meste af det. Vi bør starte med det enkleste tjek - hvad er det præcist, der kører i MySQL lige nu?

Vi kan se, at der er replikeringsaktivitet på vores slave. Hvad sker der med mesteren?

Vi kan tydeligt se, at et batch-indlæsningsjob kører. På den måde slutter vores rejse hertil, da det ganske nemt lykkedes os at lokalisere problemet.

Der er dog andre tilfælde, som måske ikke er så nemme at forstå og spore. MySQL kommer med noget instrumentering, som er beregnet til at hjælpe med at forstå I/O-aktiviteten i systemet. Som nævnt kan I/O genereres adskillige steder i systemet. Skrivninger er de mest klare, men vi kan også have midlertidige tabeller på disken - det er godt at se, om dine forespørgsler bruger sådanne tabeller eller ej.

Hvis du har performance_schema aktiveret, kan en måde at kontrollere, hvilke filer der er ansvarlige for I/O-belastningen være at forespørge 'table_io_waits_summary_by_table':

*************************** 13. række ************** *************** FILE_NAME:/tmp/myfd =68 Event_name:WAIT/IO/FILE/SQL/IO_CACH COUNT_READ:10888 SUM_TIMER_READ:20108066180000 MIN_TIMER_READ:2798750 AVG_TIMER_READ:1846809750 MAX_TIMER_READ:389600380500 SUM_NUMBER_OF_BYTES_READ:377372793 COUNT_WRITE:6318 SUM_TIMER_WRITE:3224434875000 MIN_TIMER_WRITE:16699500 AVG_TIMER_WRITE:510356750 MAX_TIMER_WRITE:223219960500SUM_NUMBER_OF_BYTES_WRITE:414000000 COUNT_MISC:2 SUM_TIMER_MISC:62272000 MIN_TIMER_MISC:1596000 AVG_TIMER_MISC:31136000 MAX_TIMER_MISC:60676000 ******* ******************** 14. række *************************** FILE_NAME:/tmp/Innodb Merge Temp File EVENT_NAME:wait/io/file/innodb/innodb_temp_file OBJECT_INSTANCE_BEGIN:140332382780800 COUNT_STAR:1128 SUM_TIMER_WAIT:16465339114500 MIN_TIMER_WAIT:8490250 AVG_TIMER_WAIT:14596931750 MAX_TIMER_WAIT:583930037500 COUNT_READ:540 SUM_TIMER_READ:15103082275500 MIN_TIMER_READ:111663250 AVG_TIMER_READ:27968670750 MAX_TIMER_READ:583930037500 SUM_NUMBER_OF_BYTES_READ:566231040 COUNT_WRITE:540 SUM_TIMER_WRITE:1234847420750 MIN_TIMER_WRITE:286167500 AVG_TIMER_WRITE:2286754250 MAX_TIMER_WRITE:223758795000SUM_NUMBER_OF_BYTES_WRITE:566231040 COUNT_MISC:48 SUM_TIMER_MISC:127409418250 MIN_TIMER_MISC:8490250 AVG_TIMER_MISC:2654362750 MAX_TIMER_MISC :43409881500

Som du kan se ovenfor, viser den også midlertidige tabeller, der er i brug.

For at dobbelttjekke, om en bestemt forespørgsel bruger midlertidig tabel, kan du bruge EXPLAIN FOR CONNECTION:

mysql> FORKLAR TIL FORBINDELSE 3111\G**************************** 1. række ****** ********************* id:1 select_type:SIMPLE tabel:sbtest1 partitioner:NULL type:ALLpossible_keys:NULL nøgle:NULL key_len:NULL ref:NULL rækker:986400 filtreret:100,00 Ekstra:Bruger midlertidig; Brug af filersorter1 række i sæt (0,16 sek.) 

I eksemplet ovenfor er en midlertidig tabel brugt til filsortering.

En anden måde at indhente diskaktivitet på er, hvis du tilfældigvis bruger Percona Server til MySQL, at aktivere fuld langsom log-omtale:

mysql> SET GLOBAL log_slow_verbosity='full';Forespørgsel OK, 0 rækker påvirket (0,00 sek.) 

Så, i den langsomme log, kan du muligvis se poster som dette:

# Tid:2020-01-31T12:05:29.190549Z# [email protected]:root[root] @ localhost [] Id:12395# Skema:Last_errno:0 Dræbt:0# Forespørgselstid:43.260389 Lock_time:0.031185 Rows_sent:1000000 Rows_examined:2000000 Rows_affected:0# Bytes_sent:197889110 Tmp_tables:0 Tmp_disk_tables:0 Tmp_table_sizes:0# InnoDB_trx_id:0# Full_scan:Yes Full_join:No Tmp_table:No Tmp_table_on_disk:No# Filesort:Yes Filesort_on_disk:Yes Merge_passes :141# innodb_io_r_ops:9476 innodb_io_r_bytes:155254784 innodb_io_r_wait:5.304944# innodb_rec_lock_wait:0.000000 innodb_queUe_wait:0.0000 00 

Som du kan se, kan du se, om der var en midlertidig tabel på disken, eller om dataene blev sorteret på disken. Du kan også kontrollere antallet af I/O-operationer og mængden af ​​adgang til data.

Vi håber, at dette blogindlæg vil hjælpe dig med at forstå I/O-aktiviteten i systemet og lade dig administrere det bedre.


  1. Import eksport mysql database kommandolinje superhurtig

  2. 2 måder at få antallet af dage i en måned i Oracle

  3. Forskellen mellem underforespørgsel og korreleret underforespørgsel

  4. Hvordan CONV() virker i MariaDB