Această întrebare este acoperit aici în detaliu.
Cum a face tu a măsura utilizarea de memorie de o aplicație sau proces în Linux?
Din articol pe blog de Înțelegerea memorie de utilizare pe Linux, " ps " nu este un instrument precis de a utiliza pentru acest scop.
de Ce " ps " este "prost"
în Funcție de cum te uiți la ea, " ps " nu este de raportare la real, utilizarea de memorie de procese. Ceea ce este într-adevăr faci este arată cât de mult de memorie reală fiecare proces va dura până dacă ar fi fost singurul proces care rulează. Desigur, un tipic mașină de Linux are mai multe zeci de procese care rulează la un moment dat, ceea ce înseamnă că VSZ și RSS numerele raportate de către " ps " sunt aproape sigur greșit.
Cu " ps " sau de instrumente similare, veți primi doar suma de pagini de memorie alocate prin acest proces. Acest număr este corect, dar:
nu reflectă valoarea reală de memorie utilizate de aplicație, doar cantitatea de memorie rezervate pentru ea
poate fi înșelătoare dacă paginile sunt comune, de exemplu prin mai multe fire sau prin utilizarea de biblioteci legate dinamic
Dacă chiar vrei să știi ce cantitate de memorie aplicație folosește de fapt, aveți nevoie pentru a rula într-un profil. De exemplu, valgrind
poate oferi perspective cu privire la cantitatea de memorie utilizat, și, mai important, despre posibile pierderi de memorie în programul tău. Heap profiler instrument de valgrind este numit 'masiv':
Masivul este un morman de profiler. Se efectuează detaliate morman de profilare prin luarea regulată instantanee a unui program's heap. Se produce un grafic arată grămadă de utilizare de-a lungul timpului, inclusiv informații despre ce părți ale programului sunt responsabile pentru cele mai multe alocări de memorie. Graficul este completată de un text sau fișier HTML care conține mai multe informații pentru a determina în cazul în care cele mai de memorie este alocat. Masivul ruleaza programe de aproximativ 20 de ori mai lent decât în mod normal.
Așa cum sa explicat în valgrind documentația, aveți nevoie pentru a rula programul prin valgrind:
valgrind --tool=massif <executable> <arguments>
Masivul scrie un dump de memorie de utilizare instantanee (de exemplu, a masivului.afară.12345
). Acestea oferă, (1) o cronologie a memoriei, (2) pentru fiecare imagine, o înregistrare în cazul în care în programul dumneavoastră de memorie a fost alocată.
O mare instrument grafic pentru analiza acestor fișiere este masivul-visualizer. Dar eu am găsit ms_print`, un text simplu instrument bazat pe livrate cu valgrind, pentru a fi de mare ajutor deja.
Pentru a găsi pierderi de memorie, utilizați (default) memcheck
instrument de valgrind.
Greu de spus sigur, dar aici sunt două "aproape" lucruri care te pot ajuta.
$ ps aux
va da Dimensiune Virtuală (VSZ)
Puteți obține, de asemenea, statistici detaliate de la /proc fișier-sistem de gând să /proc/$pid/status
Cel mai important este VmSize, care ar trebui să fie aproape de ceea ce ps aux
dă.
/proc/19420$ cat de stare Nume: firefox Stat: S (de dormit) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDSize: 256 Grupuri: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000 VmPeak: 222956 kB VmSize: 212520 kB VmLck: 0 kB VmHWM: 127912 kB VmRSS: 118768 kB VmData: 170180 kB VmStk: 228 kB VmExe: 28 kB VmLib: 35424 kB VmPTE: 184 kB Fire: 8 SigQ: 0/16382 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000020001000 SigCgt: 000000018000442f CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Cpus_allowed: 03 Mems_allowed: 1 voluntary_ctxt_switches: 63422 nonvoluntary_ctxt_switches: 7171
În ultimele versiuni de linux, utilizați smaps subsistem. De exemplu, pentru un proces cu un PID de 1234:
cat /proc/1234/smaps
Acesta vă va spune exact cât de mult de memorie este utilizat la un moment dat. Mai important, se va împărți în memorie private și comune, astfel încât să puteți spune cât de mult de memorie exemplu de programul utilizează, fără a include memoria partajată între mai multe instanțe ale programului.
Folosi smem, care este o alternativă la ps care calculează USS și PSS pe proces. Ceea ce vrei este, probabil, cea PSS.
USS - Set Unic de Dimensiune. Aceasta este suma de neîmpărtășită de memorie unic la acest proces (cred că de ea ca U de unic memorie). Aceasta nu include memorie partajată. Astfel, acest lucru va sub-raport de cantitatea de memorie un proces folosește, dar este util atunci când doriți să ignorați memorie partajată.
SV Proporțională cu Dimensiunea Set. Asta este ceea ce vrei. Se adaugă împreună unic de memorie (USS), împreună cu o parte din memoria partajată împărțit la numărul de procese de partajare de memorie. Astfel, aceasta vă va da o reprezentare exactă a cât de mult fizic real de memorie este utilizat pe procesul - cu memorie partajată cu adevărat reprezentat ca comună. Cred că a P pentru fizică de memorie.
Cum se compară cu RSS ca și raportate de către ps și alte utilties:
Observație: smem poate, de asemenea, (opțional) ieșire grafice, cum ar fi diagrame plăcintă și cum ar fi. IMO nu't nevoie de asta. Dacă doriți doar să-l folosească din linia de comandă ca s-ar putea folosi ps-v, atunci tu nu't nevoie pentru a instala python-matplotlib recomandat de dependență.
ps -eo size,pid,user,command --sort -size | \
awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\
cut -d "" -f2 | cut -d "-" -f1
0.00 Mb COMMAND
1288.57 Mb /usr/lib/firefox
821.68 Mb /usr/lib/chromium/chromium
762.82 Mb /usr/lib/chromium/chromium
588.36 Mb /usr/sbin/mysqld
547.55 Mb /usr/lib/chromium/chromium
523.92 Mb /usr/lib/tracker/tracker
476.59 Mb /usr/lib/chromium/chromium
446.41 Mb /usr/bin/gnome
421.62 Mb /usr/sbin/libvirtd
405.11 Mb /usr/lib/chromium/chromium
302.60 Mb /usr/lib/chromium/chromium
291.46 Mb /usr/lib/chromium/chromium
284.56 Mb /usr/lib/chromium/chromium
238.93 Mb /usr/lib/tracker/tracker
223.21 Mb /usr/lib/chromium/chromium
197.99 Mb /usr/lib/chromium/chromium
194.07 Mb conky
191.92 Mb /usr/lib/chromium/chromium
190.72 Mb /usr/bin/mongod
169.06 Mb /usr/lib/chromium/chromium
155.11 Mb /usr/bin/gnome
136.02 Mb /usr/lib/chromium/chromium
125.98 Mb /usr/lib/chromium/chromium
103.98 Mb /usr/lib/chromium/chromium
93.22 Mb /usr/lib/tracker/tracker
89.21 Mb /usr/lib/gnome
80.61 Mb /usr/bin/gnome
77.73 Mb /usr/lib/evolution/evolution
76.09 Mb /usr/lib/evolution/evolution
72.21 Mb /usr/lib/gnome
69.40 Mb /usr/lib/evolution/evolution
68.84 Mb nautilus
68.08 Mb zeitgeist
60.97 Mb /usr/lib/tracker/tracker
59.65 Mb /usr/lib/evolution/evolution
57.68 Mb apt
55.23 Mb /usr/lib/gnome
53.61 Mb /usr/lib/evolution/evolution
53.07 Mb /usr/lib/gnome
52.83 Mb /usr/lib/gnome
51.02 Mb /usr/lib/udisks2/udisksd
50.77 Mb /usr/lib/evolution/evolution
50.53 Mb /usr/lib/gnome
50.45 Mb /usr/lib/gvfs/gvfs
50.36 Mb /usr/lib/packagekit/packagekitd
50.14 Mb /usr/lib/gvfs/gvfs
48.95 Mb /usr/bin/Xwayland :1024
46.21 Mb /usr/bin/gnome
42.43 Mb /usr/bin/zeitgeist
42.29 Mb /usr/lib/gnome
41.97 Mb /usr/lib/gnome
41.64 Mb /usr/lib/gvfs/gvfsd
41.63 Mb /usr/lib/gvfs/gvfsd
41.55 Mb /usr/lib/gvfs/gvfsd
41.48 Mb /usr/lib/gvfs/gvfsd
39.87 Mb /usr/bin/python /usr/bin/chrome
37.45 Mb /usr/lib/xorg/Xorg vt2
36.62 Mb /usr/sbin/NetworkManager
35.63 Mb /usr/lib/caribou/caribou
34.79 Mb /usr/lib/tracker/tracker
33.88 Mb /usr/sbin/ModemManager
33.77 Mb /usr/lib/gnome
33.61 Mb /usr/lib/upower/upowerd
33.53 Mb /usr/sbin/gdm3
33.37 Mb /usr/lib/gvfs/gvfsd
33.36 Mb /usr/lib/gvfs/gvfs
33.23 Mb /usr/lib/gvfs/gvfs
33.15 Mb /usr/lib/at
33.15 Mb /usr/lib/at
30.03 Mb /usr/lib/colord/colord
29.62 Mb /usr/lib/apt/methods/https
28.06 Mb /usr/lib/zeitgeist/zeitgeist
27.29 Mb /usr/lib/policykit
25.55 Mb /usr/lib/gvfs/gvfs
25.55 Mb /usr/lib/gvfs/gvfs
25.23 Mb /usr/lib/accountsservice/accounts
25.18 Mb /usr/lib/gvfs/gvfsd
25.15 Mb /usr/lib/gvfs/gvfs
25.15 Mb /usr/lib/gvfs/gvfs
25.12 Mb /usr/lib/gvfs/gvfs
25.10 Mb /usr/lib/gnome
25.10 Mb /usr/lib/gnome
25.07 Mb /usr/lib/gvfs/gvfsd
24.99 Mb /usr/lib/gvfs/gvfs
23.26 Mb /usr/lib/chromium/chromium
22.09 Mb /usr/bin/pulseaudio
19.01 Mb /usr/bin/pulseaudio
18.62 Mb (sd
18.46 Mb (sd
18.30 Mb /sbin/init
18.17 Mb /usr/sbin/rsyslogd
17.50 Mb gdm
17.42 Mb gdm
17.09 Mb /usr/lib/dconf/dconf
17.09 Mb /usr/lib/at
17.06 Mb /usr/lib/gvfs/gvfsd
16.98 Mb /usr/lib/at
16.91 Mb /usr/lib/gdm3/gdm
16.86 Mb /usr/lib/gvfs/gvfsd
16.86 Mb /usr/lib/gdm3/gdm
16.85 Mb /usr/lib/dconf/dconf
16.85 Mb /usr/lib/dconf/dconf
16.73 Mb /usr/lib/rtkit/rtkit
16.69 Mb /lib/systemd/systemd
13.13 Mb /usr/lib/chromium/chromium
13.13 Mb /usr/lib/chromium/chromium
10.92 Mb anydesk
8.54 Mb /sbin/lvmetad
7.43 Mb /usr/sbin/apache2
6.82 Mb /usr/sbin/apache2
6.77 Mb /usr/sbin/apache2
6.73 Mb /usr/sbin/apache2
6.66 Mb /usr/sbin/apache2
6.64 Mb /usr/sbin/apache2
6.63 Mb /usr/sbin/apache2
6.62 Mb /usr/sbin/apache2
6.51 Mb /usr/sbin/apache2
6.25 Mb /usr/sbin/apache2
6.22 Mb /usr/sbin/apache2
3.92 Mb bash
3.14 Mb bash
2.97 Mb bash
2.95 Mb bash
2.93 Mb bash
2.91 Mb bash
2.86 Mb bash
2.86 Mb bash
2.86 Mb bash
2.84 Mb bash
2.84 Mb bash
2.45 Mb /lib/systemd/systemd
2.30 Mb (sd
2.28 Mb /usr/bin/dbus
1.84 Mb /usr/bin/dbus
1.46 Mb ps
1.21 Mb openvpn hackthebox.ovpn
1.16 Mb /sbin/dhclient
1.16 Mb /sbin/dhclient
1.09 Mb /lib/systemd/systemd
0.98 Mb /sbin/mount.ntfs /dev/sda3 /media/n0bit4/Data
0.97 Mb /lib/systemd/systemd
0.96 Mb /lib/systemd/systemd
0.89 Mb /usr/sbin/smartd
0.77 Mb /usr/bin/dbus
0.76 Mb su
0.76 Mb su
0.76 Mb su
0.76 Mb su
0.76 Mb su
0.76 Mb su
0.75 Mb sudo su
0.75 Mb sudo su
0.75 Mb sudo su
0.75 Mb sudo su
0.75 Mb sudo su
0.75 Mb sudo su
0.74 Mb /usr/bin/dbus
0.71 Mb /usr/lib/apt/methods/http
0.68 Mb /bin/bash /usr/bin/mysqld_safe
0.68 Mb /sbin/wpa_supplicant
0.66 Mb /usr/bin/dbus
0.61 Mb /lib/systemd/systemd
0.54 Mb /usr/bin/dbus
0.46 Mb /usr/sbin/cron
0.45 Mb /usr/sbin/irqbalance
0.43 Mb logger
0.41 Mb awk { hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }
0.40 Mb /usr/bin/ssh
0.34 Mb /usr/lib/chromium/chrome
0.32 Mb cut
0.32 Mb cut
0.00 Mb [kthreadd]
0.00 Mb [ksoftirqd/0]
0.00 Mb [kworker/0:0H]
0.00 Mb [rcu_sched]
0.00 Mb [rcu_bh]
0.00 Mb [migration/0]
0.00 Mb [lru
0.00 Mb [watchdog/0]
0.00 Mb [cpuhp/0]
0.00 Mb [cpuhp/1]
0.00 Mb [watchdog/1]
0.00 Mb [migration/1]
0.00 Mb [ksoftirqd/1]
0.00 Mb [kworker/1:0H]
0.00 Mb [cpuhp/2]
0.00 Mb [watchdog/2]
0.00 Mb [migration/2]
0.00 Mb [ksoftirqd/2]
0.00 Mb [kworker/2:0H]
0.00 Mb [cpuhp/3]
0.00 Mb [watchdog/3]
0.00 Mb [migration/3]
0.00 Mb [ksoftirqd/3]
0.00 Mb [kworker/3:0H]
0.00 Mb [kdevtmpfs]
0.00 Mb [netns]
0.00 Mb [khungtaskd]
0.00 Mb [oom_reaper]
0.00 Mb [writeback]
0.00 Mb [kcompactd0]
0.00 Mb [ksmd]
0.00 Mb [khugepaged]
0.00 Mb [crypto]
0.00 Mb [kintegrityd]
0.00 Mb [bioset]
0.00 Mb [kblockd]
0.00 Mb [devfreq_wq]
0.00 Mb [watchdogd]
0.00 Mb [kswapd0]
0.00 Mb [vmstat]
0.00 Mb [kthrotld]
0.00 Mb [ipv6_addrconf]
0.00 Mb [acpi_thermal_pm]
0.00 Mb [ata_sff]
0.00 Mb [scsi_eh_0]
0.00 Mb [scsi_tmf_0]
0.00 Mb [scsi_eh_1]
0.00 Mb [scsi_tmf_1]
0.00 Mb [scsi_eh_2]
0.00 Mb [scsi_tmf_2]
0.00 Mb [scsi_eh_3]
0.00 Mb [scsi_tmf_3]
0.00 Mb [scsi_eh_4]
0.00 Mb [scsi_tmf_4]
0.00 Mb [scsi_eh_5]
0.00 Mb [scsi_tmf_5]
0.00 Mb [bioset]
0.00 Mb [kworker/1:1H]
0.00 Mb [kworker/3:1H]
0.00 Mb [kworker/0:1H]
0.00 Mb [kdmflush]
0.00 Mb [bioset]
0.00 Mb [kdmflush]
0.00 Mb [bioset]
0.00 Mb [jbd2/sda5
0.00 Mb [ext4
0.00 Mb [kworker/2:1H]
0.00 Mb [kauditd]
0.00 Mb [bioset]
0.00 Mb [drbd
0.00 Mb [irq/27
0.00 Mb [i915/signal:0]
0.00 Mb [i915/signal:1]
0.00 Mb [i915/signal:2]
0.00 Mb [ttm_swap]
0.00 Mb [cfg80211]
0.00 Mb [kworker/u17:0]
0.00 Mb [hci0]
0.00 Mb [hci0]
0.00 Mb [kworker/u17:1]
0.00 Mb [iprt
0.00 Mb [iprt
0.00 Mb [kworker/1:0]
0.00 Mb [kworker/3:0]
0.00 Mb [kworker/0:0]
0.00 Mb [kworker/2:0]
0.00 Mb [kworker/u16:0]
0.00 Mb [kworker/u16:2]
0.00 Mb [kworker/3:2]
0.00 Mb [kworker/2:1]
0.00 Mb [kworker/1:2]
0.00 Mb [kworker/0:2]
0.00 Mb [kworker/2:2]
0.00 Mb [kworker/0:1]
0.00 Mb [scsi_eh_6]
0.00 Mb [scsi_tmf_6]
0.00 Mb [usb
0.00 Mb [bioset]
0.00 Mb [kworker/3:1]
0.00 Mb [kworker/u16:1]
Ce zici de "timp"?
Nu Bash interna "timp", dar o puteți găsi cu care
, de exemplu /usr/bin/time
Aici's ceea ce se referă, pe de o simplă "ls":
$ /usr/bin/time --verbose ls
(...)
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 2372
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 121
Voluntary context switches: 2
Involuntary context switches: 9
Swaps: 0
File system inputs: 256
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
Acesta este un excelent rezumat instrumentele și probleme: archive.org link
Am'll citat, astfel că mai multe vor citi.
Dacă doriți pentru a analiza utilizarea de memorie de sistem întreg sau să analizeze cu atenție utilizarea de memorie de o cerere (nu doar sa morman de utilizare), utilizați exmap. Pentru întregul sistem de analiză, găsi procesele cu cele mai mari efective de utilizare, acestea să ia cele mai de memorie în practică, găsi procesele cu cea mai mare inscriptibil utilizare, ele creează cele mai multe date (și, prin urmare, eventual, scurgeri sau sunt foarte ineficiente în utilizarea lor de date). Selectați o astfel de aplicare și analiza asocierilor în cel de-al doilea listview. Vezi exmap secțiunea pentru mai multe detalii. Folosi, de asemenea, xrestop pentru a verifica grad ridicat de utilizare a X resurse, mai ales dacă procesul de serverul X să ia o mulțime de memorie. Vezi xrestop secțiune pentru detalii.
Dacă doriți pentru a detecta scurgerile de informații, utilizați valgrind sau, eventual, kmtrace.
Dacă doriți să analizeze heap (malloc etc.) de utilizare a unei aplicații, fie rulați-l în memprof sau kmtrace, profil aplicația și de căutare în arborele apelurilor de funcții pentru cele mai mari alocări. A se vedea secțiunile lor pentru mai multe detalii.
Pe lângă soluțiile enumerate în ta răspunsuri, puteți folosi Linux command "sus"; oferă o dinamică de vedere în timp real de funcționare a sistemului, acesta oferă CPU și utilizarea Memoriei pentru întregul sistem, împreună cu pentru fiecare program, în procente:
top
pentru a filtra după un program pid:
top -p <PID>
pentru a filtra după un nume de program:
top | grep <PROCESS NAME>
"sus" oferă, de asemenea, unele domenii cum ar fi:
VIRT ... Virtual Imagine (kb) :cantitatea totală de memorie virtuală utilizată de sarcina
RES -- Rezident dimensiunea (kb): non-schimbat memorie fizică o sarcină a folosit ; RES = COD + DATE.
DATE-Date+Stivă dimensiunea (kb): cantitatea de memorie fizică dedicat altele decât codul executabil, de asemenea, cunoscut ca 'date rezident set' dimensiune sau DRS.
SHR-la Comun de Mem dimensiunea (kb): cantitatea de memorie partajată folosit de o sarcina. Pur și simplu reflectă memorie care ar putea fi partajate cu alte procese.
De referință aici.
Nu e't un singur răspuns pentru acest lucru, deoarece vă poate't pin punct precis cantitatea de memorie un proces folosește. Cele mai multe procese în linux utilizarea bibliotecilor partajate. De exemplu, să's spun doriți pentru a calcula utilizarea de memorie pentru 'e' proces. Ai conta doar memoria utilizată de către executabil 'e' ( dacă ai putea să-l izoleze) ? Cât despre libc? Sau toate aceste alte libs care sunt necesare pentru a rula 'e'?
linux-gate.so.1 => (0x00ccb000)
librt.so.1 => /lib/librt.so.1 (0x06bc7000)
libacl.so.1 => /lib/libacl.so.1 (0x00230000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)
libc.so.6 => /lib/libc.so.6 (0x00b40000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)
/lib/ld-linux.so.2 (0x00b1d000)
libattr.so.1 => /lib/libattr.so.1 (0x00229000)
libdl.so.2 => /lib/libdl.so.2 (0x00cae000)
libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)
Ai putea argumenta că acestea sunt împărtășite de alte procese, dar 'e' poate't fi rulat pe sistemul fără ca acestea să fie încărcate.
De asemenea, dacă aveți nevoie să știți cât de mult de memorie un proces are nevoie în scopul de a face planificarea capacității, trebuie să calcula cât de mult fiecare exemplar suplimentar al procesului de utilizări. Cred că /proc/PID/status-ar putea să-ți dau destule informații din memorie de utilizare LA o singură dată. Pe de altă parte, valgrind va oferi un profil mai bun de memorie de utilizare pe întreaga durată de viață a programului
În cazul în care codul este în C sau C++ s-ar putea fi capabil de a utiliza getrusage()
care revine diverse statistici despre memorie și de utilizare în timp a procesului.
Nu toate platformele susțin acest lucru, deși și va returna valoarea 0 pentru memorie utilizat de opțiuni.
In schimb poti sa te uiti la fișiere virtual creat în/proc/[pid]/statm "(unde " [pid]este înlocuit cu id-ul de proces. Puteți obține acest lucru de la
getpid()`).
Acest fișier va arata ca un fișier text cu 7 numere întregi. Sunt, probabil, cel mai interesat în primul rând (toate memorie de utilizare) și a șasea (date memorie de utilizare) numerele din acest fișier.
Valgrind poate afișa informații detaliate, dar încetinește aplicația țintă în mod semnificativ, și în majoritatea timpului se schimbă comportamentul aplicației. Exmap era ceva ce nu't știu încă, dar se pare că ai nevoie de un modulul de kernel pentru a obține informații, care pot fi un obstacol.
Presupun că ceea ce toată lumea vrea să știe WRT "memorie de utilizare" este urmatoarea... În linux, cantitatea de memorie fizică-un singur proces s-ar putea folosi pot fi împărțite în următoarele categorii.
M. un anonim mapate în memorie
.p privat
.d murdare == malloc/mmapped grămadă și stiva alocată și scris de memorie
.c curat == malloc/mmapped grămadă și stiva de memorie o dată alocate, în scris, apoi eliberat, dar nu a revendicat încă
.s comună
.d murdare == malloc/mmaped heap-ar putea obține copy-on-write și partajate între procese (editat)
.c curat == malloc/mmaped heap-ar putea obține copy-on-write și partajate între procese (editat)
M. n nume de memorie mapate
.p privat
.d murdare == fișier mmapped scris de memorie private
.c curat == mapate program/library text privat mapate
.s comună
.d murdare == fișier mmapped scris de memorie partajată
.c curat == mapate bibliotecă text comun mapate
Utilitarul inclus în Android numit showmap este destul de util
virtual shared shared private private
size RSS PSS clean dirty clean dirty object
-------- -------- -------- -------- -------- -------- -------- ------------------------------
4 0 0 0 0 0 0 0:00 0 [vsyscall]
4 4 0 4 0 0 0 [vdso]
88 28 28 0 0 4 24 [stack]
12 12 12 0 0 0 12 7909 /lib/ld-2.11.1.so
12 4 4 0 0 0 4 89529 /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
28 0 0 0 0 0 0 86661 /usr/lib/gconv/gconv-modules.cache
4 0 0 0 0 0 0 87660 /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
4 0 0 0 0 0 0 89528 /usr/lib/locale/en_US.utf8/LC_TELEPHONE
4 0 0 0 0 0 0 89527 /usr/lib/locale/en_US.utf8/LC_ADDRESS
4 0 0 0 0 0 0 87717 /usr/lib/locale/en_US.utf8/LC_NAME
4 0 0 0 0 0 0 87873 /usr/lib/locale/en_US.utf8/LC_PAPER
4 0 0 0 0 0 0 13879 /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
4 0 0 0 0 0 0 89526 /usr/lib/locale/en_US.utf8/LC_MONETARY
4 0 0 0 0 0 0 89525 /usr/lib/locale/en_US.utf8/LC_TIME
4 0 0 0 0 0 0 11378 /usr/lib/locale/en_US.utf8/LC_NUMERIC
1156 8 8 0 0 4 4 11372 /usr/lib/locale/en_US.utf8/LC_COLLATE
252 0 0 0 0 0 0 11321 /usr/lib/locale/en_US.utf8/LC_CTYPE
128 52 1 52 0 0 0 7909 /lib/ld-2.11.1.so
2316 32 11 24 0 0 8 7986 /lib/libncurses.so.5.7
2064 8 4 4 0 0 4 7947 /lib/libdl-2.11.1.so
3596 472 46 440 0 4 28 7933 /lib/libc-2.11.1.so
2084 4 0 4 0 0 0 7995 /lib/libnss_compat-2.11.1.so
2152 4 0 4 0 0 0 7993 /lib/libnsl-2.11.1.so
2092 0 0 0 0 0 0 8009 /lib/libnss_nis-2.11.1.so
2100 0 0 0 0 0 0 7999 /lib/libnss_files-2.11.1.so
3752 2736 2736 0 0 864 1872 [heap]
24 24 24 0 0 0 24 [anon]
916 616 131 584 0 0 32 /bin/bash
-------- -------- -------- -------- -------- -------- -------- ------------------------------
22816 4004 3005 1116 0 876 2012 TOTAL
Valgrind este uimitor, dacă aveți timp să-l rulați. `valgrind --tool=masivului este Solutia potrivita.
Cu toate acestea, am'm de pornire pentru a rula mai mari exemple, și folosind valgrind nu mai este practic. Există o modalitate de a spune maxim de utilizare a memoriei (modulo dimensiunea de pagină și paginile partajate) de un program?
Pe un adevărat sistem unix, /usr/bin/time-v
funcționează. Pe Linux, cu toate acestea, acest lucru nu de muncă.
Trei metode pentru a încerca:
ps aux-un fel pmem
Este felul de ieșire prin %MEM
.ps aux | awk '{print $2, $4, $11}' | sortare-k2r | cap-n 15
Este felul folosind conducte.(Extras din aici)
#!/bin/ksh
#
# Returns total memory used by process $1 in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#
IFS=$'\n'
for line in $(</proc/$1/smaps)
do
[[ $line =~ ^Size:\s+(\S+) ]] && ((kb += ${.sh.match[1]}))
done
print $kb
Un test bun dintre cele mai "din lumea reală" de utilizare este de a deschide aplicația, apoi run vmstat -s
și verificați "active memorie" statistică. Închideți aplicația, așteptați câteva secunde și a alerga vmstat -s
din nou. Cu toate acestea multă memorie activă a fost eliberat a fost în mod evident în utilizarea de app.
Dacă procesul nu utilizează prea multă memorie (fie pentru că vă așteptați ca acest lucru să fie cazul, sau o altă comandă a dat acest indiciu inițial), iar procesul poate rezista fiind oprit pentru o perioadă scurtă de timp, puteți încerca să utilizați gcore comanda.
gcore <pid>
Verificați dimensiunea generat un fișier de bază pentru a obține o idee bună de cât de mult de memorie de un anumit proces este folosind.
Asta nu't merge prea bine dacă procesul este folosind sute de mega sau giga, ca nucleu generație ar putea să dureze câteva secunde sau minute pentru a fi create în funcție de I/O performanță. Timpul de bază crearea procesul este oprit (sau "congelate") pentru a preveni schimbarile de memorie. Deci, fi atent.
De asemenea, asigurați-vă că punctul de montare în cazul în care miezul este generat are o mulțime de spațiu pe disc și de faptul că sistemul nu va reacționa negativ la un fișier de bază de a fi creat în acel director.
Eu folosesc Arch Linux și nu's acest pachet minunat numit ps_mem
ps_mem -p <pid>
Exemplu De Rezultat
$ ps_mem -S -p $(pgrep firefox)
Private + Shared = RAM used Swap used Program
355.0 MiB + 38.7 MiB = 393.7 MiB 35.9 MiB firefox
---------------------------------------------
393.7 MiB 35.9 MiB
=============================================