AllInfo

Hoe de pmap-opdracht op Linux te gebruiken

fatmawati achmad zaenuri/Shutterstock.com

Uitvinden hoeveel RAM een Linux-proces gebruikt, is niet eenvoudig, vooral niet wanneer er rekening moet worden gehouden met gedeeld geheugen. Gelukkig helpt de pmap-opdracht je om alles te begrijpen.

Geheugentoewijzing

Op moderne besturingssystemen leeft elk proces in zijn eigen toegewezen geheugen- of toewijzingsruimte. De grenzen van het toegewezen gebied worden niet rechtstreeks toegewezen aan fysieke hardware-adressen. Het besturingssysteem creëert een virtuele geheugenruimte voor elk proces en fungeert als een abstractielaag die het virtuele geheugen koppelt aan het fysieke geheugen.

De kernel houdt een vertaaltabel bij voor elk proces, en deze is toegankelijk voor de CPU . Wanneer de kernel het proces verandert dat op een bepaalde CPU-kern draait, werkt het de vertaaltabel bij die processen en CPU-kernen met elkaar verbindt.

De voordelen van abstractie

De voordelen van abstractie

h2>

Er zijn voordelen aan deze regeling. Het gebruik van geheugen is enigszins ingekapseld en gesandboxed voor elk proces in het gebruikersland. Een proces “ziet” geheugen in termen van de virtuele geheugenadressen. Dit betekent dat het alleen kan werken met het geheugen dat het door het besturingssysteem is gegeven. Tenzij het toegang heeft tot een of ander gedeeld geheugen, weet het niets van en heeft het geen toegang tot het geheugen dat aan andere processen is toegewezen.

GERELATEERDWat is Swappiness op Linux? (en hoe u dit kunt wijzigen)

De abstractie van het op hardware gebaseerde fysieke geheugen in virtuele geheugenadressen stelt de kernel in staat het fysieke adres te wijzigen waaraan een virtueel geheugen is toegewezen. Het kan het geheugen naar schijf wisselen door het werkelijke adres te wijzigen waarnaar een gebied van virtueel geheugen verwijst. Het kan ook het verstrekken van fysiek geheugen uitstellen totdat het daadwerkelijk nodig is.

Advertentie

Zolang verzoeken om geheugen te lezen of te schrijven worden afgehandeld zoals ze worden gevraagd, is het de kernel vrij om met de toewijzingstabel te jongleren zoals het past goed.

RAM op aanvraag

De mapping-tabel en het concept van "RAM on demand" de mogelijkheid van gedeeld geheugen openen. De kernel zal proberen te voorkomen dat hetzelfde meer dan eens in het geheugen wordt geladen. Het laadt bijvoorbeeld een gedeelde bibliotheek eenmaal in het geheugen en wijst deze toe aan de verschillende processen die deze moeten gebruiken. Elk van de processen heeft zijn eigen unieke adres voor de gedeelde bibliotheek, maar ze zullen allemaal naar dezelfde werkelijke locatie verwijzen.

Als het gedeelde geheugengebied beschrijfbaar is, gebruikt de kernel een schema dat copy-on-write wordt genoemd. Als een proces naar het gedeelde geheugen schrijft en de andere processen die dat geheugen delen de wijzigingen niet mogen zien, wordt er een kopie van het gedeelde geheugen gemaakt op het moment van het schrijfverzoek.

GERELATEERDBeginner Geek: virtuele machines maken en gebruiken

Linux-kernel 2.6.32, uitgebracht in december 2009, gaf Linux een functie genaamd “Kernel SamePage Merging.” Dit betekent dat Linux identieke gegevensgebieden in verschillende adresruimten kan detecteren. Stel je een reeks virtuele machines voor die op een enkele computer draaien, en de virtuele machines draaien allemaal op hetzelfde besturingssysteem. Door een gedeeld geheugenmodel en copy-on-write te gebruiken, kan de overhead op de hostcomputer drastisch worden verminderd.

Dit alles maakt de geheugenverwerking in Linux geavanceerd en zo optimaal mogelijk. Maar die verfijning maakt het moeilijk om naar een proces te kijken en te weten wat het geheugengebruik werkelijk is.

Het pmap-hulpprogramma

De kernel onthult veel van wat het doet met RAM door middel van twee pseudo-bestanden in de “/proc” systeeminformatie pseudo-bestandssysteem. Er zijn twee bestanden per proces, genoemd naar de proces-ID of PID van elk proces: “/proc/maps” en “/proc//smaps.”

