Kaip Soliaryje ieškoti memory leak’ų

Posted: 2013-03-08 in Pezalai
Žymos:,

Čia šiaip užrašėlis. Jei neįdomu, neskaitykit.

Memory leak’ai — tai „atminties nutekėjimai“. Kitaip sakant, paleidžiat programą, o ji atminties naudoja vis daugiau ir daugiau ir jos neišlaisvina. Kol, galų gale, pasiekia procesui leistiną maksimumą ir „užsilenkia“. Šitų nutekėjimų ieškoti ypač bjauru, bet nėra kur dėtis — reikia.

Taigi, toje aplinkoje, iš kurios leidžiamas procesas, reikia išeksportuoti du aplinkos kintamuosius (ne Linux, blė, reikia atskirų eilučių priskyrimui ir eksportui):

UMEM_LOGGING=transaction
export UMEM_LOGGING
UMEM_DEBUG=default
export UMEM_DEBUG

Galima ir į .profile įsidėt, jei reikia.

Toliau procesą apkraunam. Viskas priklauso nuo proceso tipo. Mano atveju — tai toks pusiau Java padarytas SOAP serveris. Taigi imam SOAP UI, sukuriam užklausą, paskui sukuriam Load Testą ir duodam procesui garo kokias 15 minučių. Tam skirtas cronjob’as seka atminties augimą su pmap:

2013-03-08 12:09:00
total 986528K
2013-03-08 12:14:01
total 990680K
2013-03-08 12:21:00
total 998880K
2013-03-08 12:34:00
total 1007072K

Auga, bjaurybė, vos su 5 TPS (transakcijom per sekundę). Nu tai ir gerai, nutekėjimas tikras. Beje, SOAP serveris nieko nedaro, tik siunčia tuščią atsakymą atgal. Jokios ten logikos, skaičiavimų ar duomenų bazės operacijų. Plikas nuogas.

Ką gi, baigėsi apkrovos testas, dabar su gcore komanda „laužiam“ procesą ir generuojam core dump’ą:

$ gcore 4519
gcore: core.4519 dumped

Toliau leidžiam mdb ir rašom ten komandą ::findleaks:

mdb core.4519
 Loading modules: [ libumem.so.1 libc.so.1 libuutil.so.1 ld.so.1 ]
 > ::findleaks
 mdb: [ffffffff75b00000, ffffffff75b08000): couldn't read 16384 bytes at ffffffff75b00000: no mapping for address
 BYTES LEAKED VMEM_SEG CALLER
 16384 16 ffffffff5f6ee000 MMAP
 8192 1 ffffffff75732000 MMAP
 8192 1 ffffffff71512000 MMAP
 8192 1 ffffffff71510000 MMAP
 8192 1 ffffffff7150e000 MMAP
 8192 1 ffffffff7150c000 MMAP
 8192 1 ffffffff7150a000 MMAP
 8192 1 ffffffff71508000 MMAP
 8192 1 ffffffff638c0000 MMAP
 8192 1 ffffffff63480000 MMAP
 8192 1 ffffffff63320000 MMAP
 24576 1 ffffffff63280000 MMAP
 8192 1 ffffffff62100000 MMAP
 8192 1 ffffffff5f8f4000 MMAP
 16384 1 ffffffff5f8ee000 MMAP
 8192 1 ffffffff5f6f4000 MMAP
 ------------------------------------------------------------------------
 Total 16 oversized leaks, 163840 bytes
CACHE LEAKED BUFCTL CALLER
 0000000100398028 1 00000001011e78c0 libCrun.so.1`__1c2n6FL_pv_+0x24
 000000010039c028 515 00000001010c2ff0 libCrun.so.1`__1c2n6FL_pv_+0x24
 000000010039c028 4 0000000103b10e00 libCrun.so.1`__1c2n6FL_pv_+0x24
 000000010038e028 1 0000000101126e10 libCrun.so.1`__1c2n6FL_pv_+0x24
 000000010038e028 1 0000000101198000 libCrun.so.1`__1c2n6FL_pv_+0x24
 000000010038e028 1194 0000000100c95370 libCrun.so.1`__1c2n6FL_pv_+0x24
 000000010038e028 124 000000010112b8b0 libCrun.so.1`__1c2n6FL_pv_+0x24
 000000010038e028 398 0000000100c95d10 libCrun.so.1`__1c2n6FL_pv_+0x24
 0000000100392028 1 0000000100fd31b0 libCrun.so.1`__1c2n6FL_pv_+0x24
 00000001003a4028 16 000000010122c0e0 libCrun.so.1`__1c2n6FL_pv_+0x24
 0000000100392028 2 0000000103b3ce00 libCrun.so.1`__1c2n6FL_pv_+0x24
 0000000100398028 9 0000000103e60550 libCrun.so.1`__1c2n6FL_pv_+0x24
 0000000100392028 3 0000000108dfa1c0 libCrun.so.1`__1c2n6FL_pv_+0x24
 0000000100398028 30 0000000104de81e0 libCrun.so.1`__1c2n6FL_pv_+0x24
 0000000100392028 1 00000001011409e0 libCrun.so.1`__1c2n6FL_pv_+0x24
 0000000100390028 70 0000000100a26fc0 libCrun.so.1`__1c2n6FL_pv_+0x24
 >> More [<space>, <cr>, q, n, c, a] ?

Nutekėjimų, vaizdžiai tariant, dachuja ir biškį. O dabar rašom ::quit ir einam daryt rimtesnių analizų.

Komentarai
  1. Laimis parašė:

    “export UMEM_LOGGING=transaction“ priskyrimas ir exportavimas, blė, viena eilute 🙂

    • Darau, Blė parašė:

      Ne. Gal pas mane nusenęs soliaris ir bash’as, bet neveikia, net ir .profile. Deja.

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti /  Pakeisti )

Google photo

Jūs komentuojate naudodamiesi savo Google paskyra. Atsijungti /  Pakeisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti /  Pakeisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti /  Pakeisti )

Connecting to %s

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.