it-swarm.asia

كيفية قياس استخدام الذاكرة الفعلي للتطبيق أو العملية؟

هذا السؤال مغطى هنا بتفصيل كبير.

كيف تقيس استخدام الذاكرة لتطبيق أو عملية في Linux؟

من مقال مدونة فهم استخدام الذاكرة على Linux ، ps ليست أداة دقيقة لاستخدامها في هذه الغاية.

لماذا ps "خاطئة"

وفقًا لطريقة نظرتك إليه ، ps لا تبلغ عن استخدام الذاكرة الحقيقي للعمليات. ما تقوم به فعلاً هو إظهار مقدار الذاكرة الحقيقية التي ستستهلكها كل عملية إذا كانت العملية الوحيدة قيد التشغيل . بالطبع ، لدى جهاز Linux النموذجي عشرات العمليات التي تعمل في أي وقت ، مما يعني أن أرقام VSZ و RSS التي أبلغ عنها ps هي بالتأكيد خاطئ.

656
ksuralta

باستخدام ps أو أدوات مشابهة ، ستحصل فقط على مقدار صفحات الذاكرة المخصصة بواسطة هذه العملية. هذا الرقم صحيح ، لكن:

  • لا يعكس الحجم الفعلي للذاكرة المستخدمة من قبل التطبيق ، فقط مقدار الذاكرة المحجوزة لذلك

  • يمكن أن تكون مضللة إذا تمت مشاركة الصفحات ، على سبيل المثال عن طريق عدة مؤشرات ترابط أو باستخدام مكتبات مرتبطة ديناميكيًا

إذا كنت تريد حقًا معرفة مقدار الذاكرة التي يستخدمها تطبيقك بالفعل ، فأنت بحاجة إلى تشغيلها داخل ملف التعريف. على سبيل المثال ، valgrind يمكن أن يمنحك رؤى حول مقدار الذاكرة المستخدمة ، والأهم من ذلك ، حول تسرب الذاكرة المحتمل في البرنامج. يُطلق على أداة إنشاء ملفات تعريف الكومة الخاصة بـ valgrind 'massif':

Massif هو كومة التعريف. ينفذ كومة الذاكرة المؤقتة مفصلة عن طريق أخذ لقطات منتظمة من كومة البرنامج. ينتج رسمًا بيانيًا يوضح استخدام كومة الذاكرة المؤقتة مع مرور الوقت ، بما في ذلك معلومات حول أجزاء البرنامج المسؤولة عن معظم عمليات تخصيص الذاكرة. يتم استكمال الرسم البياني بواسطة ملف نصي أو ملف HTML يتضمن المزيد من المعلومات لتحديد حيث يتم تخصيص أكبر قدر من الذاكرة. يدير Massif برامج حوالي 20x أبطأ من المعتاد.

كما هو موضح في valgrind الوثائق ، تحتاج إلى تشغيل البرنامج من خلال valgrind:

valgrind --tool=massif <executable> <arguments>

يكتب Massif لقطات من استخدام الذاكرة (على سبيل المثال ، massif.out.12345). توفر هذه (1) جدولًا زمنيًا لاستخدام الذاكرة ، (2) لكل لقطة ، سجلًا بالمكان الذي تم تخصيص ذاكرة البرنامج به. أداة رسومية كبيرة لتحليل هذه الملفات هي massif-visualizer . لكنني وجدت ms_print ، وهي أداة بسيطة تستند إلى النص يتم شحنها مع valgrind ، لتكون ذات فائدة كبيرة بالفعل.

للعثور على تسرب الذاكرة ، استخدم (الافتراضي) memcheck أداة valgrind.

328
ypnos

جرب pmap الأمر:

Sudo pmap -x <process pid>
261
Anil

من الصعب أن نتأكد من ذلك ، ولكن هنا شيئان "وثيقان" يمكنهما المساعدة.

$ ps aux 

سوف أعطيك الحجم الظاهري (VSZ)

يمكنك أيضًا الحصول على إحصائيات مفصلة من/نظام ملفات proc من خلال الانتقال إلى /proc/$pid/status

الأهم هو VmSize ، والذي يجب أن يكون قريبًا مما يعطيه ps aux.

