Mälu silumine Linuxis: peamised tööriistad ja tehnikad

Viimane uuendus: 26 veebruari 2026
  • Linux pakub käske nagu free, vmstat, ps ja top, et kontrollida mälu ja protsessori tegelikku kasutust, eristades kasutatud, vaba ja vahemällu salvestatud mälu.
  • Tööriistad nagu GDB ja Valgrind võimaldavad tuvastada segmenteerimisvigu, mälulekkeid, ebaseaduslikke juurdepääsusid ja initsialiseerimata muutujaid natiivprogrammides.
  • .NET Core'i keskkondades hõlbustab dotnet-dump, LLDB ja SOS kombinatsioon mälutõmmiste süvaanalüüsi nii Linuxis kui ka Windowsis.
  • Korrastatud diagnostika töövoog, mis ühendab süsteemi mõõdikuid, logisid ja mälutõmmiste analüüsi, vähendab oluliselt mäluprobleemide leidmise ja parandamise aega.

Mälu silumine Linuxis

Kui Linuxi serveris midagi valesti läheb, peitub põhjus sageli mälu kasutamises ja veaotsingu tööriistades , kuid kuni te ei tea, mida otsida, tundub kõik kaootilise numbrite ja protsesside segadusena. RAM-is toimuva, programmide käitumise ja mälutõmmiste jäädvustamise mõistmine on võtmetähtsusega, et vältida pimesi tõrkeotsingut iga kord, kui ilmneb kummaline tõrge või segmenteerimisviga.

Selles artiklis vaatleme üksikasjalikult ja lihtsalt, kuidas Linuxis mälu kontrollida, programme siluda ja dumpimisi analüüsida, kasutades süsteemikäsklusi (free, vmstat, /proc/meminfo), silujaid (nt GDB), mäluanalüsaatoreid (nt Valgrind) ning .NET-i ja muude keskkondade spetsiifilisi utiliite. Eesmärk on anda teile praktiline arsenal mälu ja protsessori probleemide diagnoosimiseks serverites ja professionaalsetes arenduskeskkondades.

Ülevaade: mälu Linuxis ja miks ei tohiks keskenduda üle 100%

Linuxi serveris toimib RAM kiire salvestusruumina andmetele ja koodile, mida süsteem peab peagi taaskasutama. RAM-ile juurdepääs on palju kiirem kui kettale juurdepääs, seega kasutab kernel seda ära, et kasutada seda vahemäluna failide, puhvrite ja mälulehtede jaoks, mida võidakse peagi uuesti vaja minna.

Apache'i või Nginxi käitava veebiserveri või MySQL-i või MariaDB-taolise andmebaasiserveri kontekstis on teenuste suuruse õigeks määramiseks ning nimeruumide ja c-rühmade mõistmiseks ülioluline teada, kui palju mälu on kasutusel, kui palju on vaba ja kui palju on vahemällu salvestatud . Tegelikult kasutavad optimeerimistööriistad, näiteks MySQLTuner , neid andmeid (ja muud teavet) puhvri, vahemälu ja ühenduse sätete soovitamiseks.

Oluline on mõista kontseptsiooni, mis inimesi alguses sageli üllatab: RAM on loodud kasutamiseks . 90% või isegi 100% kasutuse nägemine ei ole tingimata probleem; Linux täidab RAMi ketta vahemäluga, et süsteemi kiirendada. Tõeliselt murettekitav on see, kui hakkate saama mälu otsasoleku veateateid , protsessid jooksevad kokku OOM-i (mälu otsas) teatega või teenused hanguvad, mitte ainult siis, kui graafik näitab "suurt kasutust".

Agressiivse optimeerimise juurde minek on mõistlik ainult siis, kui märkate, et server muutub ebastabiilseks, aeglaseks või peatab teenused liigse mälukasutuse tõttu või kui teate, et tulemas on liikluse hüpped, mis võivad praegused ressursid üle koormata.

Linuxi mälu kontrollimise põhikäsklused

Mälu tööriistad Linuxis

Mäluprobleemide tõrkeotsingu esimene samm on mõista oma kogu RAM-i ja selle jaotust kasutatud mälu, vaba mälu, vahemälu ja saalemälu vahel. Linux pakub selleks mitmeid utiliite, millest igaühel on erinev detailsusaste.

