Vad är en InnoDB-buffertpool?
InnoDB buffertpool är minnesutrymmet som innehåller många datastrukturer i minnet av InnoDB, buffertar, cachar, index och till och med raddata. innodb_buffer_pool_size är MySQL-konfigurationsparametern som anger mängden minne som tilldelats InnoDB-buffertpoolen av MySQL. Detta är en av de viktigaste inställningarna i MySQL-värdkonfigurationen och bör konfigureras baserat på tillgängligt system-RAM.
I det här inlägget går vi igenom två metoder för att ställa in ditt InnoDB-buffertpoolstorleksvärde, undersöker för- och nackdelarna med dessa metoder och föreslår också en unik metod för att komma fram till ett optimalt värde baserat på storleken på ditt system-RAM.
Tillvägagångssätt 1. Tumregelmetoden
Den vanligaste metoden är att ställa in detta värde på 70 % – 80 % av systemets RAM. Även om det fungerar bra i de flesta fall, kanske den här metoden inte är optimal i alla konfigurationer. Låt oss ta exemplet med ett system med 192 GB RAM. Baserat på ovanstående metod kommer vi fram till cirka 150 GB för buffertpoolens storlek. Detta är dock inte riktigt ett optimalt antal eftersom det inte fullt ut utnyttjar den stora RAM-storleken som är tillgänglig i systemet och lämnar efter sig cirka 40 GB minne. Denna skillnad kan bli ännu mer betydande när vi går över till system med större konfigurationer där vi borde använda det tillgängliga RAM-minnet i större utsträckning.
Tillvägagångssätt 2. Ett mer nyanserat tillvägagångssätt
Det här tillvägagångssättet är baserat på en mer detaljerad förståelse av det interna i InnoDB-buffertpoolen och dess interaktioner, vilket beskrivs mycket väl i boken High Performance MySQL.
Låt oss titta på följande metod för att beräkna storleken på InnoDB-buffertpoolen.
- Börja med totalt RAM tillgängligt.
- Subtrahera lämpligt belopp för OS-behoven.
- Subtrahera lämplig mängd för alla MySQL-behov (som olika MySQL-buffertar, temporära tabeller, anslutningspooler och replikeringsrelaterade buffertar).
- Dela resultatet med 105 %, vilket är en uppskattning av de omkostnader som krävs för att hantera själva buffertpoolen.
Låt oss till exempel titta på ett system med 192 GB RAM som endast använder InnoDB och har en total loggfilstorlek på cirka 4 GB. Vi kan använda en regel som "maximalt 2GB eller 5% av det totala RAM-minnet" för tilldelning av OS-behov som rekommenderas i boken ovan, vilket kommer till cirka 9,6GB. Sedan kommer vi också att tilldela cirka 4 GB för andra MySQL-behov, främst med hänsyn till loggfilens storlek. Denna metod resulterar i cirka 170 GB för vår InnoDB-buffertpoolstorlek, vilket är cirka 88,5 % utnyttjande av den tillgängliga RAM-storleken.
Även om vi använde regeln 'maximalt 2 GB eller 5 % av totalt RAM' för att beräkna vår minnesallokering för OS-behov ovan, fungerar inte samma regel särskilt bra i alla fall , speciellt för system med medelstora RAM-minnen mellan 2 GB och 32 GB. Till exempel, i ett system med 3 GB RAM, lämnar tilldelning av 2 GB för OS-behov inte mycket till InnoDB-buffertpoolen, medan allokering av 5 % av RAM-minne är alldeles för lite för våra OS-behov.
Så, låt oss finjustera ovanstående OS-allokeringsregel och undersöka InnoDB-beräkningsmetoden över olika RAM-konfigurationer:
För system med litet RAM-minne (<=1 GB)
För system som körs med mindre än 1 GB RAM är det bättre att använda MySQL standardkonfigurationsvärdet på 128 MB för InnoDB buffertpoolstorlek.
För system med medelstort RAM-minne (1 GB – 32 GB)
Med tanke på fallet med system med en RAM-storlek på 1GB – 32GB, kan vi beräkna OS-behov med hjälp av denna grova heuristik:
256 MB + 256 * log2 (RAM-storlek i GB)
Rationaliseringen här är att för låga RAM-konfigurationer börjar vi med ett basvärde på 256 MB för OS-behov och ökar denna allokering i en logaritmisk skala som mängden RAM ökar. På så sätt kan vi komma på en deterministisk formel för att allokera RAM för våra OS-behov. Vi kommer också att allokera samma mängd minne för våra MySQL andra behov. Till exempel, i ett system med 3 GB RAM-minne skulle vi göra en rimlig allokering av 660 MB för OS-behov och ytterligare 660 MB för MySQL andra behov, vilket resulterar i ett värde på cirka 1,6 GB för vår InnoDB-buffertpoolstorlek.
För system med större RAM-minne (> 32 GB)
För system med RAM-storlekar större än 32 GB, skulle vi återgå till att beräkna OS-behov som 5 % av vårt system-RAM-storlek, och samma mängd för MySQL andra behov. Så för ett system med en RAM-storlek på 192 GB kommer vår metod att landa på cirka 165 GB för InnoDB-buffertpoolstorlek, vilket återigen är ett optimalt värde att använda.
InnoDB Buffer Pool Size Calculator
Beräkna det optimala värdet för RAM i alla storlekar:
InnoDB Buffer Pool Size Calculator - Beräkna det optimala antalet för alla system-RAM-storlekar. Klicka för att tweeta
Plot av InnoDB buffertpoolstorlek för olika RAM-storlekar
Varning för InnoDB-buffertpoolstorleksberäkningar
Övervägandena i det här blogginlägget gäller Linux-system som är dedikerade för MySQL. För Windows-system eller system som kör flera applikationer tillsammans med MySQL kan dessa observationer vara felaktiga. Det är också viktigt att notera att även om vi kan använda dessa verktyg som referenser krävs det verkligen god erfarenhet, experimenterande, kontinuerlig övervakning och finjustering för att få rätt storlek för din innodb_buffer_pool_size.