/proc/19420 $ حالة القط 
 الاسم: firefox 
 الحالة: S (نائم) 
 Tgid: 19420 
 Pid: 19420 
 .] PPid: 1 
 TracerPid: 0 
 Uid: 1000 1000 1000 1000 
 Gid: 1000 1000 1000 1000 
 FDSize: 256 
 المجموعات: 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 كيلو بايت 
 VmData: 170180 كيلو بايت 
 VmStk: 228 كيلو بايت 
 VmExe: 28 كيلو بايت 
 VmLib: 35424 كيلو بايت 
 VmPTE: 184 كيلو بايت 
 المواضيع: 8 
 SigQ: 0/16382 
 SigPnd: 0000000000000000 
 ShdPnd: 0000000000000000 
 SigBlk: 0000000000000000 
 ] SigIgn: 0000000020001000 
 SigCgt: 000000018000442f 
 CapInh: 0000000000000000 
 CapPrm: 0000000000000000 
 CapEff: 0000000000000000 
 Cpus_allowed: 03 
 : 1 
 volunte_ctxt_switches: 63422 
 nonvolitional_ctxt_switches: 7171 
 
187
DustinB

في الإصدارات الأخيرة من نظام التشغيل linux ، استخدم smaps النظام الفرعي. على سبيل المثال ، لعملية ذات معرف PID من 1234:

cat /proc/1234/smaps

سيخبرك بالضبط مقدار الذاكرة التي يستخدمها في ذلك الوقت. الأهم من ذلك ، أنها ستقسم الذاكرة إلى خاصة ومشتركة ، بحيث يمكنك معرفة مقدار الذاكرة التي تستخدمها - من البرنامج ، دون تضمين الذاكرة المشتركة بين مثيلات متعددة من البرنامج.

127
Paul Biggar

لا توجد طريقة سهلة لحساب هذا. لكن بعض الناس حاولوا الحصول على بعض الإجابات الجيدة:

123
Bash
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] 
73
Lokendra Singh Rawat

ماذا عن time؟

ليس Bash المدمج time ولكن يمكنك العثور عليه باستخدام which time ، على سبيل المثال /usr/bin/time

إليك ما يغطيه ، على 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
62
Moonchild

هذا ملخص ممتاز للأدوات والمشكلات: رابط archive.org

سوف أقتبس ذلك ، حتى يقرأ المزيد من الـ Devs بالفعل.

إذا كنت ترغب في تحليل استخدام الذاكرة للنظام بأكمله أو تحليل استخدام الذاكرة بدقة لأحد التطبيقات (وليس فقط استخدام كومة الذاكرة المؤقتة الخاصة به) ، استخدم exmap . من أجل تحليل النظام بالكامل ، ابحث عن العمليات ذات الاستخدام الأكثر فاعلية ، وهي تأخذ أكبر قدر من الذاكرة في الممارسة ، والعثور على العمليات ذات الاستخدام الأعلى للكتابة ، وتقوم بإنشاء معظم البيانات (وبالتالي قد تتسرب أو تكون غير فعالة للغاية في استخدام البيانات الخاصة بها). حدد هذا التطبيق وتحليل تعييناته في listview الثاني. راجع قسم exmap لمزيد من التفاصيل. استخدم أيضًا xrestop للتحقق من الاستخدام العالي لموارد X ، خاصةً إذا كانت عملية خادم X تأخذ الكثير من الذاكرة. انظر قسم xrestop للحصول على التفاصيل.

إذا كنت تريد الكشف عن التسريبات ، استخدم valgrind أو ربما kmtrace .

إذا كنت ترغب في تحليل استخدام كومة الذاكرة المؤقتة (malloc وما إلى ذلك) للتطبيق ، فقم بتشغيله في memprof أو مع kmtrace ، قم بملف تعريف التطبيق وابحث عن شجرة استدعاء الوظيفة للحصول على أكبر التخصيصات. انظر أقسامهم لمزيد من التفاصيل.

38
phoku

بجانب الحلول المدرجة في إجاباتك ، يمكنك استخدام أمر Linux "top" ؛ يوفر عرضًا ديناميكيًا في الوقت الفعلي لنظام التشغيل ، ويوفر استخدام وحدة المعالجة المركزية والذاكرة ، للنظام بأكمله مع كل برنامج ، بالنسبة المئوية:

top

للتصفية حسب معرف البرنامج:

top -p <PID>

للتصفية حسب اسم البرنامج:

top | grep <PROCESS NAME>

يوفر "top" أيضًا بعض الحقول مثل:

VIRT - الصورة الافتراضية (كيلو بايت): إجمالي مقدار الذاكرة الظاهرية المستخدمة من قبل المهمة