vaba käsk: kiire ülevaade RAM-ist ja swapist

Kiire ülevaate saamiseks kõige sagedamini kasutatav käsk on tasuta, eriti parameetriga -h Suuruste loetavas vormingus kuvamiseks: Lisateavet nende mõõdikute tõlgendamise ja optimeerimise kohta leiate jaotisest optimeerida mälustatistikat.

free -h

Tüüpiline väljund näitab paari reaga nii RAM-i kui ka saalemälu kogumahtu, kasutatud mälumahtu, vaba mälumahtu, jagatud mälumahtu, puhvermälu ja vahemälu mahtu . Näete midagi sellist:

Kokku kasutatud vabad jagatud puhvrid vahemällu salvestatud Mälu: 2.0G 1.5G 470M 300M 0B 414M -/+ puhvrid/vahemälu: 1.1G 885M Vahetatav: 0B 0B 0B

Joon -/+ buffers/cache See on eriti kasulik, kuna näitab protsesside poolt tegelikult kasutatavat mälu (välja arvatud puhvermälu/vahemälu) ja potentsiaalselt uute rakenduste jaoks saadaolevat mälu. Paljud inimesed näevad esimesel real vähe "vaba mälu" ja ehmuvad, kuigi tegelikult on suur osa sellest lihtsalt vahemällu salvestatud ja seda saab... taaskasutatud ilma draamadeta.

vmstat: aktiivse ja jõudeoleku mälu ning süsteemi mõõdikud

Kui vajate midagi detailsemat, pakub vmstat süsteemist tehnilisema pildi. Kasutades järgmist:

vmstat -s -S M

Saate nimekirja kogu mälu, kasutatud mälu, vaba mälu, aktiivse mälu, mitteaktiivse mälu, puhvrite, vahetusmälu jms kohta. Näiteks:

2048 M mälu kokku 1582 M kasutatud mälu 1124 M aktiivset mälu 406 M mitteaktiivset mälu 465 M vaba mälu 0 M puhvermälu 407 M vahetusmälu 0 M vahetusmälu kokku 0 M kasutatud vahetusmälu 0 M vaba vahetusmälu

Jõudemälu kontseptsioon on huvitav: see on mälu, mida peetakse kasutuses olevaks, kuid mis ei ole seotud aktiivsete protsessidega, seega praktilistel eesmärkidel käitub see nagu mälu, mida süsteem saab taastada . See aitab selgitada, miks Linux võib tunduda "kogu ruumi ära kasutavat", kuid tegelikkuses on tal ruumi, mida vajadusel vabastada.

/proc/meminfo: toore kerneli üksikasjad

Kui soovid näha kõiki üksikasju, mida kernel haldab, võid alati vaadata faili /proc/meminfo :

cat /proc/meminfo

See fail sisaldab kümneid sisemälu haldamisega seotud välju : kogumälu, vaba mälu, puhvrid, vahemälu, slab, hugepages, saadaolev mälu jne. See on väga kasulik automatiseeritud tööriistade ja jälgimisskriptide jaoks, kuigi selle otse lugemine on mõnevõrra vähem kasutajasõbralik kui `free` või `vmstat` ja nõuab iga välja tähenduse põhjalikku mõistmist.

Juhtpaneelid ja nende „paralleelreaalsus“

Kui haldate serverit selliste juhtpaneelidega nagu cPanel, Plesk, VestaCP või Webmin , näete, et need kuvavad tavaliselt veebiliidese kaudu kasutatud, vaba ja vahemällu salvestatud mälu graafikuid. See teave on mugav, kuid pidage meeles, et seda värskendatakse perioodiliselt ja mõnikord ei kajasta see täpset reaalajas olekut. Põhjalikuks diagnostikaks ja peenhäälestamiseks on alati kõige parem kasutada terminali ja selle natiivseid käske.

Protsesside ja mälu silumine süsteemitööriistadega

Kui teate, kui palju mälu on saadaval ja kuidas seda üldiselt kasutatakse, on järgmine samm leida, millised protsessid tarbivad ressursse ebanormaalselt ja analüüsida nende käitumist. Siin tulevad mängu klassikalised utiliidid nagu ps, top, htop, strace ja ltrace, aga ka võrgu- ja kettakäsklused, mis aitavad pudelikaelu kõrvaldada.

