लिनक्स में प्रति उपयोगकर्ता मेमोरी का उपयोग?


20

मान लीजिए कि मेरे लिनक्स बॉक्स पर मेरे पास 20 उपयोगकर्ता हैं। मुझे कैसे पता चलेगा कि उनमें से प्रत्येक कितनी मेमोरी का उपयोग कर रहा है?

जवाबों:


19

आप smem का उपयोग करने का प्रयास कर सकते हैं (देखें ELC2009: अधिक जानकारी के लिए smem के साथ मेमोरी उपयोग की कल्पना करना )। विशेष रूप से, sudo smem -uआपको अपनी इच्छित जानकारी देनी चाहिए।


1
मैं मानता हूं कि शायद यह सबसे अच्छा तरीका है। हालाँकि, smem को वास्तव में एक आधुनिक कर्नेल की आवश्यकता होती है , जो कि स्थापित उद्यम डिस्ट्रोस में से कोई भी वितरित नहीं करता है। इसलिए जब तक आप फेडोरा, ओपनएसयूएस या एक गैर-एलटीएस उबंटू जैसे सामुदायिक डिस्ट्रो नहीं चला रहे हैं, आप भाग्य से बाहर हैं।
जूना

यह भी खूब रही। बहुत बहुत धन्यवाद। मुझे स्मैम के बारे में पता नहीं था। ऐसा लग रहा है कि यह काम करेगा।
जैकब ट्रोज़ज़ोक

4
FYI करें, smem के लिए कर्नेल की आवश्यकता है> = 2.6.27
xebeche

smem को यहां gtk जैसे सामान का एक गुच्छा भी आवश्यक है, विकल्प नहीं।
अनारकट

@ नानक: सच नहीं (कम से कम डेबियन जेसी के लिए)। एकमात्र निर्भरता अजगर है, अजगर-मेटप्लोटलिब केवल एक अनुशंसित पैकेज है जिसे आप छोड़ सकते हैं --no-install-recommends
लेओ लैम

9

साझा स्मृति समस्याओं को अनदेखा करना, यहां एक त्वरित स्क्रिप्ट है जो आपको आरएसएस और वीएमईएम के लिए लॉग इन सभी उपयोगकर्ताओं के लिए प्रदान करती है, जिसे वीएमएम द्वारा क्रमबद्ध किया जाता है, और प्यारा कॉलम में व्यवस्थित किया जाता है:

(echo "user rss(KiB) vmem(KiB)";
 for user in $(users | tr ' ' '\n' | sort -u); do
   echo $user $(ps -U $user --no-headers -o rss,vsz \
     | awk '{rss+=$1; vmem+=$2} END{print rss" "vmem}')
 done | sort -k3
) | column -t

खैर, दुखद 'साझा स्मृति मुद्दों की अनदेखी' यह स्क्रिप्ट भी पूरी तरह से फर्जी है।
fgysin

जाली? फर्जी क्या? आउटपुट फर्जी कैसे है?
19

o / p rss और vmem में है, rss और vmem क्या है?
विदुर ने

5

RSS की राशि प्राप्त करने के लिए मुझे लगता है कि निम्नलिखित काम करता है। यह उपयोगकर्ताओं को kbrandt और रूट के लिए RSS की राशि प्राप्त करने के लिए होगा।

ps -U kbrandt,root --no-headers  -o rss | (tr '\n' +; echo 0) | bc

मुझे यह जोड़ना चाहिए कि मैंने संख्या के भाग के कॉलम को जोड़ दिया है: pixelbeat.org/cmdline.html
Kyle Brandt

3

यह एक पेचीदा सवाल है। आप आसानी से "ps" आउटपुट में कुल RSS + स्वैप मात्रा का योग कर सकते हैं, लेकिन साझा की गई मेमोरी के बारे में क्या? यदि वे समान प्रक्रिया चला रहे हैं तो विभिन्न उपयोगकर्ता समान कोड पृष्ठ आसानी से साझा कर सकते हैं। आप किसे खाते हैं? बफ़र्स और कैश के बारे में क्या? यह वास्तव में इस बात पर निर्भर करता है कि आप अपने परिणाम कितने सही चाहते हैं। जितना अधिक आप चाहते हैं, उतना ही सटीक होगा।


मुझे लगता है कि आपका सही PS उत्तर है, लेकिन आपको संभवतः साझा मेमोरी को अनदेखा करने की आवश्यकता है।
जेसन टैन

