Ini pertanyaan tertutup di sini secara detail.
Bagaimana anda mengukur penggunaan memori dari sebuah aplikasi atau proses di Linux?
Dari blog artikel Pemahaman penggunaan memori pada Linux, ps
tidak akurat alat yang digunakan untuk maksud ini.
Mengapa
ps
adalah "salah"Tergantung pada bagaimana anda melihatnya,
ps
tidak melaporkan nyata penggunaan kehabisan memori proses. Apa itu benar-benar lakukan adalah menunjukkan berapa banyak memori nyata masing-masing proses akan memakan jika itu adalah satu-satunya proses yang berjalan. Tentu saja, khas mesin Linux memiliki beberapa lusin proses yang berjalan pada waktu tertentu, yang berarti bahwa VSZ dan RSS angka yang dilaporkan olehps
hampir pasti salah.
Dengan ps
atau alat serupa anda hanya akan mendapatkan jumlah halaman memori yang dialokasikan oleh proses itu. Jumlah ini benar, tetapi:
tidak mencerminkan jumlah yang sebenarnya dari memori yang digunakan oleh aplikasi, hanya jumlah memori yang disediakan untuk itu
dapat menyesatkan jika halaman bersama, misalnya dengan beberapa benang atau dengan menggunakan dinamis terkait perpustakaan
Jika anda benar-benar ingin tahu apa jumlah memori aplikasi anda benar-benar menggunakan, anda perlu untuk menjalankannya hanya profiler. Misalnya, valgrind
dapat memberikan anda wawasan tentang jumlah memori yang digunakan, dan, yang lebih penting, tentang kemungkinan kebocoran memori dalam program anda. Tumpukan profiler alat valgrind disebut 'massif':
Massif adalah tumpukan profiler. Ia melakukan rinci tumpukan profiling dengan mengambil reguler snapshot dari program's tumpukan. Menghasilkan grafik yang menunjukkan tumpukan penggunaan dari waktu ke waktu, termasuk informasi tentang bagian-bagian mana dari program yang bertanggung jawab untuk sebagian besar alokasi memori. Grafik yang dilengkapi dengan teks atau file HTML yang berisi informasi lebih lanjut untuk menentukan mana yang paling memori yang dialokasikan. Massif menjalankan program-program tentang 20x lebih lambat dari normal.
Seperti yang dijelaskan dalam valgrind dokumentasi, yang anda butuhkan untuk menjalankan program melalui valgrind:
valgrind --tool=massif <executable> <arguments>
Massif menulis dump dari memori penggunaan foto (misalnya massif.keluar.12345
). Ini memberikan, (1) waktu penggunaan memori, (2) untuk setiap foto, catatan di mana dalam program anda adalah memori yang dialokasikan.
Besar grafis alat untuk menganalisis file-file ini adalah massif-visualizer. Tapi saya menemukan ms_print
, sederhana berbasis teks tool dikirim dengan valgrind, akan sangat membantu sudah.
Untuk menemukan kebocoran memori, gunakan (default) memcheck
alat valgrind.
Sulit untuk mengatakan dengan pasti, tapi di sini ada dua "tutup" hal-hal yang dapat membantu.
$ ps aux
akan memberikan anda Virtual Ukuran (VSZ)
Anda juga bisa mendapatkan statistik rinci dari /proc file sistem dengan pergi ke /proc/$pid/status
Yang paling penting adalah VmSize, yang harus dekat dengan apa yang ps aux
memberikan.
/proc/19420$ cat status Nama: firefox Negara: S (sleeping) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDSize: 256 Kelompok: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000 VmPeak: 222956 kB VmSize: 212520 kB VmLck: 0 mb VmHWM: 127912 kB VmRSS: 118768 kB VmData: 170180 kB VmStk: 228 kB VmExe: 28 mb VmLib: 35424 kB VmPTE: 184 kB Thread: 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
Dalam versi terbaru dari linux, gunakan smaps subsistem. Misalnya, untuk sebuah proses dengan PID 1234:
cat /proc/1234/smaps
Ini akan memberitahu anda persis berapa banyak memori yang menggunakan pada waktu itu. Lebih penting lagi, itu akan membagi memori menjadi pribadi dan bersama, sehingga anda dapat memberitahu berapa banyak memori anda contoh program menggunakan, tanpa termasuk memori dibagi antara beberapa contoh dari program ini.
Gunakan smem, yang merupakan alternatif untuk ps yang menghitung USS dan PSS per proses. Apa yang anda inginkan mungkin adalah PSS.
USS - Unik Ukuran. Ini adalah jumlah memori memori yang unik untuk proses itu (anggap saja sebagai U untuk unik memori). Itu tidak termasuk memori bersama. Dengan demikian hal ini akan bawah-laporan jumlah memori proses yang menggunakan, tapi sangat membantu ketika anda ingin mengabaikan memori bersama.
PSS - Proporsional Set Ukuran. Ini adalah apa yang anda inginkan. Ia menambahkan bersama-sama memori yang unik (USS), bersama dengan proporsi ruang memori dibagi dengan jumlah proses berbagi memori. Dengan demikian hal ini akan memberikan representasi akurat dari berapa banyak sebenarnya memori fisik yang digunakan per proses dengan memori bersama yang benar-benar mewakili ruang. Berpikir dari P untuk fisik memori.
Bagaimana hal ini dibandingkan dengan RSS seperti yang dilaporkan oleh ps dan lain utilties:
Pemberitahuan: smem juga dapat (opsional) output grafik seperti grafik pie dan sejenisnya. IMO yang anda don't membutuhkan semua itu. Jika anda hanya ingin menggunakannya dari baris perintah seperti anda mungkin menggunakan ps -v, maka anda don't perlu menginstal python-matplotlib dianjurkan ketergantungan.
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]
Apa tentang waktu
?
Tidak Bash builtin waktu
tapi salah satu yang anda dapat menemukan dengan waktu
, misalnya /usr/bin/time
Berikut ini's apa itu meliputi, sederhana 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
Ini adalah ringkasan yang sangat baik dari alat-alat dan masalah: archive.org link
I'll kutipan itu, sehingga lebih devs akan benar-benar membacanya.
Jika anda ingin menganalisis penggunaan memori dari seluruh sistem atau untuk secara menyeluruh menganalisis penggunaan memori dari satu aplikasi (tidak hanya tumpukan penggunaan), menggunakan exmap. Untuk seluruh sistem analisis, menemukan proses yang tinggi dengan penggunaan yang efektif, mereka mengambil sebagian besar memori dalam praktek, menemukan semua proses yang terkait dengan tertinggi yang dapat ditulisi penggunaan, mereka membuat sebagian besar data (dan oleh karena itu mungkin bocor atau sangat tidak efektif dalam penggunaan data). Pilih aplikasi tersebut dan menganalisis untuk pemetaan di kedua listview. Lihat exmap bagian untuk rincian lebih lanjut. Juga menggunakan xrestop untuk memeriksa penggunaan tinggi X sumber daya, terutama jika proses X server membutuhkan banyak memori. Lihat xrestop bagian untuk rincian.
Jika anda ingin mendeteksi kebocoran, menggunakan valgrind atau kmtrace.
Jika anda ingin menganalisis tumpukan (malloc dll.) penggunaan aplikasi, baik jalankan di memprof atau kmtrace, profil aplikasi dan mencari panggilan fungsi pohon untuk alokasi terbesar. Melihat bagian-bagian mereka untuk rincian lebih lanjut.
Di samping solusi yang terdaftar di mu jawaban, anda dapat menggunakan perintah Linux "top"; menyediakan dinamis pandangan real-time dari sistem yang sedang berjalan, memberikan CPU dan penggunaan Memori, untuk seluruh sistem yang tersedia untuk setiap program, dalam persentase:
top
untuk menyaring oleh program pid:
top -p <PID>
untuk filter dengan nama program:
top | grep <PROCESS NAME>
"top" menyediakan juga beberapa bidang seperti:
VIRT -- Gambar Virtual (kb) :total jumlah memori virtual yang digunakan oleh tugas
RES -- Penduduk size (kb): non-swap memori fisik tugas yang telah digunakan ; RES = KODE + DATA.
DATA-Data Stack size (kb): jumlah memori fisik yang ditujukan untuk selain kode dieksekusi, juga dikenal sebagai 'data penduduk set' ukuran atau DRS.
SHR -- Bersama Mem size (kb): jumlah ruang memori yang digunakan oleh sebuah tugas. Itu hanya mencerminkan memori yang dapat berpotensi bersama dengan proses lainnya.
Referensi di sini.
Ada isn't satu jawaban untuk ini karena anda dapat't titik pin tepatnya jumlah memori yang menggunakan proses. Sebagian besar proses di linux menggunakan shared library. Misalnya, let's mengatakan anda ingin menghitung penggunaan memori untuk 'ls' proses. Apakah anda mengandalkan hanya memori yang digunakan oleh eksekusi 'ls' ( jika anda bisa mengisolasi) ? Bagaimana libc? Atau semua ini lain libs yang diperlukan untuk menjalankan 'ls'?
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)
Anda bisa berpendapat bahwa mereka sedang dimiliki oleh proses lain, tapi 'ls' dapat't dapat dijalankan pada sistem tanpa mereka sedang dimuat.
Juga, jika anda perlu tahu berapa banyak memori yang dibutuhkan proses dalam rangka untuk melakukan perencanaan kapasitas, anda harus menghitung berapa banyak masing-masing salinan tambahan dari proses menggunakan. Saya pikir /proc/PID/status mungkin memberi anda cukup info dari penggunaan memori PADA satu waktu. Di sisi lain, valgrind akan memberikan profil yang lebih baik dari penggunaan memori sepanjang masa program
Jika kode anda di C atau C++, anda mungkin dapat menggunakan getrusage()
yang akan membawa anda kembali berbagai statistik tentang memori dan waktu penggunaan dari proses anda.
Tidak semua dukungan platform ini dan akan mengembalikan nilai 0 untuk memori digunakan pilihan.
Sebaliknya, anda dapat melihat virtual file yang dibuat di /proc/[pid]/statm
(di mana [pid]
diganti dengan id proses. Anda dapat memperoleh ini dari getpid()
).
File ini akan terlihat seperti sebuah file teks dengan 7 bilangan bulat. Anda mungkin tertarik pada cara pertama (semua penggunaan memori) dan keenam (data penggunaan memori) angka-angka dalam file ini.
Valgrind dapat menampilkan informasi rinci tetapi memperlambat aplikasi target secara signifikan, dan sebagian besar waktu itu perubahan perilaku aplikasi. Exmap adalah sesuatu yang saya tidak't tahu belum, tapi tampaknya bahwa anda perlu modul kernel untuk mendapatkan informasi, yang dapat menjadi kendala.
Saya menganggap apa yang semua orang ingin tahu WRT "penggunaan memori" adalah sebagai berikut... Di linux, jumlah memori fisik suatu proses tunggal mungkin menggunakan secara kasar dapat dibagi menjadi kategori berikut.
M. a anonim dipetakan memori
.p swasta
.d kotor == malloc/mmapped tumpukan dan tumpukan dialokasikan dan menulis memori
.c bersih == malloc/mmapped heap dan stack memori setelah dialokasikan, tertulis, kemudian dibebaskan, tapi tidak direklamasi belum
.s bersama
.d kotor == malloc/mmaped tumpukan bisa mendapatkan copy-on-write dan dibagi di antara proses-proses (edited)
.c bersih == malloc/mmaped tumpukan bisa mendapatkan copy-on-write dan dibagi di antara proses-proses (edited)
M. n bernama dipetakan memori
.p swasta
.d kotor == file mmapped tertulis memori pribadi
.c bersih == dipetakan program/perpustakaan pribadi teks dipetakan
.s bersama
.d kotor == file mmapped tertulis memori bersama
.c bersih == dipetakan perpustakaan teks bersama dipetakan
Utilitas termasuk dalam Android yang disebut showmap cukup berguna
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 menakjubkan jika anda punya waktu untuk menjalankannya. valgrind --alat=massif
adalah Solusi Yang Tepat.
Namun, saya'm mulai menjalankan lebih besar contoh-contoh, dan menggunakan valgrind tidak lagi praktis. Apakah ada cara untuk memberitahu maksimum penggunaan memori (modulo ukuran halaman dan halaman bersama) dari program?
Pada sistem unix, /usr/bin/time -v
bekerja. Di Linux, namun, ini tidak not bekerja.
Tiga metode untuk mencoba:
ps aux --semacam pmem
Itu macam output sebesar %MEM
.ps aux | awk '{cetak $2, $4, $11}' | jenis -k2r | head-n 15
Hal itu dengan menggunakan pipa.atas -
Itu dimulai atas penyortiran oleh %MEM
(Diambil dari sini)
#!/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
Tes yang baik lebih "dunia nyata" penggunaan adalah untuk membuka aplikasi, kemudian jalankan vmstat -s
dan memeriksa "memori aktif" statistik. Menutup aplikasi, tunggu beberapa detik dan menjalankan vmstat -s
lagi. Namun banyak yang aktif di memori dibebaskan berada di jelas di gunakan oleh aplikasi.
Jika proses ini tidak menggunakan terlalu banyak memori (baik karena anda berharap ini menjadi kasus, atau beberapa perintah telah diberikan ini indikasi awal), dan proses dapat menahan dihentikan untuk waktu singkat, anda bisa mencoba untuk menggunakan gcore perintah.
gcore <pid>
Periksa ukuran dihasilkan file inti untuk mendapatkan ide yang baik berapa banyak memori yang digunakan proses tertentu adalah dengan menggunakan.
Ini won't bekerja terlalu baik jika proses ini menggunakan ratusan mb, atau pertunjukan, sebagai core generasi bisa memakan waktu beberapa detik atau menit akan dibuat tergantung pada kinerja I/O. Selama core penciptaan proses yang dihentikan (atau "beku") untuk mencegah perubahan memori. Jadi hati-hati.
Juga pastikan mount point di mana inti yang dihasilkan memiliki banyak ruang disk dan bahwa sistem tidak akan bereaksi negatif terhadap core file yang dibuat dalam direktori tertentu.
Saya menggunakan Arch Linux dan ada's ini menyediakan paket yang disebut ps_mem
ps_mem -p <pid>
Contoh Output
$ 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
=============================================