ps, top ja htop: protsesside ja protsessori röntgenülevaade

Käsk `ps` kuvab aktiivseid protsesse. Koos filtrite ja sortimisega võimaldab see teil kiiresti leida, mis protsessori koormust tarbib.

ps aux --sort=-%cpu | head

See näitab protsesse, mis on sorteeritud protsessori kasutuse protsendi , mälukasutuse, kasutaja ja käsu järgi. See on ideaalne hetktõmmis peamise kahtlusaluse tuvastamiseks, kui serveri ressursid hakkavad otsa saama; terminali valdamine aitab teil kiiresti tegutseda.

  Täielik juhend Ubuntu serveri seadistamiseks ja haldamiseks

Teisest küljest pakuvad `top` ja selle visuaalsem variant `htop` reaalajas vaadet protsessidele, protsessori kasutusele, mälu kasutusele, olekule (R, S, D jne) ja keskmisele koormusele . Alustades `top`-ist:

top -o %CPU

Saate keskenduda sellele, millised protsessid kasutavad kõige rohkem protsessorit. Lisaks numbritele on oluline otsida mustreid :

  • R (töötavas) olekus protsessid mis jäävad pikaks ajaks tippu kinni.
  • Koormuse keskmise järsk muutus mis näitavad hiljutisi koormuse järske tõuse.
  • Protsessori jaotus %us, %sy ja %wa (kasutaja aeg, süsteemi aeg ja I/O ooteaeg).
  • Kui problemaatiline protsess on süsteemiteenus, konkreetne kasutaja või deemon.
  • Kui tarbimine on stabiilne või See käib tõmblustega üles-alla., mis võib viidata partiiülesannetele või ebaregulaarsele liiklusele.

Väga kõrge %wa (I/O ooteaeg) väärtus viitab sellele, et pudelikael ei pruugi olla protsessoris, vaid kettal või salvestussüsteemis.

Protsessi lõimede ülevaatamine: top -H

Mitmelõimeliste rakenduste (Java, Python, Node jne) puhul ei piisa ainult teadmisest, milline protsess protsessorit tarbib; on vaja näha, milline konkreetne lõim kontrolli alt väljub.

top -H -p PID

Saate iga protsessi lõime üksikasjad. Kui üks neist on 100% ja ülejäänud on jõude, on selles koodiosas tõenäoliselt tegemist lõputu tsükli, kummalise blokeerimisprobleemi või halvasti kavandatud kriitilise osaga .

Protsessi prioriteet: kena ja kena

Kui ressursimahukas protsess on küll õigustatud, aga te ei soovi, et see ülejäänud süsteemi üle koormaks, saate selle prioriteeti (niceness) muuta. Käsud `nice` ja `renice` võimaldavad teil käivitada madalama prioriteediga protsesse või muuta olemasoleva protsessi prioriteeti, nii et kernel eraldab neile vähem protsessori aega võrreldes teiste kriitiliste ülesannetega.

Muud klahvikäsklused: pidof, kill, strace ja ltrace

Kui süsteem on surve all, on kasulik protsesse kiiresti leida ja juhtida:

  • pidof: hangib protsessi PID-i selle nimest, sobib ideaalselt skriptide või kiirete sekkumiste jaoks.
  • tapmasaadab protsessidele (TERM, KILL jne) signaale kas korrapäraseks sulgemiseks või töö katkestamiseks, kui need on kinni jäänud.
  • kiirus: näitab süsteemikõned mis teostab protsessi; ideaalne selle nägemiseks, millele see kinni on jäänud (ketta lugemised, soklid jne).
  • ltraceSarnane strace'iga, aga keskendub kõned raamatupoodidesse, kasulik jagatud API kasutusprobleemide silumiseks.

Need tööriistad pole kasulikud mitte ainult mälulekete või krahhide otsimiseks, vaid neid kasutatakse laialdaselt ka küberturvalisuses, kohtuekspertiisi analüüsis ja kummalise binaarkäitumise silumisel .

Failide ja ketta käsud: lsof, df, du, locate

