मान लीजिए कि मेरे लिनक्स बॉक्स पर मेरे पास 20 उपयोगकर्ता हैं। मुझे कैसे पता चलेगा कि उनमें से प्रत्येक कितनी मेमोरी का उपयोग कर रहा है?
मान लीजिए कि मेरे लिनक्स बॉक्स पर मेरे पास 20 उपयोगकर्ता हैं। मुझे कैसे पता चलेगा कि उनमें से प्रत्येक कितनी मेमोरी का उपयोग कर रहा है?
जवाबों:
आप smem का उपयोग करने का प्रयास कर सकते हैं (देखें ELC2009: अधिक जानकारी के लिए smem के साथ मेमोरी उपयोग की कल्पना करना )। विशेष रूप से, sudo smem -u
आपको अपनी इच्छित जानकारी देनी चाहिए।
--no-install-recommends
।
साझा स्मृति समस्याओं को अनदेखा करना, यहां एक त्वरित स्क्रिप्ट है जो आपको आरएसएस और वीएमईएम के लिए लॉग इन सभी उपयोगकर्ताओं के लिए प्रदान करती है, जिसे वीएमएम द्वारा क्रमबद्ध किया जाता है, और प्यारा कॉलम में व्यवस्थित किया जाता है:
(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
RSS की राशि प्राप्त करने के लिए मुझे लगता है कि निम्नलिखित काम करता है। यह उपयोगकर्ताओं को kbrandt और रूट के लिए RSS की राशि प्राप्त करने के लिए होगा।
ps -U kbrandt,root --no-headers -o rss | (tr '\n' +; echo 0) | bc
यह एक पेचीदा सवाल है। आप आसानी से "ps" आउटपुट में कुल RSS + स्वैप मात्रा का योग कर सकते हैं, लेकिन साझा की गई मेमोरी के बारे में क्या? यदि वे समान प्रक्रिया चला रहे हैं तो विभिन्न उपयोगकर्ता समान कोड पृष्ठ आसानी से साझा कर सकते हैं। आप किसे खाते हैं? बफ़र्स और कैश के बारे में क्या? यह वास्तव में इस बात पर निर्भर करता है कि आप अपने परिणाम कितने सही चाहते हैं। जितना अधिक आप चाहते हैं, उतना ही सटीक होगा।
मुझे यकीन नहीं है कि उपयोगकर्ता द्वारा मेमोरी उपयोग की रिपोर्ट कैसे की जाए लेकिन यदि आप उनके उपयोग को नियंत्रित करने के बारे में चिंतित हैं तो आपको अलिमित दिखना चाहिए। यह आपको अपने सिस्टम पर मेमोरी और अन्य संसाधनों के लिए प्रति उपयोगकर्ता / समूह के आधार पर कठिन और नरम सीमाएं निर्धारित करने की अनुमति देगा।
आप कुछ इस तरह की कोशिश कर सकते हैं:
ps auxU मैक्सवेल | awk '{मेमोरी + = $ 4}; END {प्रिंट मेमोरी} '
ps aux | grep mysql | awk '{memory +=$4}; END {print memory }'
, जहां mysql को उपयोगकर्ता या प्रक्रिया के नाम से बदला जा सकता है।
उसी की तलाश में, मुझे यह पता चला
ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2
मेम द्वारा आदेशित प्रक्रियाओं को प्रिंट करने के लिए, उपयोगकर्ता द्वारा समूहीकृत किया गया (कॉलम 1, $ 1), आप अन्य चीजों द्वारा समूह कर सकते हैं, और अन्य चीजों को जोड़ सकते हैं, $ 1 और $ 4 बदल सकते हैं।
मैं समाधान पाकर खुश था, बस साझा करना चाहता था।
ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2
:। सॉर्ट कमांड -n
को एक नंबर के रूप में मेमोरी को पार्स करने के लिए ध्वज की आवश्यकता होती है । इसके अलावा, आप "उपयोगकर्ता" शब्द को "कमांड" से बदल सकते हैं इसके बजाय एप्लिकेशन नाम से समूह में।
यह बैश स्क्रिप्ट शायद नरक के रूप में बदसूरत है, लेकिन अभ्यास के लिए धन्यवाद, मेरा बैश था (है) जंग लग रहा है!
#!/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 -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
बैश स्क्रिप्ट का उपयोग करना
#!/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
ठीक है, लिनक्स कर्नेल की इस स्थिति में मैं केवल एक उचित तरीके के बारे में सोच सकता हूं इस कार्य को पूरा लिए - मेमोरी कॉग्रुप्स का उपयोग करना। आपको एक उपयोगकर्ता को स्वयं cgroup में लॉगिन करना होगा, और इसके लिए स्वयं के pam मॉड्यूल विकास की आवश्यकता हो सकती है या उसके लिए मौजूदा मॉड्यूल को संशोधित कर सकता है।
इस पर पढ़ने के लिए उपयोगी दस्तावेज़ है: RedHat® द्वारा संसाधन प्रबंधन गाइड ।