RES - الحجم المقيم (kb): الذاكرة الفعلية غير القابلة للتبديل التي استخدمتها المهمة ؛ الدقة = الكود + البيانات.

DATA - Data + size stack (kb): مقدار الذاكرة الفعلية المخصصة لرمز قابل للتنفيذ ، والمعروف أيضًا باسم حجم "مجموعة البيانات المقيمة" أو DRS.

SHR - حجم الذاكرة المشتركة (kb): مقدار الذاكرة المشتركة المستخدمة بواسطة المهمة. إنه يعكس ببساطة الذاكرة التي يمكن مشاركتها مع العمليات الأخرى.

المرجع هنا .

26
Yahya Yahyaoui

لا توجد إجابة واحدة لهذا لأنه لا يمكنك تحديد مقدار الذاكرة الذي تستخدمه العملية بدقة. تستخدم معظم العمليات ضمن نظام التشغيل Linux مكتبات مشتركة. على سبيل المثال ، لنفترض أنك تريد حساب استخدام الذاكرة لعملية 'ls'. هل تحسب فقط الذاكرة المستخدمة بواسطة الملف التنفيذي القابل للتنفيذ (إذا أمكنك عزلها)؟ ماذا عن libc؟ أو كل هذه libs الأخرى المطلوبة لتشغيل '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)

يمكنك القول بأن هذه العمليات تتم مشاركتها بواسطة عمليات أخرى ، لكن لا يمكن تشغيل 'ls' على النظام دون تحميلها.

أيضًا ، إذا كنت بحاجة إلى معرفة مقدار الذاكرة التي تحتاجها العملية من أجل القيام بتخطيط السعة ، فعليك حساب مقدار كل نسخة إضافية من العملية. أعتقد أن/proc/PID/status قد يوفر لك معلومات كافية عن استخدام الذاكرة AT مرة واحدة. من ناحية أخرى ، سيمنحك valgrind ملف تعريف أفضل لاستخدام الذاكرة طوال عمر البرنامج

19
Dprado

إذا كان الكود الخاص بك في C أو C++ ، فقد تتمكن من استخدام getrusage() والتي تُرجع لك إحصائيات متنوعة حول الذاكرة واستخدام وقت العملية.

لا تدعم كل الأنظمة الأساسية هذا وسيتم إرجاع 0 قيم لخيارات استخدام الذاكرة.

بدلاً من ذلك ، يمكنك إلقاء نظرة على الملف الظاهري الذي تم إنشاؤه في /proc/[pid]/statm (حيث يتم استبدال [pid] بمعرف العملية الخاص بك. يمكنك الحصول على هذا من getpid()).

سيبدو هذا الملف كملف نصي يحتوي على 7 أعداد صحيحة. ربما تكون مهتمًا للغاية بالأرقام الأولى (استخدام الذاكرة بالكامل) والسادس (استخدام ذاكرة البيانات) في هذا الملف.

16
CashCow

Valgrind يمكن أن يعرض معلومات تفصيلية ولكنه يبطئ التطبيق المستهدف بشكل كبير ، وفي معظم الأحيان يغير سلوك التطبيق.
Exmap كان شيئًا لم أعرفه بعد ، لكن يبدو أنك بحاجة إلى وحدة kernel للحصول على المعلومات ، التي يمكن أن تكون عقبة.