Kui kahtlustate, et salvestusruumiga on midagi valesti (näiteks palju avatud faile või täis kettaid), tulevad mängu teised käsud:

  • lsof: loetlege protsessi poolt avatud failid, kasulik deskriptorite või failide lekete leidmiseks, mis takistavad failisüsteemi lahtiühendamist.
  • df: näitab vaba kettaruumi failisüsteemi järgi, mis on oluline, et välistada 100% ketastest, mis põhjustavad kaskaadseid rikkeid.
  • duarvutage kataloogide poolt kasutatav ruum, väga kasulik kontrollimatult kasvavate kaustade (logid, varukoopiad jne) leidmiseks.
  • leidke: võimaldab teil otsida faili nime järgi indekseeritud andmebaasi abil, mis on paljudes olukordades kiirem kui lihtsalt leidmine.

Diagnostika võrgukäsklused: nc, netstat, ab, tcpdump, wireshark, nmap

Sageli kaasnevad jõudlus- ja mäluprobleemidega võrgu kitsaskohad või rünnakud , seega on hea mõte käepärast hoida mõned põhilised tööriistad:

  • nc (netcat): tõeline Šveitsi armee võrgundusnuga; avab sokleid, saadab ja võtab vastu andmeid, võimaldab teenuste testimist ja isegi improviseeritud tunnelite loomist.
  • netstat: kuvab aktiivseid ühendusi, kuulamispesasid ja võrgustatistikat, mis on kasulik selle nägemiseks, kas konkreetse pordiga on palju ühendusi.
  • ab (Apache võrdlustest): genereerib veebiserverile koormuse, et mõõta reageerimisaegu ja käitumist stressiolukorras.
  • tcpdump ja Wireshark: võrgupakettide jäädvustamine analüüsige liiklust põhjalikult; tcpdump konsoolis, Wireshark graafilise liidesega.
  • nmapPordi ja teenuse skanner, mida kasutatakse laialdaselt nii turvaauditite kui ka kontrollimise jaoks serveri kokkupuutepind.

GDB: klassikaline silur mäluvigade ja käitusaegsete krahhide jaoks

Kui Linuxi programm jookseb kokku segmenteerimisvea või muu suurema vea tõttu, on järgmine loogiline samm hea siluri kasutamine. GNU maailma staartööriist on GDB (GNU Debugger) , mis võimaldab teil kontrollida programmi sisemist olekut, peatada selle kus iganes soovite, vaadata muutujaid ja mälukasutust ning jälgida täitmist samm-sammult.

GDB oli algselt loodud C ja C++ programmide jaoks, kuid seda on laiendatud ka teistele keeltele, näiteks Rust ja isegi Assembly , ning teekide teede (nt LD_LIBRARY_PATH) haldamisele . See on oluline nii arenduses kui ka küberturvalisuses, kus seda kasutatakse pöördprojekteerimiseks, haavatavuste leidmiseks ning ärakasutamise arendamiseks või silumiseks.

Käivita GDB ja käivita programm

GDB kasutamiseks käivitatava failiga on soovitatav programm kompileerida silumisteave kasutades valikut -g Pärsia lahe koostöönõukogust:

gcc -g -Wall programa.c -o programa

Seejärel käivitate selle järgmiselt:

gdb programa

GDB-s programm veel ei tööta. Selle saab käivitada järgmiselt:

  • jooksKäivita programm suvaliste argumentidega.
  • algus: sama mis run, aga peatub funktsiooni alguses main.

Kui sul on näiteks käivitatav fail nimega Suma Ja kui soovite näha, kuidas see oma argumente töötleb, peaksite minema GDB-sse ja seejärel kasutama run 3 5 et see silujast nende parameetritega käivitada.

Katkestuspunktid ja jälgimispunktid: programmi peatamine seal, kus seda vaja on

Katkestuspunktid on lähtekoodi peatuspunktid: kui need saavutatakse, peatub programmi täitmine ja saate kontrollida selle sisemist olekut. GDB-s defineeritakse need käsuga :

break lugar

kus „asukoht” võib olla funktsiooni nimi, reanumber või file:line . Tüüpiline näide oleks:

break main