Advertentie

De pmap-tool leest informatie uit deze bestanden en geeft de resultaten weer in het terminalvenster. Het zal duidelijk zijn dat we de PID moeten opgeven van het proces waarin we geïnteresseerd zijn wanneer we pmap gebruiken.

De proces-ID vinden

Er zijn verschillende manieren om de PID van een proces te vinden. Hier is de broncode voor een triviaal programma dat we in onze voorbeelden zullen gebruiken. Het is geschreven in C. Het enige dat het doet, is een bericht naar het terminalvenster afdrukken en wachten tot de gebruiker op “Enter” sleutel.

#include <stdio.h> int main(int argc, char *argv[]) { printf(“How-To Geek testprogramma.”); getc(stdin); } //end of main

Het programma is gecompileerd tot een uitvoerbaar bestand genaamd pm met behulp van de gcc-compiler:

gcc -o pm pm.c

Omdat het programma wacht tot de gebruiker op “Enter” drukt, blijft het actief zolang we vind ik leuk.

./pm

Het programma wordt gestart, drukt het bericht af en wacht op de toetsaanslag. We kunnen nu zoeken naar zijn PID. De opdracht ps geeft een overzicht van lopende processen. De -e (toon alle processen) optie zorgt ervoor dat ps elk proces weergeeft. We sturen de uitvoer door grep en filteren items uit die “pm” in hun naam.

ps -e | grep pm

Hiermee worden alle vermeldingen weergegeven met “pm' 8221; overal in hun naam.

Advertentie

We kunnen specifieker zijn met het pidof-commando. We geven pidof de naam van het proces waarin we geïnteresseerd zijn op de opdrachtregel en het probeert een overeenkomst te vinden. Als er een overeenkomst wordt gevonden, drukt pidof de PID van het koppelingsproces af.

pidof pm

< /p>

De pidof-methode is netter als je de naam van het proces weet, maar de ps-methode werkt zelfs als je maar een deel van de procesnaam kent.

Met behulp van pmap

Als ons testprogramma draait, en zodra we de PID hebben geïdentificeerd, kunnen we pmap als volgt gebruiken:

pmap 40919

De geheugentoewijzingen voor het proces worden voor ons vermeld.

Hier is de volledige uitvoer van de opdracht:

40919: ./pm 000056059f06c000 4K r—- pm 000056059f06d000 4K r-x– pm 000056059f06e000 4K r—- pm 000056059f06f000 4K r—- pm 000056059f070000 4K rw–c pm 0000 13259f ] 00007f97a3edb000 8K rw— [ anon ] 00007f97a3edd000 160K r—- libc.so.6 00007f97a3f05000 1616K r-x– libc.so.6 00007f97a4099000 352K r—- 1000 libc.so.6 – libc.so.6 00007f97a40f2000 16K r —- libc.so.6 00007f97a40f6000 8K rw — libc.so.6 00007f97a40f8000 60K rw — [ anon ] 00007f97a4116000 4K r —- 86 ld-linux -64.so.2 00007f97a4117000 160K r-x– ld-linux-x86-64.so.2 00007f97a413f000 40K r—- ld-linux-x86-64.so.2 00007f97a4149000 8K r—- ld-linux -x86-64.so.2 00007f97a414b000 8K rw— ld-linux-x86-64.so.2 00007ffca0e7e000 132K rw— [stack] 00007ffca0fe1000 16K r—- [ anon] 00007ffca0fe5000 8K r-x- anon ] ffffffffff600000 4K –x– [ anon ] totaal 2756K

De eerste regel is de procesnaam en zijn PID. Elk van de andere regels toont een toegewezen geheugenadres en de hoeveelheid geheugen op dat adres, uitgedrukt in kilobytes. De volgende vijf tekens van elke regel worden virtuele geheugenrechten genoemd. Geldige machtigingen zijn:

Advertentie

De laatste informatie op elke regel is de naam van de bron van de toewijzing. Dit kan een procesnaam, bibliotheeknaam of een systeemnaam zoals stack of heap zijn.

The Extended Display

The -x ( extended) optie biedt twee extra kolommen.

pmap -x 40919

De kolommen krijgen titels. We hebben de “Address”, “Kbytes”, “Mode” en “Mapping” kolommen. De nieuwe kolommen heten “RSS” en “Dirty.”

Hier is de volledige uitvoer:

40919: ./pm Adres Kbytes RSS Dirty Mode Mapping 000056059f06c000 4 4 0 r—- pm 000056059f06d000 4 4 0 r-x– pm 000056059f06e000 4 4 0 r—- pm 000056059f06f000 4 4 4 r—- pm 000056059f070000 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 16x-88 0 r – libc.so.6 00007f97a4099000 352 64 0 r—- libc.so.6 00007f97a40f1000 4 0 0 —– libc.so.6 00007f97a40f2000 16 16 16 r—- libc.so.6 00007f97a40f6000 8 8 8 rw— libc.so.6 00007f97a40f8000 60 28 28 rw— [ anon ] 00007f97a4116000 4 4 0 r—- ld-linux-x86-64.so.2 00007f97a4117000 160 160 0 r-x– ld -linux-x86-64.so.2 00007f97a413f000 40 40 0 ​​r—- ld-linux-x86-64.so.2 00007f97a4149000 8 8 8 r—- ld-linux-x86-64.so.2 00007f97a414b000 8 8 8 rw— ld-linux-x86-64.so.2 00007ffca0e7e000 132 12 12 rw— [ stack] 00007ffca0fe1000 16 0 0 r—- [ anon] 00007ffca0fe5000 8 4 0 r-x– [ anon ] ffffffffff600000 4 0 0 –x– [ anon ] ——– ——– ——- ——- ——- totaal kB 2756 1328 96

Laat me alles zien

De – X (zelfs meer dan uitgebreid) voegt extra kolommen toe aan de uitvoer. Let op de hoofdletter “X.” Een andere optie genaamd -XX (zelfs meer dan -X ) laat je alles zien wat pmap uit de kernel kan halen. Aangezien -X een subset is van -XX, zullen we de uitvoer van -XX beschrijven.

pmap -XX 40919

De uitvoer wikkelt zich vreselijk in een terminalvenster en is praktisch niet te ontcijferen. Hier is de volledige output:

40919: ./pm Adres Perm Offset Apparaat Inode Grootte KernelPageSize MMUPageSize Rss Pss Shared_Clean Shared_Dirty Private_Clean Private_Dirty waarnaar verwezen wordt Anoniem LazyFree AnonHugePages ShmemPmdMapped FilePmdMapped Shared_Hugetlb Private_Hugetlb Swap THPPes 4 0 4 0 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 4 0 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 rd mr mw me dw sd pm 56059f06f000 r- -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 0 rd mr mw me dw ac sd pm 56059f070000 rw-p 00003000 08:03 393304 4 4 4 4 4 0 0 0 4 4 4 0 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 4 0 0 0 4 4 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 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 rd mr mw me sd libc.so.6 7f97a3f05000 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 0 rd ex mr mw me sd libc.so.6 7f97a4099000 r–p 001bc000 08:03 264328 352 4 4 64 1 64 0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me sd libc.so.6 7f97a40f1000 —p 00214000 08:03 264328 4 4 4 0 0 0 0 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 16 16 16 0 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 0 0 rd wr mr mw me ac sd 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 wr mr mw me ac sd 7f97a4116000 r–p 00000000 08: 03 264305 4 4 4 4 0 4 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 7f97a4117000 r-xp 00001000 08:03 264305 160 4 4 160 11 160 0 0 0 160 0 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 40 1 40 0 ​​0 0 40 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 8 0 0 0 8 8 8 0 0 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 0 0 8 8 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 12 12 0 0 0 0 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 rd mr pf io de dd 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 [vdso] ffffffffff600000 –xp 00000000 00 :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

Er is hier veel informatie. Dit is wat de kolommen bevatten:

De VmFlags'virtuele geheugenvlaggen' zullen een subset zijn van de volgende lijst.

Geheugenbeheer is ingewikkeld

En achteruit werken vanuit tabellen met gegevens om te begrijpen wat er werkelijk aan de hand is, is moeilijk. Maar pmap geeft je in ieder geval het volledige beeld, zodat je de beste kans hebt om erachter te komen wat je moet weten.

Advertentie

Het is interessant om op te merken dat ons voorbeeldprogramma is gecompileerd tot een 16 KB binair uitvoerbaar bestand, en toch gebruikt (of deelt het) zo'n 2756 KB geheugen, bijna volledig vanwege runtime-bibliotheken.

Een laatste handige truc is dat je pmap en de pidof-opdrachten samen kunt gebruiken, het combineren van de acties van het vinden van de PID van het proces en het doorgeven aan pmap in één commando:

pmap $(pidof pm) READ NEXT

Exit mobile version