سؤال Linux: اكتشف ما هي العملية التي تستخدم كل ذاكرة الوصول العشوائي؟


قبل أن تسأل في الواقع ، لمجرد أن تكون واضحة: نعم ، أنا أعرف عن ذاكرة التخزين المؤقت القرص ، ولا ، ليس قضيتي :) آسف ، لهذه الديباجة :)

أنا باستخدام CentOS 5. كل تطبيق في النظام هو مبادلة بشكل كبير ، والنظام بطيء جدا. عندما أفعل free -m، هنا ما حصلت عليه:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

لذا ، لدي 42 ميغابايت فقط لاستخدامها! بقدر ما أفهم، -/+ buffers/cache في الواقع لا يحسب ذاكرة التخزين المؤقت على القرص ، لذلك ليس لدي سوى 42 ميغابايت ، أليس كذلك؟ اعتقدت ، قد أكون مخطئا ، لذلك حاولت إيقاف تشغيل التخزين المؤقت القرص وليس له أي تأثير - بقيت الصورة نفسها.

لذلك ، قررت معرفة من يستخدم كل ذاكرة الوصول العشوائي الخاصة بي ، وكنت قد استخدمت top من أجل هذا. ولكن ، على ما يبدو ، فإنه يشير إلى أن أي عملية تستخدم ذاكرة الوصول العشوائي الخاصة بي. العملية الوحيدة في قمة بلدي هي MySQL ، ولكنها تستخدم 0.1 ٪ من ذاكرة الوصول العشوائي و 400MB من المبادلة. نفس الصورة عندما أحاول تشغيل خدمات أو تطبيقات أخرى - كل ذلك في مبادلة ، top يظهر أن MEM لا يستخدم (0.1٪ كحد أقصى لأي عملية).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

إعادة تشغيل لا يساعد ، وبهذه الطريقة للغاية بطيئة ، والتي لا أتوقع عادة على هذا الجهاز (4 النوى ، 4GB RAM ، RAID1).

لذلك ، أنا متأكد من أن هذه ليست ذاكرة تخزين مؤقت للقرص ، الذي يستخدم ذاكرة الوصول العشوائي ، لأنه عادة ما كان ينبغي تخفيضها والسماح لعمليات أخرى باستخدام ذاكرة الوصول العشوائي ، بدلا من ذلك انتقل إلى المبادلة.

لذا ، أخيراً ، السؤال هو - إذا كان لدى أحدهم أي أفكار عن كيفية معرفة ما هي العملية التي تستخدم الذاكرة فعلياً؟


105
2018-03-09 14:13


الأصل


هل وجدت الجواب على هذا؟ - Hackeron
Hackeron: قبلت OP هذا الجواب. أعلم أن الإجابة لا تعالج سؤالك، على أية حال. لقد تمكنت من إعادة إنتاج مشكلتك على أحد خوادمي ، وأجري حاليًا أبحاثًا إذا كانت هناك طريقة لتحري الخلل وإصلاحه. - Deltik
Deltik اه ، حسنًا. شكرا :) - لدي 2 خوادم هنا أن تسرب جميع الذاكرة المتوفرة في الفضاء حوالي 12 ساعة ، اسمحوا لي أن أعرف إذا كان هناك أي شيء يمكنني القيام به للمساعدة في تشخيص هذا. أنا قابلة للوصول كما لقب "hackeron" على IRC (irc.freenode.org). - Hackeron
Hackeron: لم أتمكن من العثور عليك باسم "hackeron" irc.freenode.org. أنا خلقت غرفة دردشة لمناقشة موسعة هنا. - Deltik


الأجوبة:


على لينكس في top عملية يمكنك الضغط < مفتاح لتحويل عرض عرض الإخراج اليسار. بشكل افتراضي يتم فرزها من قبل %CPU إذا قمت بالضغط على المفتاح 4 مرات ، فقم بفرزها VIRT وهو حجم ذاكرة افتراضية يعطيك إجابتك.

طريقة أخرى للقيام بذلك هي:

ps -e -o pid,vsz,comm= | sort -n -k 2

يجب أن يوفر لك والإخراج مرتبة حسب العمليات الحجم الافتراضي.

إليك النسخة الطويلة:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

93
2018-03-09 14:25



هذا يعطيني Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html على خادم أوبونتو 11.10. - Der Hochstapler
OliverSalzburg المشكلة هي -o خيارات. هذا RHEL4 يعمل. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2 يعمل. سأحاول 11.10 في وقت لاحق هذه الليلة ولكن إذا وجدت خيارات الفرز الصحيح قبل يرجى إعلامي. ps -e -o pid,vsz,comm | sort -n -k 2 قد تعمل ولكن ليس لدي مكان للتحقق في الوقت الحالي. - Karlson
أنا لست على دراية حقا مع -ef اختيار. ولكن يبدو أن هذا ينتج مخرجات معقولة: sudo ps axo pid,vsz,comm=|sort -n -k 2 - Der Hochstapler
ردًا علىOliverSalzburg معدلة (أعتقد أنني غيرت ذلك بالفعل). يجب أن يكون ps -e أو ps -a - Karlson
تاي ، أنا أحب اقتراح أعلى من < لم أكن أعلم أن هذا ممكن ، فيدورا - SSH This