nii et GDB peatub kohe, kui see siseneb põhifunktsiooni. Kui programm peatub katkestuspunktis, saate koodi vaadata l-iga (loend), kontrollida muutujaid ja navigeerida väljakutsete pinus.

Jälgimispunktid toimivad erinevalt: koodi kindlas punktis peatumise asemel peatuvad nad siis, kui muutuja väärtus muutub . Need on väga kasulikud mälu rikkumise või kriitiliste struktuuride ootamatute muudatuste tuvastamiseks ilma, et peaksite koodi printimislausetega üle ujutama.

Peenvoolu juhtimine: samm, järgmine, jätka, lõpeta

Kui programm on katkestuspunktis peatatud, on teil mitu võimalust edasi liikuda:

  • samm: käivitab järgmise rea ja sisestab kutsutud funktsioonid.
  • järgmine: käivitab järgmise rea ilma funktsioone sisestamata (käivitab need "kõik korraga").
  • jätkama: jätkab täitmist kuni järgmise katkestuspunktini või kuni programmi töö lõpetamiseni.
  • lõpetama: jätkub seni, kuni praegune funktsioon naaseb ja läheb tagasi punkti, kust seda kutsuti.
  Podman, KVM ja konteinerid: praktiline juhend turvalise virtualiseerimise kohta

See võimaldab teil kahtlast koodi samm-sammult uurida, ilma et peaksite kogu programmi "neelama". Käepärane nipp: GDB-s Enteri vajutamine kordab viimast käskuideaalne paljude valmistamiseks next o step millele järgneb vähem trükkimist.

Kõnede pinu ja raamid: vaadake, kuidas me siia jõudsime

Selleks, et mõista, miks teatud hetkel tõrge tekkis, on oluline näha, milliseid funktsioone enne seda kutsuti. Struktuur, mis seda teavet salvestab, on väljakutsete pinu . GDB pakub selle haldamiseks mitmeid käske:

  • bt (tagasijälgimine): näitab kogu pinu koos pesastatud funktsioonide loendi ja kaadrinumbritega.
  • up: liigub pinus ühe taseme võrra ülespoole, punkti, kus praegust funktsiooni kutsuti.
  • alla: liigub ühe taseme võrra allapoole, funktsiooni juurde, mis töötas.
  • fr (kaader): kuvab praeguse kaadri või võimaldab teil selle numbri abil teisele lülituda.

See võimaldab sul positsioneerida end kutse erinevatel tasemetel (näiteks hüpates sisemisest funktsioonist peafunktsiooni ) ja näha, kuidas muutujad igas kohas paiknesid.

Mäluga suhtlemine: set, return, backtrace yx

Üks GDB suuri eeliseid on see, et see võimaldab teil programmi peatamise ajal mälu lugeda ja muuta . Mõned kasulikud toimingud hõlmavad järgmist:

  • komplekt: muudab muutuja väärtust täitmise ajal, ideaalne stsenaariumide testimiseks ilma uuesti kompileerimiseta.
  • tagastusväärtus: sunnib praegust funktsiooni tagastama määratud väärtuse ilma koodi käivitamist jätkamata.
  • tagasijälgimine: juba nähtud, praeguse kõnede pinu kuvamiseks.
  • x: uurib mälu sisu alates aadressist, erinevate vormingute ja suurustega (näiteks x/4xw 0x7fffffffe000 et näha nelja sõna kuueteistkümnendsüsteemis).

Nende valikute abil saate vigu replikeerida, kontrollida, kas ohtlik sisend põhjustab ületäitumist, või uurida keerulisi andmestruktuure pinus või heapis.

Pärast surma vigade silumine põhitõmmistega

Linux saab genereerida põhifaili , kui protsess peaks signaali (nt SIGSEGV) tõttu krahhi tegema. See fail sisaldab protsessi täielikku olekut krahhi ajal: mälu, registreid, pinu jne. Selle seansi ajal aktiveerimiseks tehke lihtsalt järgmist:

ulimit -c unlimited

Nende püsivamaks lubamiseks kasutajatele saate muuta faili /etc/security/limits.conf ja lisada sellise rea:

* soft core unlimited

Kui programm krahhi läheb, genereerib see töökataloogi faili, mida tavaliselt nimetatakse "core" . Seejärel saate seda GDB-ga analüüsida järgmiselt:

gdb ejecutable core

See võimaldab teil teha post mortem analüüsi peaaegu nii, nagu oleks programm ikka veel elus, mis on ideaalne olukorras, kus riket ei ole nõudmisel lihtne korrata.

Valgrind: mälulekete ja vigade otsimine

Paljude C/C++ (ja sarnaste keelte) mäluprobleemide lahendamiseks ei ole GDB piisav, kuna see ei ole loodud automaatselt tuvastama illegaalseid lugemisi, lekkeid või initsialiseerimata mälukasutust . Siin tulebki mängu Valgrind – veatuvastus- ja profileerimissüsteem, mis emuleerib protsessorit ja jälgib iga mälupöördust.

Valgrind sisaldab mitmeid tööriistu, kuid enimkasutatav on Memcheck , mis asendab C standardse mäluhalduri omaenda tööriistaga, mis sisaldab eraldatud plokkide ümber kaitsetsoone . See võimaldab tal tuvastada:

  • Initsialiseerimata mälukasutus (muutujad, mida kasutatakse enne neile väärtuse määramist).
  • Lugemised/kirjutused pärast vaba aja veetmist (kasutus pärast vabaks ostmist).
  • Juurdepääs väljaspool piire mäluplokist.
  • Mälu lekked (vabade elementideta malloc, kadunud pointerid jne).

Veavaba näide: „puhas” programm Memchecki all

Oletame, et kompileerid väikese "tere maailm" programmi koos silumisinfoga:

gcc -Wall -gstabs valgrind_hello_good.c -o valgrind_hello_good

Kui käivitate selle Valgrindi all järgmiselt:

valgrind --tool=memcheck --leak-check=full -v ./valgrind_hello_good

Saate jälje, mille lõpus näitab TÕRGETE KOKKUVÕTE 0 viga ja lekkeid ei teatata. See kinnitab, et vähemalt Memchecki seisukohast ei esine programmil mäluanomaaliaid.

Mälulekete tuvastamine

Kui muudate koodi nii, et see teeb malloc'i ilma vabastamata (näiteks reserveerite baidi ja ei vabasta seda kunagi) ja kompileerite uuesti:

gcc -Wall -gstabs valgrind_hello_bad.c -o valgrind_hello_bad

jooksmise ajal:

valgrind --tool=memcheck --leak-check=full -v ./valgrind_hello_bad

Valgrind kuvab HEAP SUMMARY väärtusega "kasutuses väljumisel", mis erineb nullist ja näitab vabastamata mälu hulka. Lisaks näitab "kindlasti kadunud" osa lekkinud baitide ja plokkide arvu koos lekke põhjustanud kõne jäljega (funktsioon, fail ja koodirida).

Keerukamate juhtumite puhul, kus kasutatakse filtreid, näiteks 100 baiti leak() funktsioonisValgrindi väljapääs näitab sulle selgelt suunda. malloc problemaatiline, võimaldades lisada free vastavat ja kontrollige hiljem, et kokkuvõttes ei oleks lekkeid.

Ebaseaduslikud teod ja leviulatusest väljas juurdepääs

Teine tüüpiline viga, mida Memcheck tuvastab, on kirjutamine sobimatutele aadressidele , näiteks mäluasukohale 0 (NULL) või massiivi lõpust kaugemale kirjutamine. Kui kompileerite programmi, mis teeb sobimatu kirjutamise:

gcc -gstabs -Wall valgrind_illegal_read_write.c -o valgrind_illegal_read_write

ja käivitate selle koos:

valgrind -v ./valgrind_illegal_read_write

Näete selliseid sõnumeid:

Kehtetu kirjutus suurusega 4 aadressil 0x80483C4: main (valgrind_illegal_read_write.c:8) Aadress 0x0 ei ole virnastatud, malloceeritud ega (hiljuti) vabastatud

See näitab täpselt, kus ebaseaduslik kirjutamine toimus ja kui ulatuslik see oli, mis tavalistes teostustes avaldub tavaliselt lihtsa "segmenteerimisveana" ilma edasiste vihjeteta.

Initsialiseerimata muutujad ja nende väärtussõltuvused