smem (मेरे उत्तर में उल्लिखित) अपने PSS और USS मापों के साथ साझा की गई मेमोरी समस्या को हल करता है (PSS आनुपातिक रूप से साझा मेमोरी को उन प्रक्रियाओं के बीच वितरित करता है जो इसे साझा करते हैं)।
सीजरबी

2

मुझे यकीन नहीं है कि उपयोगकर्ता द्वारा मेमोरी उपयोग की रिपोर्ट कैसे की जाए लेकिन यदि आप उनके उपयोग को नियंत्रित करने के बारे में चिंतित हैं तो आपको अलिमित दिखना चाहिए। यह आपको अपने सिस्टम पर मेमोरी और अन्य संसाधनों के लिए प्रति उपयोगकर्ता / समूह के आधार पर कठिन और नरम सीमाएं निर्धारित करने की अनुमति देगा।


2

आप कुछ इस तरह की कोशिश कर सकते हैं:

ps auxU मैक्सवेल | awk '{मेमोरी + = $ 4}; END {प्रिंट मेमोरी} '


धन्यवाद! वर्तमान उपयोगकर्ता के लिए यह भी किया जा सकता है awk '{mem + = $ 2}; END {प्रिंट मेम} '
xebeche

मैंने इसे थोड़ा संपादित किया ps aux | grep mysql | awk '{memory +=$4}; END {print memory }', जहां mysql को उपयोगकर्ता या प्रक्रिया के नाम से बदला जा सकता है।
जेशुरुन

2

उसी की तलाश में, मुझे यह पता चला

ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2

मेम द्वारा आदेशित प्रक्रियाओं को प्रिंट करने के लिए, उपयोगकर्ता द्वारा समूहीकृत किया गया (कॉलम 1, $ 1), आप अन्य चीजों द्वारा समूह कर सकते हैं, और अन्य चीजों को जोड़ सकते हैं, $ 1 और $ 4 बदल सकते हैं।

  • $ 1 पहला कॉलम है: उपयोगकर्ता नाम (इसके द्वारा समूह)
  • $ 4 चौथा स्तंभ है:% मेम (यह रकम)

मैं समाधान पाकर खुश था, बस साझा करना चाहता था।


1
धन्यवाद! मैंने कुछ संशोधन किए और इसका उपयोग कर रहा हूं ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2:। सॉर्ट कमांड -nको एक नंबर के रूप में मेमोरी को पार्स करने के लिए ध्वज की आवश्यकता होती है । इसके अलावा, आप "उपयोगकर्ता" शब्द को "कमांड" से बदल सकते हैं इसके बजाय एप्लिकेशन नाम से समूह में।
टिम

वास्तव में यह मेरी टिप्पणी में $ 2 के बजाय $ NF होना चाहिए, जो कि awk से अंतिम कॉलम प्राप्त करने के लिए है (जैसा कि $ 2 उन कमांड के साथ काम नहीं करता है जिनके पास रिक्त स्थान है)। लगता है कि मैं टिप्पणी को और अधिक संपादित नहीं कर सकता।
टिम

2

यह बैश स्क्रिप्ट शायद नरक के रूप में बदसूरत है, लेकिन अभ्यास के लिए धन्यवाद, मेरा बैश था (है) जंग लग रहा है!

#!/bin/sh
OLDIFS=$IFS
IFS=$'\n'
tempsum=0
totalmem=0
for m in `ps -eo user,rss --sort user | sed -e 's/  */ /g' | awk -F'[ ]' {'print $0'}`; do
  nu=`echo $m|cut -d" " -f1`
  nm=`echo $m|cut -d" " -f2`
  # echo "$nu $nm $nu"
  if [ "$nu" != "$ou" ] && [ $(echo "$nm"|grep -E "^[0-9]+$") ] 
  then 
    if [ "$tempsum" -ne 0 ]; then echo "Printing total mem for $ou: $tempsum"; fi
    ou=$nu
    tempsum=$nm
    let "totalmem += $nm"
  else 
    let "tempsum += $nm" 
    let "totalmem += $nm"
  fi
done
echo "Total Memory in Use: $totalmem/$(free | grep Mem: | awk '{print $2}')"
IFS=$OLDIFS

परिणाम:

