ধরা যাক আমার লিনাক্স বাক্সে আমার 20 জন ব্যবহারকারী লগইন করেছেন। আমি কীভাবে জানতে পারি যে তাদের প্রত্যেকে কতটা স্মৃতি ব্যবহার করছে?
ধরা যাক আমার লিনাক্স বাক্সে আমার 20 জন ব্যবহারকারী লগইন করেছেন। আমি কীভাবে জানতে পারি যে তাদের প্রত্যেকে কতটা স্মৃতি ব্যবহার করছে?
উত্তর:
আপনি গন্ধ ব্যবহার করার চেষ্টা করতে পারেন ( ELC2009 দেখুন: আরও তথ্যের জন্য দুর্গন্ধযুক্ত স্মৃতি ব্যবহার ভিজ্যুয়ালাইজিং )। বিশেষত, 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
আরএসএসের যোগফল পেতে আমি নিম্নলিখিত কাজগুলি মনে করি। এটি ব্যবহারকারীদের kbrandt এবং মূলের জন্য আরএসএসের যোগফল পাবে।
ps -U kbrandt,root --no-headers -o rss | (tr '\n' +; echo 0) | bc
এটি একটি জটিল প্রশ্ন। আপনি "পিএস" আউটপুটে মোট আরএসএস + অদলবদলের পরিমাণ সহজেই যোগ করতে পারেন, তবে ভাগ করা মেমরির কী? বিভিন্ন ব্যবহারকারী যদি একই প্রক্রিয়াটি চালাচ্ছেন তবে সহজেই একই কোড পৃষ্ঠাটি ভাগ করতে পারে। আপনি কে এই অ্যাকাউন্ট করবেন? বাফার এবং ক্যাশে সম্পর্কে কি? এটি আপনার ফলাফলগুলি কতটা সঠিক হতে চান তা নির্ভর করে। আপনি যত বেশি নির্ভুল চান, তত কঠিন হবে।
আমি কীভাবে ব্যবহারকারীর দ্বারা মেমরির ব্যবহারের প্রতিবেদন করবেন তা নিশ্চিত নই তবে আপনি যদি তাদের ব্যবহারগুলি নিয়ন্ত্রণের বিষয়ে উদ্বিগ্ন হন তবে আপনাকে উলামিট সন্ধান করা উচিত। এটি আপনাকে আপনার সিস্টেমে মেমরি এবং অন্যান্য সংস্থানগুলির জন্য ব্যবহারকারী / গোষ্ঠী ভিত্তিতে কঠোর এবং নরম সীমা নির্ধারণ করার অনুমতি দেবে।
আপনি কিছু চেষ্টা করতে পারেন:
PS auxU ম্যাক্সওয়েল | awk '{মেমরি + = $ 4}; শেষ {মুদ্রণ মেমরি} '
ps aux | grep mysql | awk '{memory +=$4}; END {print memory }'
, যেখানে মাইএসকিএল ব্যবহারকারীর নাম বা প্রক্রিয়াটির নামের সাথে প্রতিস্থাপন করা যেতে পারে।
একই জন্য সন্ধান, আমি এটি বুঝতে পেরেছি
ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2
ব্যবহারকারীর দ্বারা গোষ্ঠীভুক্ত মেম দ্বারা আদেশযুক্ত প্রসেসগুলি মুদ্রণ করতে (কলাম 1, $ 1), আপনি things 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
মনে রাখবেন যে কিছু ব্যবহারকারী তাদের ব্যবহারকারী নাম ব্যবহারের পরিবর্তে তাদের ইউআইডি ব্যবহার করে সনাক্ত করা হয়েছিল। Uglier ব্যবহার করে / 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
ঠিক আছে, লিনাক্স কার্নেলের এই অবস্থায় আমি এই কাজটি সম্পাদন করার একমাত্র সঠিক উপায় সম্পর্কে চিন্তা করতে পারি - মেমরি সিগ্রুপগুলি ব্যবহার করে। আপনাকে নিজের সিগ্রুপে ব্যবহারকারীকে অন-লগইন করতে হবে এবং এর জন্য নিজের পাম মডিউল বিকাশ বা (পরিবর্তে) বিদ্যমান মডিউলটি সংশোধন করার প্রয়োজন হতে পারে।
এটি পড়তে দরকারী ডকটি হ'ল: রেডহ্যাটের রিসোর্স ম্যানেজমেন্ট গাইড ®