أفترض أن كل شخص يريد أن يعرف WRT "استخدام الذاكرة" هو ما يلي ...
في نظام Linux ، يمكن تقسيم مقدار الذاكرة الفعلية التي قد تستخدمها عملية واحدة تقريبًا إلى فئات التالية.

  • M.a الذاكرة المعينة المجهولة

    • .p الخاص
      • .d dirty == malloc/mmapped الكومة ومكدس الذاكرة المخصصة والمكتوبة
      • .c clean == malloc/mmapped الكومة والذاكرة المكدس بمجرد تخصيصها ، كتابتها ، ثم تحريرها ، ولكن لم يتم استصلاحها بعد
    • .s شارك [.
      • .d dirty == كومة malloc/mmaped يمكن الحصول على نسخ ومشاركتها بين العمليات (تم التعديل)
      • .c clean == كومة malloc/mmaped يمكن الحصول على نسخ ومشاركتها بين العمليات (تم التعديل)
  • M. المسماة الذاكرة المعينة

    • .p الخاص
      • .d القذرة == ملف mmapped الذاكرة المكتوبة الخاصة
      • .c clean == نص البرنامج/المكتبة المعين الخاص
    • .s شارك [.
      • .d القذرة == ملف mmapped الذاكرة المكتوبة المشتركة
      • .c clean == نص مكتبة معيّن مشترك معيّن

الأداة المساعدة المضمنة في Android تسمى showmap مفيدة جدًا

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
12
holmes

ثلاث طرق أخرى لمحاولة:

  1. ps aux --sort pmem
    يقوم بفرز الإخراج بواسطة %MEM.
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    يفرز باستخدام الأنابيب.
  3. top -a
    يبدأ التصنيف الأعلى حسب %MEM

(مستخرج من هنا )

9
Thomas Shaiker

أنا أستخدم htop؛ إنه برنامج وحدة تحكم جيد جدًا يشبه برنامج إدارة مهام Windows.

9
Tomasz Dzięcielewski

Valgrind مدهش إذا كان لديك الوقت لتشغيله. valgrind --tool=massif هو الحل الصحيح.

ومع ذلك ، فقد بدأت في تقديم أمثلة أكبر ، ولم يعد استخدام valgrind عمليًا. هل هناك طريقة لمعرفة الحد الأقصى لاستخدام الذاكرة (حجم الصفحة المعيارية والصفحات المشتركة) للبرنامج؟

على نظام يونيكس حقيقي ، يعمل /usr/bin/time -v. على نظام Linux ، يعمل هذا لا يعمل.

9
Seth
#!/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
8
pokute

اختبار جيد لاستخدام أكثر "العالم الحقيقي" هو فتح التطبيق ، ثم تشغيل vmstat -s والتحقق من إحصائيات "الذاكرة النشطة". أغلق التطبيق ، انتظر بضع ثوان وقم بتشغيل vmstat -s مرة أخرى. ومع ذلك تم تحرير الكثير من الذاكرة النشطة بشكل واضح في الاستخدام من قبل التطبيق.

6
Nick W.

سوف يمنحك سطر الأوامر أدناه إجمالي الذاكرة المستخدمة من قبل العملية المختلفة التي تعمل على جهاز Linux بالميجابايت

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 "" }' | awk '{total=total + $1} END {print total}'
5
Vineeth

إذا كانت العملية لا تستخدم الكثير من الذاكرة (إما لأنك تتوقع أن يكون هذا هو الحال ، أو أن بعض الأوامر الأخرى قد أعطت هذا المؤشر الأولي) ، ويمكن أن تصمد أمام العملية للتوقف لفترة قصيرة من الوقت ، يمكنك محاولة استخدم الأمر gcore.

gcore <pid>

تحقق من حجم الملف الأساسي الذي تم إنشاؤه للحصول على فكرة جيدة عن مقدار الذاكرة التي تستخدمها عملية معينة.

لن يعمل هذا بشكل جيد إذا كانت العملية تستخدم مئات megs ، أو gigs ، لأن الجيل الأساسي قد يستغرق عدة ثوانٍ أو دقائق ليتم إنشاؤه اعتمادًا على أداء I/O. أثناء الإنشاء الأساسي ، يتم إيقاف العملية (أو "التجميد") لمنع حدوث تغييرات في الذاكرة. لذا كن حذرا.

تأكد أيضًا من أن نقطة التحميل حيث يتم إنشاء النواة بها الكثير من مساحة القرص وأن النظام لن يتفاعل سلبًا مع الملف الأساسي الذي يتم إنشاؤه في هذا الدليل المحدد.

5
Rocco Corsi

أنا أستخدم Arch Linux وهناك هذه الحزمة الرائعة المسماة ps_mem

ps_mem -p <pid>

مثال الإخراج

$ 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
=============================================
4
GypsyCosmonaut

الحصول على valgrind. قم بإعطائه البرنامج ليتم تشغيله ، وسيقول لك الكثير عن استخدام الذاكرة.

ينطبق هذا فقط على حالة البرنامج الذي يتم تشغيله لبعض الوقت ويتوقف. لا أعرف ما إذا كان بإمكان valgrind وضع يده على عملية قيد التشغيل بالفعل أم لا يجب إيقاف العمليات مثل الشياطين.

4
DarenW

تحرير: هذا يعمل بنسبة 100 ٪ بشكل جيد فقط عندما يزيد استهلاك الذاكرة

إذا كنت ترغب في مراقبة استخدام الذاكرة عن طريق عملية معينة (أو مجموعة من المشاركة في مشاركة الاسم الشائع ، على سبيل المثال ، google-chrome ، فيمكنك استخدام نص bash:

while true; do ps aux | awk ‚{print $5, $11}’ | grep chrome | sort -n > /tmp/a.txt; sleep 1; diff /tmp/{b,a}.txt; mv /tmp/{a,b}.txt; done;

هذا سيبحث باستمرار عن التغييرات وطباعتها.

enter image description here

3
test30

إذا كنت تريد شيئًا أسرع من التوصيف مع Valgrind وكانت نواةك قديمة ولا يمكنك استخدام smaps ، فإن ملاحظة: مع وجود خيارات لإظهار المجموعة المقيمة في العملية (مع ps -o rss,command) يمكن أن يمنحك _aproximation_ سريعًا وسريعًا من الحقيقي مقدار الذاكرة غير المبادلة المستخدمة.

3
juanjux

أود أن أقترح أن تستخدم على قمة. يمكنك أن تجد كل شيء عن ذلك في هذه الصفحة . إنه قادر على توفير جميع KPI اللازمة لعملياتك ، ويمكنه أيضًا التقاط ملف.

2
Jain Rach

تحقق شل النصي للتحقق استخدام الذاكرة عن طريق التطبيق في لينكس . متوفر أيضًا على github وفي إصدار بدون لصق و bc .

2
Bobbin Zachariah

هناك تصويت آخر لـ valgrind هنا ، لكن أود أن أضيف أنه يمكنك استخدام أداة مثل Alleyoop لمساعدتك في تفسير النتائج التي تم إنشاؤها بواسطة valgrind.

أستخدم هاتين الأداتين طوال الوقت ولدي دائمًا رمزًا صغيريًا غير متسربًا لإظهاره بكل فخر به ؛)

1
Dan

بينما يبدو أن هذا السؤال يدور حول فحص العمليات الجارية حاليًا ، إلا أنني أردت رؤية الذاكرة القصوى التي يستخدمها التطبيق من البداية إلى النهاية. إلى جانب valgrind ، يمكنك استخدام tstime ، وهو أبسط بكثير. إنه يقيس استخدام الذاكرة "عالية المستوى" (RSS والظاهرية). من هذه الإجابة .

1
jtpereyda

استخدم " مراقب النظام" المدمج "أداة واجهة المستخدم الرسومية المتاحة في أوبونتو

0
Sudheesh.M.S

/ prox/xxx/numa_maps يعطي بعض المعلومات هناك: N0 = ؟؟؟ N1 = ؟؟؟. لكن هذه النتيجة قد تكون أقل من النتيجة الفعلية ، حيث إنها تحسب فقط تلك التي تم التطرق إليها.

0
ptan

بناءً على إجابة لسؤال مرتبط .

يمكنك استخدام SNMP للحصول على الذاكرة واستخدام وحدة المعالجة المركزية لعملية في جهاز معين في الشبكة :)