[20:34][root@server2:~]$ ./memorybyuser.sh 
Printing total mem for admin: 1387288
Printing total mem for apache: 227792
Printing total mem for avahi: 1788
Printing total mem for dbus: 980
Printing total mem for 68: 3892
Printing total mem for root: 55880
Printing total mem for rpc: 292
Printing total mem for rpcuser: 740
Printing total mem for smmsp: 720
Printing total mem for xfs: 680
Total Memory in Use: 1682360/4152144

कृपया टिप्पणी / सही करें और मैं उत्तर को अपडेट करूंगा। इसके अलावा, मैं पीएस से आरएसएस मेमोरी आउटपुट का उपयोग करता हूं, क्योंकि अन्य लोगों ने चर्चा की है कि इस मूल्य का उपयोग करने के लिए पेशेवरों / विपक्ष हैं।


यह एक छोटी सी समस्या है - यह ps आउटपुट में अंतिम उपयोगकर्ता के लिए "$ ou के लिए मुद्रण कुल मेम: $ टेम्प्सम" प्रिंट नहीं करेगा। लूप केवल एक उपयोगकर्ता द्वारा उपयोग की जाने वाली राशि में अंतिम कार्यक्रम जोड़ देगा और फिर इसे छोड़ देगा।
जैकब ट्रोज़ज़ोक

वाह। आपकी स्क्रिप्ट मददगार से ज्यादा थी !!!! आप कल्पना नहीं कर सकते! क्या मैं कुछ माँग सकता हूँ, हालाँकि अगर यह बहुत ज्यादा नहीं है? क्या आप इसे कुल सीपीयू उपयोग भी दिखा सकते हैं? और संभवत: यह मेमोरी उपयोग दिखाने के लिए बनाया जा सकता है अगर इसकी 100mb से अधिक हो?

1

स्मेम मेरे सिस्टम पर उपलब्ध नहीं था, और डेव की स्क्रिप्ट किसी कारण से काम नहीं करती थी, इसलिए मैंने इस आउटपुट को संसाधित करने के लिए यह बदसूरत पर्ल ऑनलाइनर लिखा:

ps -eo user,rss | perl -e 'foreach (<>) { m/(\w+)\s+(\d+)/; $mem{$1} += $2; }; foreach $u (keys %mem) { if ($mem{$u}) { print "$u - $mem{$u}\n" }}' | sort

ध्यान दें कि कुछ उपयोगकर्ताओं को उनके उपयोगकर्ता नाम के बजाय उनके यूआईडी का उपयोग करके पहचाना गया था। आप इसका उपयोग बदसूरत का उपयोग करके / etc / passwd से उपयोगकर्ता नाम पार्स करके कर सकते हैं:

ps -eo user,rss | perl -e 'open(F, "/etc/passwd"); foreach $l (<F>) { if ($l=~/(.*?):.*?:(\d+)/) { $users{$2}=$1; }}; foreach (<>) { m/(\w+)\s+(\d+)/; $mem{$1} += $2; }; foreach $u (keys (%mem)) { $UN = $u; if ($UN=~/^\d+$/) { $UN = $users{$UN};}; if ($mem{$u}) { print "$UN - $mem{$u}\n" }}' | sort

0

बैश स्क्रिप्ट का उपयोग करना

#!/bin/bash

total_mem=0     

printf "%-10s%-10s\n" User MemUsage'(%)'    

while read u m

do
        [[ $old_user != $u ]] && {  printf "%-10s%-0.1f\n" $old_user $total_mem;

                                    total_mem=0; }

        total_mem="$(echo $m + $total_mem | bc)"    
        old_user=$u

done < <(ps --no-headers -eo user,%mem| sort -k1)    

#EOF

आउटपुट

User      MemUsage(%)
apache    4.8
dbus      0.0
mysql     3.8
nagios    3.1

0
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

आप /etc/passwdसभी उपयोगकर्ताओं के लिए ऐसा करने के लिए यूआईडी प्राप्त कर सकते हैं


0

ठीक है, लिनक्स कर्नेल की इस स्थिति में मैं केवल एक उचित तरीके के बारे में सोच सकता हूं इस कार्य को पूरा लिए - मेमोरी कॉग्रुप्स का उपयोग करना। आपको एक उपयोगकर्ता को स्वयं cgroup में लॉगिन करना होगा, और इसके लिए स्वयं के pam मॉड्यूल विकास की आवश्यकता हो सकती है या उसके लिए मौजूदा मॉड्यूल को संशोधित कर सकता है।

इस पर पढ़ने के लिए उपयोगी दस्तावेज़ है: RedHat® द्वारा संसाधन प्रबंधन गाइड

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.