إظهار ذاكرة العمليات بالميغابايت ومسار العملية.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

48
2018-02-09 21:12



مرحبًا بك في Super User. هل يمكنك توسيع إجابتك لتوضيح ما يفعله هذا الكود وكيف يعالج المشكلة؟ رمز غير المبررة هو محبطلأنها لا تعلم الحل. شكر. - fixer1234
أنا مندهش من أن هذه الإجابة ضعيفة ولديها تعليق يطلب توضيحها .. وهي قصيرة بما فيه الكفاية بحيث يجب أن تكون واضحة لما تفعله (تتابع الأنبوبة في awk ثم تفرزها) ، وفي سياق السؤال ، تظهر العمليات التي تستخدم معظم ذاكرة الوصول العشوائي. أعتقد أنها إجابة جيدة. - John


مجرد ملاحظة جانبية على الخادم تظهر نفس الأعراض ولكن لا تزال تظهر استنفاد الذاكرة. ما انتهى إليه الأمر هو sysctl.conf من مربع يحتوي على 32 غيغابايت من ذاكرة الوصول العشوائي والإعداد لـ DB مع الصفحات الضخمة التي تم تكوينها إلى 12000. لا يحتوي هذا المربع إلا على 2 غيغابايت من ذاكرة الوصول العشوائي لذا تم تعيين كل ذاكرة الوصول العشوائي المجانية إلى الصفحات الضخمة (فقط 960 منهم). وضع صفحات ضخمة إلى 10 ، حيث لم يتم استخدام أي منها على أي حال ، حرر كل الذاكرة.

يمكن أن يكون التحقق السريع من / proc / meminfo للبحث عن إعدادات HugePages_ بداية جيدة لتحرّي الخلل الذي لا يقل عن ذاكرة واحدة غير متوقعة.


13
2017-10-15 15:05



كان لي مؤخرا خادم آخر حيث كانت هذه المشكلة. إذا كان لدى مؤسستك موظفون سابقون في Oracle ، فقد يكون هذا الإعداد هو السبب الخاص بك. - fields


يمكنك أيضًا استخدام الأمر ps للحصول على مزيد من المعلومات حول العملية.

ps aux | less

2
2017-07-08 06:05



بدافع الفضول ، ما هي الطريقة الصحيحة للهروب من هذا الأمر؟ فإنه يظهر نهاية END كنت تصل إلى السطر الأخير ، فإنه لا يقتل العملية عندما أنا Ctrl + C ذلك. - KingsInnerSoul
تضمين التغريدة ردًا علىKingsInnerSoul - enobayram


أنا المرجعية هذه و إجمالي الذاكرة المستخدمة في عملية بايثون؟ - Stack Overflowهذا هو جوابي. أحصل على أداة خاصة بإعداد عملية (python) ، الآن.

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

إرفاق قائمة العمليات الخاصة بي.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

مرجع


1
2017-10-21 10:51





في حالتي كانت المشكلة أن الخادم كان خادمًا ظاهريًا لـ VMware به vmw_balloonالوحدة النمطية تمكين:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

جري:

$ vmware-toolbox-cmd stat balloon
5189 MB

لذلك تم استرجاع حوالي 5 جيجابايت من الذاكرة من قبل المضيف. على الرغم من وجود 8 غيغابايت إلى جهاز VM "رسميًا" ، إلا أنه من الناحية العملية كان أقل بكثير:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

1
2018-03-31 03:38





جعل النصي يسمى show-memory-usage.sh مع المحتوى:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

-1
2018-03-14 20:50



لماذا ا؟ ماذا يفعل هذا؟ كيف يعمل؟ لا تخبر الأشخاص بتشغيل تعليمات برمجية عشوائية ؛ شرح الغرض منه وكيف يعمل. - α CVn
الشكل سأشرح الكود لأولئك الذين لا يفهمون أنه يبدو أنه آمن للتشغيل ، ولكن يمكن أن يقلل من التراجع عن تلك التي سيكون من المفيد الوصول إليها. انها تدير نفس الأمر كما هو في الإجابات أعلاه، لكنه يضيف التنسيق مع AWK. لم أقم بتشغيل البرنامج النصي شخصيًا لأنني لا أستخدمه لذلك ، ولكن شرحه يساعد أولئك الذين يحتاجون إلى بعض التنسيقات. - Dooley_labs