InnoDB i alociranje memorije

I

Smarah se jutros nešto sa jednim klijentom pa reko da bi bilo možda zgodno da podelim sa širom publikom pošto sada, u doba džaba RAM-a, mnogi ovde mogu da nalete na sličan problem i da potroše previše vremena na detekciju istog. Elem, situacija je sledeća, Linux, 128G server, MySQL koji je namesšten da troši oko 120G. Sve radi kako treba. Sve se to sada preseli na Solaris i džbeng – neće da se startuje MySQL, fali mu ram – i fali mu ram, i fali mu ram, i nece da se digne pa to ti je. Isti konfig, isto sve, linux ga startuje, solaris nece.

Kako je binary drugačiji, logično je prvo tu gledati gde je problem no način na koji se sve dešava je identičan tako da smo taj koraj preskočili i otišli dalje. Sva sreća Solaris dolazi uz dtrace i mnogo druge alate, pogledamo šta se dešava i zaključimo da server ne uspe da se startuje zato što pokuša da alocira mnogo više rama nego što je to „normalno“ (mnogo više od 128G) i to mu Solaris ne dozvoli. Tu, pošto nisam mega ekspert za Solaris, a imam mega eksperte pri ruci, cimnem da vidim šta se dešava, oni tu nešto čačnu i sve proradi, Solaris mu dozvoli da alocira potreban ram (svap rulez), on posle oslobodi sav taj ektra ram i sve bude kako treba, osim što, klijent želi da zna – šta se to dođavola desilo i zašto.

Ono što se desilo je InnoDB. Pri startovanju, InnoDB zauzima sav onaj RAM koji je za očekivati:

  • innodb buffer pool
  • innodb additional mem pool
  • innodb log buffer

ali i neke stvari koje ne zna svako:

  • adaptive index hash (innodb buffer pool / 64)
  • system dictionary hash ( 6 * innodb buffer pool / 512 )
  • os_events (50000 * 216 ako je innodb buffer pool veci od 1G ili 10000 * 216 )
  • sync_array ( 50000 * 152 ako je innodb buffer pool veci od 1G ili 10000 * 152 )
  • locking sistem (4 * 5 * innodb buffer pool / 16384 )

E sada, to je RAM ko se troši non stop, ali ono što je u ovom slučaju bilo bitno, InnoDB pri startovanju allocira dodatni RAM za crash recovery. Ovaj potreban RAM je oko 12% veličine innodb buffer pool-a. Tačnije pri startovanju, Innodb će uzeti pored ovog standardnog dodatnih innodb buffer pool * 0.12, pa će onda taj RAM osloboditi, pa onda  innodb buffer pool * 0.03 koji oslobadja pa jos jednom to isto innodb buffer pool * 0.03 koji oslobađa i tu se završava crash recovery i InnoDB se nalazi u stabilnom stanju.

Onih 12% koje InnoDB inicijalno pokupi pri startovanju je problem ako je innodb buffer pool veliki. Ako uzmemo primer gde je taj buffer 80G taj „overhead“ koji InnoDB sisne na početku je 9.6G što uopšte nije malo ako na to ne računate. Posebno ako vam je OS nasetovan tako da ne dozvoljava procesu da pojede više rama nego što mu je dozvoljeno.

O autoru

Bogdan Kecman

Dodaj komentar

Ključne Reči

Kategorije

Blog