المتطلبات:

  • يجب أن يكون الجهاز الذي يقوم بتشغيل العملية قد تم تثبيت snmp وتشغيله
  • يجب تكوين snmp لقبول الطلبات من حيث سيتم تشغيل البرنامج النصي أدناه (قد يتم تكوينه في snmpd.conf)
  • يجب أن تعرف معرف العملية (معرف المنتج) للعملية التي تريد مراقبتها

ملاحظات:

  • Host-RESOURCES-MIB :: hrSWRunPerfCPUهو عدد الثواني المئوية من إجمالي موارد وحدة المعالجة المركزية للنظام التي تستهلكها هذه العملية. لاحظ أنه في نظام متعدد المعالجات ، قد تزيد هذه القيمة بأكثر من سنت في الثانية في الثانية الواحدة من الوقت الفعلي (ساعة الحائط).

  • Host-RESOURCES-MIB :: hrSWRunPerfMemهو إجمالي مقدار ذاكرة النظام الحقيقية المخصصة لهذه العملية.

**

البرنامج النصي لمراقبة العملية:

**

echo "IP: "
read ip
echo "specfiy pid: "
read pid
echo "interval in seconds:"
read interval

while [ 1 ]
do
    date
    snmpget -v2c -c public $ip Host-RESOURCES-MIB::hrSWRunPerfCPU.$pid
    snmpget -v2c -c public $ip Host-RESOURCES-MIB::hrSWRunPerfMem.$pid
    sleep $interval;
done
0
Roselyn Verbo Domingo