Memcheck annab sulle ka märku, kui Juhtimisotsus sõltub initsialiseerimata muutujastKui kompileerite programmi lokaalse muutujaga, mida kunagi ei initsialiseerita ja mida kasutatakse if:

gcc -gstabs -Wall valgrind_unitialized.c -o valgrind_unitialized

ja sa käivitad selle järgmiselt:

valgrind -v --track-origins=yes ./valgrind_unitialized

Väljund sisaldab midagi sellist:

Tingimuslik hüpe või liikumine sõltub initsialiseerimata väärtusest/väärtustest aadressil 0x80483F2: main (valgrind_unitialized.c:9). Initsialiseerimata väärtus loodi pinu eraldamisega aadressil 0x80483EA: main (valgrind_unitialized.c:7).

Parameeter –track-origins=yes aitab leida algväärtustamata muutuja loomise koha, mis kiirendab oluliselt koodi parandamist.

Vaba ja vigade tuvastamise väärkasutamine kuhjas

Valgrind kinnitab seda ka Free kutsutakse välja ainult kehtivate pointerite korralKui proovite vabastada mälu, mis ei pärine mallocVõi kui topeltklõpsate samal plokil, saate selliseid teateid:

Vigane free() / delete / delete[] / realloc() funktsioonid aadressil 0x402B06C: free (...) funktsiooni 0x8048449 poolt: main (valgrind_illegal_free.c:11)

Paljudel juhtudel näitab see isegi aadressi, kust helistate. free See asub kohe pärast juba vabastatud plokki, võimaldades tuvastamist kursori arvutusvead või topeltväljalasked.

  SparkyLinux Tiamat ja selle uued funktsioonid jooksvas harus

Kokkuvõttes on Valgrind oluline tööriist mälulekke, pärast vabastamist kasutamise või mälu rikkumise kahtluse korral natiivprogrammides ning selle kooskasutamine GDB-ga annab väga võimsa ülevaate rakenduste sisemisest olekust.

Põhiväljavõtted ja analüüs Linuxis ja Windowsis

Tänapäevastes rakendustes, eriti .NET Core'is , hõlmab keeruliste mälu- või jõudlusprobleemide analüüsimine sageli mälutõmmiste jäädvustamist hoolikaks analüüsimiseks teises masinas. Need mälutõmmised külmutavad protsessi oleku teatud ajahetkel, täpselt nagu traditsiooniline põhitõmmis.

.NET-i prügimägede analüüsimine Linuxis dotnet-dumpi ja LLDB abil

Linuxi .NET Core keskkondades on üks soovitatavatest tööriistadest dotnet-dump . Pärast mälutõmmise jäädvustamist saate analüüsi alustada järgmiselt:

dotnet-dump analyze <dump-file>

On oluline, et analüüs tehtaks sama arhitektuuri ja Linuxi distributsiooniga masinal nagu keskkond, kus mälutõmmis genereeriti. dotnet-dump on suunatud hallatud .NET-koodile; natiivse koodi (C/C++) analüüsimiseks on sobivam kasutada LLDB-d koos SOS- laiendiga.

LLDB võimaldab teil siluda nii hallatavat kui ka natiivset koodi ning dotnet-sos abil saate installida SOS-laienduse, mis pakub .NET-ile spetsiifilisi käske. .NET Core'i prügimäe korrektseks laadimiseks vajavad LLDB ja SOS teatud binaarfaile keskkonnast, kus prügimägi loodi:

  1. libmscordaccore.so
  2. libcoreclr.so
  3. dotnet (rakenduse käivitamiseks kasutatud host)

Neid binaarfaile saab tavaliselt alla laadida tööriista dotnet-symbol abil . Kui tegemist on privaatse versiooniga või need ei asu sümbolserveris, saate need alati algsest masinast kopeerida. Kui binaarfailid ei ole mälutõmmisfaili kaasas, saate LLDB/SOS-is kasutada järgmist:

  • setclrpath <ruta> et näidata, kus .NET Core'i binaarfailid asuvad.
  • setsymbolserver -directory <ruta> sümbolite asukoha määramiseks.

Kui kõik vajalik on olemas, laadige fail LLDB-sse, määrates silumiseks käivitatava failina dotneti hosti:

lldb --core <dump-file> <host-program>

Siin See on tee prügimäele ja Tavaliselt on see binaarne. dotnet, välja arvatud juhul, kui tegemist on iseseisva rakendusega, sellisel juhul oleks see rakenduse enda käivitatav fail (ilma .dll-laiendita).

LLDB-s on sageli vaja seadistada õige sümboliserver setsymbolserver -ms Microsofti serveri kasutamiseks või setsymbolserver -directory <ruta> kohaliku kataloogi jaoks ja käivitage loadsymbols natiivsete sümbolite laadimiseks. Sealt edasi saate hallatava heapi, lõimede, erandite jms analüüsimiseks kasutada tavapäraseid SOS-käske.

Linuxi prügimäe analüüs Windowsist

Linuxis genereeritud prügimägesid ei saa analüüsida ainult samas süsteemis; neid saab avada ka Windowsist selliste tööriistadega nagu Visual Studio, WinDbg või dotnet-dump. Võimalused on erinevad:

  • Visual Studio: võimaldab prügimägesid puhastada seguga natiivne ja hallatud koodväga kasutajasõbraliku graafilise liidesega. Soovitatav on tutvuda konkreetse juhendiga Visual Studio mälutõmmiste silumine.
  • windbgTäiustatud tugi kasutaja prügimägedele, sh Linuxi prügimäed Windowsi omaga sarnase töövooga. Linuxi x64 või Arm64 keskkondadest pärit mälutõmmiste jaoks peate kasutama WinDbg x64 versiooni ja x86 mälutõmmiste jaoks x86 versiooni.
  • dotnet-dump Windowsis: seda kasutatakse samamoodi nagu Linuxis, koos dotnet-dump analyzePea meeles, et tööriista x64 või x86 versioon tuleb valida vastavalt prügimäe arhitektuurile.

Kõrge protsessori ja mälu kasutuse professionaalne diagnoosimine

Lisaks konkreetsetele tööriistadele hõlmab mälu puhastamine Linuxis tavaliselt struktureeritud töövoogu , et vältida juhuslikke toiminguid. Praktiline skeem serverite jaoks on järgmine:

  • Vaata ülemine kahtlaste laadimismustrite ja -protsesside tuvastamiseks.
  • Kinnitage nupuga ps protsessid, mis kasutavad kõige rohkem protsessorit ja mälu.
  • Kontrollige, kas tarbimine on loogiline (kompilatsioonid, partiitöötlus, indekseeritud) või tundub anomaalse käitumisena.
  • Lõimede analüüsimine ülemine -H -p PID kui tegemist on mitmekeermeliste protsessidega.
  • kontrollima teeninduslogid journalctl või saba abil.
  • Kontrolli, kas probleem on tõesti protsessoriga seotud või peidetud... ketta sisend/väljund iostati kasutades.

Selleks, et teha kindlaks, kas pudelikael on protsessoris või ketas, on iostat -xz 1 3 väga kasulik: kui näete kettaid, millel on kõrge kasutusaste ja pikad ooteajad koos kõrge %wa väärtusega failis top , siis pole probleem tõenäoliselt protsessoris, vaid salvestusruumis.

Selle töövoo rakendamisega on lihtsam diagnoosida selliseid juhtumeid nagu:

  • Botid või pahatahtlik liiklus php-fpm protsesside käivitamine ja veebiserveri ülekoormamine.
  • Un Java mikroteenus lõpmatu tsükliga niidiga tarbides terve südamiku.
  • Pythoni protsess, mis näib olevat protsessoriga seotud, aga tegelikult on lukus, ootab ketast tsükli igas iteratsioonis.

Süsteemitööriistu (ps, top, vmstat, free), silujaid (GDB, LLDB, dotnet-dump), mäluanalüsaatoreid (Valgrind) ning võrgu- ja kettakäsklusi kombineerides saab luua tööviisi, kus Linuxi mälu- ja jõudlusprobleemid lakkavad olemast must kast , vaid muutuvad millekski, mida saab meetodi ja kannatlikkusega märkimisväärse täpsusega tuvastada ja parandada.

täiustatud süsteemimonitor Linuxile
Seotud artikkel:
Täiustatud süsteemimonitor Linuxile: täielik juhend