Att ta reda på hur mycket RAM-minne en Linux-process använder är inte en enkel sak—särskilt när delat minne måste övervägas. Tack och lov hjälper pmap-kommandot dig att förstå det hela.
Minnesmapping
På moderna operativsystem lever varje process i sin egen tilldelade region av minne eller allokeringsutrymme. Gränserna för den allokerade regionen mappas inte direkt till fysiska hårdvaruadresser. Operativsystemet skapar ett virtuellt minnesutrymme för varje process och fungerar som ett abstraktionslager som mappar det virtuella minnet till det fysiska minnet.
Kärnan upprätthåller en översättningstabell för varje process, och denna nås av CPU:n . När kärnan ändrar processen som körs på en viss CPU-kärna uppdaterar den översättningstabellen som binder samman processer och CPU-kärnor.
Fördelarna med abstraktion
h2>
Det finns fördelar med detta system. Användningen av minne är något inkapslad och sandlåda för varje process i användarlandet. En process som bara “ser” minne i termer av de virtuella minnesadresserna. Det betyder att den bara kan fungera med det minne som den har fått av operativsystemet. Om den inte har tillgång till något delat minne, känner den varken till eller har tillgång till minnet som är allokerat till andra processer.
Abstraktionen av det hårdvarubaserade fysiska minnet till virtuella minnesadresser låter kärnan ändra den fysiska adressen som ett virtuellt minne är mappat till. Den kan byta minne till disk genom att ändra den faktiska adressen som en region med virtuellt minne pekar på. Det kan också skjuta upp tillhandahållandet av fysiskt minne tills det faktiskt krävs.
Annons
Så länge förfrågningar om att läsa eller skriva minne betjänas som de begärs, är kärnan fri att jonglera med mappningstabellen som det passar.
RAM on Demand
Kartläggningstabellen och konceptet “RAM on demand” öppnar upp möjligheten till delat minne. Kärnan kommer att försöka undvika att ladda samma sak i minnet mer än en gång. Till exempel kommer det att ladda ett delat bibliotek i minnet en gång och mappa det till de olika processer som behöver använda det. Var och en av processerna kommer att ha sin egen unika adress för det delade biblioteket, men de kommer alla att peka på samma faktiska plats.
Om den delade minnesregionen är skrivbar, använder kärnan ett schema som kallas kopiera-på-skriv. Om en process skriver till det delade minnet och de andra processerna som delar det minnet inte ska se ändringarna, skapas en kopia av det delade minnet vid punkten för skrivbegäran.
Linux-kärnan 2.6.32, som släpptes i december 2009, gav Linux en funktion som heter “Kernel SamePage Merging.” Detta innebär att Linux kan upptäcka identiska regioner av data i olika adressutrymmen. Föreställ dig en serie virtuella maskiner som körs på en enda dator, och de virtuella maskinerna kör alla samma operativsystem. Genom att använda en modell för delat minne och kopiera-på-skriva kan kostnaderna för värddatorn minskas drastiskt.
Allt detta gör minneshanteringen i Linux sofistikerad och så optimal som den kan bli. Men den sofistikeringen gör det svårt att titta på en process och veta vad dess minnesanvändning verkligen är.
pmap-verktyget
kärnan avslöjar mycket av vad den gör med RAM genom två pseudofiler i “/proc” systeminformation pseudo-filsystem. Det finns två filer per process, namngivna efter process-ID eller PID för varje process: “/proc/maps” och “/proc//smaps.”
Annons
Verktyget pmap läser information från dessa filer och visar resultaten i terminalfönstret. Det kommer att vara uppenbart att vi måste tillhandahålla PID för processen vi är intresserade av när vi använder pmap.
Hitta process-ID:t
Det finns flera sätt att hitta PID för en process. Här är källkoden för ett trivialt program som vi kommer att använda i våra exempel. Det är skrivet i C. Allt det gör är att skriva ut ett meddelande till terminalfönstret och vänta på att användaren trycker på “Enter” nyckel.
#include <stdio.h> int main(int argc, char *argv[]) { printf(“How-To Geek-testprogram.”); getc(stdin); } //end of main
Programmet kompilerades till en körbar fil som heter pm med hjälp av gcc-kompilatorn:
gcc -o pm pm.c
Eftersom programmet väntar på att användaren trycker på “Enter” kommer det att fortsätta köras så länge vi gillar.
./pm
Programmet startar, skriver ut meddelandet och väntar på tangenttryckningen. Vi kan nu söka efter dess PID. Kommandot ps visar pågående processer. Alternativet -e (visa alla processer) gör att ps listar alla processer. Vi skickar utdata genom grep och filtrerar bort poster som har “pm” i deras namn.
ps -e | grep pm
Detta listar alla poster med “pm“ 8221; var som helst i deras namn.
Annons
Vi kan vara mer specifika med kommandot pidof. Vi ger pidof namnet på processen vi är intresserade av på kommandoraden, och den försöker hitta en matchning. Om en matchning hittas skriver pidof ut PID för matchningsprocessen.
pidof pm
Pidof-metoden är snyggare när du känner till namnet på processen, men ps-metoden fungerar även om du bara känner till en del av processnamnet.
Använda pmap
Med vårt testprogram igång, och när vi väl har identifierat dess PID, kan vi använda pmap så här:
pmap 40919
Minnesmappningarna för processen är listade för oss.
Här är hela resultatet från kommandot:
40919: ./pm 000056059f06c000 4K r —- pm 000056059f06d000 4K r-x– pm 000056059f06e000 4K r —- pm 000056059f06f000 4K r —- pm 000056059f070000 4K rw — pm 000056059fc39000 132k rw — [anon ] 00007f97a3edb000 8K rw — [anon] 00007f97a3edd000 160K r —- libc.so.6 00007f97a3f05000 1616K r-x– libc.so.6 00007f97a4099000 352K r —- libc.so.6 00007f97a40f1000 4K —- – libc.so.6 00007f97a40f2000 16K r—- libc.so.6 00007f97a40f6000 8K rw— libc.so.6 00007f97a40f8000 60K -64.so.2 00007f97a4117000 160K r-x– ld-linux-x86-64.so.2 00007f97a413f000 40K r—- ld-linux-x86-64.so.2 9000ld 8-00ld 8f 000ld 8 -x86-64.so.2 00007f97a414b000 8K rw— ld-linux-x86-64.so.2 00007ffca0e7e000 132K rw— [ stack ] 00007ffca0 1fe100 – 0r – 0r – 0r – 0r – 0r – 0r – 7 anon ] ffffffffff600000 4K –x– [ anon ] totalt 2756K
Den första raden är processnamnet och dess PID. Var och en av de andra raderna visar en mappad minnesadress och mängden minne på den adressen, uttryckt i kilobyte. De nästa fem tecknen på varje rad kallas virtuella minnesbehörigheter. Giltiga behörigheter är:
- r: Det mappade minnet kan läsas av processen.
- w: mappat minne kan skrivas av processen.
- x: Processen kan exekvera alla instruktioner som finns i det mappade minnet.
- s
- R: Det finns ingen reservation för swap-utrymme för detta mappade minne.
strong>: Det mappade minnet delas och ändringar som görs i det delade minnet är synliga för alla processer som delar minnet.
Annons
Den slutliga informationen på varje rad är namnet på källan till mappningen. Detta kan vara ett processnamn, biblioteksnamn eller ett systemnamn som stack eller heap.
The Extended Display
The -x ( utökat) ger två extra kolumner.
pmap -x 40919
Kolumnerna ges rubriker. Vi har redan sett “Adress”, “Kbytes”, “Mode” och “Mapping” kolumner. De nya kolumnerna heter “RSS” och “Dirty.”
Här är hela resultatet:
40919 :./pm Adress Kbytes RSS Dirty Mode Mapping 000056059F06C000 4 4 0 R —- PM 000056059F06D000 4 4 0 R-X-PM 000056059F06E000 4 4 0 R —- PM 00005605059F06F000 4 4 4 4 4 4 4 4440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. 4 4 4 RW — PM 000056059FC39000 132 4 4 RW — [ANON] 00007F97A3EDB000 8 4 4 RW — [ANON] 00007F97A3EDD000 160 160 0 R — LIBC.SO.6 00007F97A3F05000 1616 78 0 R – libc.so.6 00007f97a4099000 352 64 0 r—- libc.so.6 00007f97a40f1000 4 0 0 —– libc.so.6 00007f97a40f2000 7.-01 8 8 rw— libc.so.6 00007f97a40f8000 60 28 28 rw— [ anon ] 00007f97a4116000 4 4 0 r—- ld-linux-x86-001 0f -04. -linux-x86-64.so.2 00007f97a413f000 40 40 0 r—- ld-linux-x86-64.so.2 00007f97a4149000 8 8 8 r—- ld-2-6-4x. 00007f97a414b000 8 8 8 rw— ld-linux-x86-64.so.2 00007ffca0e7e000 132 12 12 rw— [ stack ] 00007ffca0fe1000 [0r – 01 – 0 0 – 0 0 – 0 0 – 0 0 – 0 – 5 anon ] ffffffffff600000 4 0 0 –x– [ anon ] ——– ——– ——- ——- totalt kB 2756 1328 96
- RSS: Det här är storleken på inbyggd uppsättning. Det vill säga mängden minne som för närvarande finns i RAM-minnet och som inte bytts ut.
- Smutsigt: “Smutsigt” minnet har ändrats sedan processen—och kartläggningen—startade.
Visa mig allt
Den – X (även mer än utökat) lägger till ytterligare kolumner till utdata. Lägg märke till versalerna “X.” Ett annat alternativ som heter -XX (till och med mer än -X) visar dig allt pmap kan få från kärnan. Eftersom -X är en delmängd av -XX kommer vi att beskriva utdata från -XX .
pmap -XX 40919
Utgången sveper sig fruktansvärt runt i ett terminalfönster och är praktiskt taget otydlig. Här är hela resultatet:
40919: ./pm Adress Perm Offset Device Inode Storlek KernelPageSize MMUPageSize Rss Pss Shared_Clean Shared_Dirty Private_Clean Private_Dirty refererensnavigerings- Anonym LazyFree AnonHugePages ShmemPmdMapped FilePmdMapped Shared_Hugetlb Private_Hugetlb Swap SwapPss Låst THPeligible VmFlags Mapping 56059f06c000 r – p 00000000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd pm 56059f06d000 r-xp 00001000 08:03 393304 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me dw sd pm 56059f06e000 r–p 00002000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 pm -p 00002000 08:03 393304 4 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 rd mr mw me dw ac sd pm 56059f070000 0 4 0 0 4 0 0 4 0 0 4 0 3 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 rd wr mr mw me dw ac sd pm 56059fc39000 rw-p 00000000 00:00 0 132 4 4 4 0 4 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd [heap] 7f97a3edb000 rw-p 00000000 00:00 0 8 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd 7f97a3edd000 r–p 00000000 08:03 264328 160 4 4 160 4 160 0 0 0 160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 mf r-xp 00028000 08:03 264328 1616 4 4 788 32 788 0 0 0 788 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me sd libc.so. 352 4 4 64 1 64 0 0 0 64 0 0 0 0 0 0 0 0 0 0 rd mr mw me sd libc.so.6 7f97a40f1000 —p 00214000 08:03 4 0 0 08:03 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 mr mw me sd libc.so.6 7f97a40f2000 r–p 00214000 08:03 264328 16 4 4 16 16 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 rd mr mw me ac sd libc.so.6 7f97a40f6000 rw-p 00218000 08:03 264328 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 mw rd me libc.so.6 7f97a40f8000 rw-p 00000000 00:00 0 60 4 4 28 28 0 0 0 28 28 28 0 0 0 0 0 0 0 0 0 0 rd ac 7 mr mw – 0m 03 264305 4 4 4 4 0 4 0 0 0 4 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd ld-linux-x86-64.so.2 7f97a4117000 0 0117000 0017000 0017000 0017000 0017000 0017000 r-201x 4 4 160 11 160 0 0 0 160 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me dw sd ld-linux-x86-64.so.2 7f97a413f000 r–p 00029000 08:03 264305 40 4 4 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd ld-linux-x86-64.so.2 7f97a4149000 r–p 00032000 08:03 264305 8 4 4 8 0 8 0 0 0 8 0 0 0 0 0 0 0 0 rd mr mw me dw ac sd ld-linux-x86-64.so.2 7f97a414b000 rw-p 00034000 08:03 264305 8 4 4 8 8 0 8 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me dw ac sd ld-linux-x86-64.so.2 7ffca0e7e000 rw-p 00000000 00:00 0 132 4 4 12 12 0 0 0 12 0 0 0 0 0 12 0 0 0 0 0 0 rd wr mr mw me gd ac [stack] 7ffca0fe1000 r–p 00000000 00:00 0 16 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 pf 0 sd [vvar] 7ffca0fe5000 r-xp 00000000 00:00 0 8 4 4 4 0 4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me de sd 6 0f 0ff 0 :00 0 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ex [vsyscall] ==== =================== ======= ==== === ====================================== = =================================================== ==== ===== ========= ============================================ = ==== ============= ============ 2756 92 92 1328 157 1220 0 12 96 1328 96 0 0 0 0 0 0 0 0 0 0 KB
Det finns mycket information här. Det här är vad kolumnerna innehåller:
- Adress: Startadressen för denna mappning. Detta använder virtuell minnesadressering.
- Perm: Behörigheterna för minnet.
- Offset: Om minnet är fil- baserat, förskjutningen av denna mappning inuti filen.
- Enhet: Linux-enhetsnumret, angivet i stora och små tal. Du kan se enhetsnumren på din dator genom att köra kommandot lsblk.
- Inode: Inoden för filen som mappningen är associerad med. I vårt exempel kan detta till exempel vara inoden som innehåller information om pm-programmet.
- Storlek: Storleken på den minnesmappade regionen.
- MMUPageSize: Sidstorleken som används av minneshanteringsenheten.
- Pss: Det här är den proportionella andelsstorleken. Detta är den privata delade storleken som läggs till (delad storlek dividerat med antalet delningar.)
- Delad_ren: Mängden minne som delas med andra processer som inte har ändrats sedan kartläggningen skapades. Observera att även om minnet är delbart, om det faktiskt inte har delats anses det fortfarande vara privat minne.
- Delat_Smutsigt: Mängden minne som delas med andra processer som har ändrats sedan mappningen skapades.
- Private_Clean: Mängden privat minne—som inte delas med andra processer— ;som inte har ändrats sedan mappningen skapades.
- Private_Dirty: Mängden privat minne som har ändrats sedan mappningen skapades.
- Refererad: Mängden minne som för närvarande är markerad som refererad eller åtkomst.
- Anonym: Minne som inte har en enhet att byta ut till. Det vill säga, den är inte filstödd.
- LazyFree: Sidor som har flaggats som MADV_FREE. Dessa sidor har markerats som tillgängliga för att frigöras och återvinnas, även om de kan ha oskrivna ändringar i dem. Men om efterföljande ändringar sker efter att MADV_FREE har ställts in på minnesmappingen, tas MADV_FREE-flaggan bort och sidorna kommer inte att återtas förrän ändringarna är skrivna.
- AnonHugePages: Dessa är icke-filstödda “enorma” minnessidor (större än 4 KB).
- ShmemPmdMapped: Delat minne som är associerat med enorma sidor. De kan också användas av filsystem som helt och hållet finns i minnet.
- FilePmdMapped: Page Middle Directory är ett av sökningsscheman som är tillgängliga för kärnan. Det här är antalet filstödda sidor som PMD-poster pekar på.
- Shared_Hugetlb: Translation Lookaside Tables, eller TLB:er, är minnescacher som används för att optimera tiden det tar att komma åt användarutrymmets minnesplatser. Denna siffra är mängden RAM som används i TLB:er som är associerade med delade enorma minnessidor.
- Private_Hugetlb: Den här siffran är mängden RAM som används i TLB:er som är associerade med privata enorma minnessidor.
- Swap: Mängden swap som används.
- SwapPss: Swap proportionell andelsstorlek. Det här är mängden utbyte som består av utbytta privata minnessidor som lagts till (delad storlek dividerat med antalet delningar.)
- Låst: Minnesmappningar kan låsas för att förhindra operativsystemet från att bläddra ut heap eller off-heap minne.
- THPeligible: Det här är en flagga som anger om kartläggningen är kvalificerad för att tilldela transparenta enorma sidor. 1 betyder sant, 0 betyder falskt. Transparent enorma pages är ett minneshanteringssystem som minskar kostnaderna för TLB-sidsökningar på datorer med en stor mängd RAM.
- VmFlags: Se listan över flaggor nedan.
- Mappning: Namnet på källan till mappningen. Detta kan vara ett processnamn, biblioteksnamn eller systemnamn som stack eller heap.
< li>KernelPageSize: Sidstorleken som används av kärnan.
< li>Rss: Det här är storleken på inbyggd uppsättning. Det vill säga mängden minne som för närvarande finns i RAM, och som inte bytts ut.
li>
VmFlags—virtuella minnesflaggor—kommer att vara en delmängd av följande lista.
- rd: Läsbar.
- wr: Skrivbar.
- ex. : Körbar.
- sh: Delad.
- mr: Kan läsas.
- mw: Får skriva.
- mig: Får köra.
- ms: Får dela.
- gd: Stacksegmentet växer ner.
- pf: Rent sidramsnummerintervall. Sidramsnummer är en lista över de fysiska minnessidorna.
- dw: Inaktiverad skrivning till den mappade filen.
- lo: Sidorna är låsta i minnet.
- io: Minneskartat I/O-område.
- sr: Sekventiell läsråd tillhandahålls (av funktionen madvise().)
- rr: Slumpmässigt läsråd tillhandahålls.
- dc: Kopiera inte denna minnesregion om processen är splittrad.
- de: Utöka inte denna minnesregion vid ommappning.
- ac: Området är ansvarigt.
- nr: Bytesutrymme är inte reserverat för området.
- ht: Området använder enorma TLB-sidor.
- sf: Synkront sidfel.
- ar : Arkitektur-specifik flagga.
- wf: Torka den här minnesregionen om processen är splittrad.
- dd: Gör det inte inkludera denna minnesregion i kärndumpar.
- sd: Mjuk smutsig flagga.
- mm: Blandat kartområde.
- hg: Stor sidrådgivningsflagga.
- nh: Ingen stor sidrådgivningsflagga.
- mg: Sammanfogningsbar rådflagga.
- bt: ARM64 bias temperaturinstabilitetsskyddad sida.
- mt: ARM64-minnestaggningsförlängningstaggar är aktiverade.
- um: Userfaultfd saknar spårning.
- uw: Userfaultfd wr-protect tracking.
Minneshantering är komplicerad
Och att arbeta baklänges från tabeller med data för att förstå vad som faktiskt händer är svårt. Men pmap ger dig åtminstone hela bilden så att du har störst chans att ta reda på vad du behöver veta.
Annons
Det är intressant att notera att vårt exempelprogram sammanställts till en 16 KB binär körbar, och ändå använder den (eller delar) cirka 2756 KB minne, nästan helt på grund av runtime-bibliotek.
Ett sista snyggt knep är att du kan använda kommandona pmap och pidof tillsammans, kombinera åtgärderna för att hitta processens PID och skicka den till pmap i ett kommando:
pmap $(pidof pm) LÄS NÄSTA
- › Varje Microsoft Windows-logotyp från 1985 till 2022
- › De 5 mest löjligt dyra telefonerna genom tiderna
- › Har du en smart högtalare? Använd den för att göra dina brandvarnare smarta
- › Roborock Q5+ Review: A Solid Self-Emptying Robot Vacuum
- › Så här lägger du till trådlös laddning till vilken telefon som helst
- › Vad gör “Touch Grass” Menar du?