লিনাক্সে কোন প্রক্রিয়াগুলি অদলবদল স্থান ব্যবহার করছে তা কীভাবে আবিষ্কার করবেন?


240

লিনাক্সের অধীনে, আমি কীভাবে জানতে পারি যে কোন প্রক্রিয়াটি অদলবদূর স্থানটি বেশি ব্যবহার করছে?


30
আপনার গৃহীত উত্তরটি ভুল। এটি লোলোটাক্সের উত্তরে পরিবর্তন করার বিষয়টি বিবেচনা করুন, যা আসলে সঠিক।
জেটেরেস

@ জেটেরাসটি সঠিক, আমার উপরে শীর্ষে সোয়্যাপ কলামের মানগুলির যোগফলের মতো অদলবদল নেই।
akostadinov

1
আইওটপ একটি খুব দরকারী কমান্ড যা প্রসেস / থ্রেড অনুযায়ী আইও এবং অদলবদলের সরাসরি পরিসংখ্যান প্রদর্শন করবে
sunil

@jterrace, জানায় বিবেচনা যার গৃহীত-উত্তর-এর-দিন ভুল। ছয় বছর পরে, আমাদের সবার ধারণা নেই যে আপনি ডেভিড হলমের উত্তর (বর্তমানে গৃহীত হিসাবে গৃহীত একটি) বা অন্য কোনও উত্তর উল্লেখ করছেন কিনা। (ঠিক আছে, আমি দেখতে পেয়েছি যে ডেভিড হলমের উত্তরটিও ভুল, তার উত্তরের মন্তব্য হিসাবে ... সুতরাং আমি অনুমান করি আপনি সম্ভবত তার অর্থ বোঝাতে চেয়েছিলেন।)
ডন হ্যাচ

উত্তর:


106

শীর্ষে রান করুন তারপর টিপুন OpEnter। এখন প্রক্রিয়াগুলি তাদের অদলবদলের দ্বারা বাছাই করা উচিত।

মন্তব্যগুলিতে উল্লিখিত হিসাবে আমার আসল উত্তরটি সমস্যার সঠিক উত্তর সরবরাহ করে না বলে এখানে একটি আপডেট রয়েছে। থেকে htop প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী :

কোনও প্রক্রিয়াটির ব্যবহৃত অদলবদলের সঠিক আকার পাওয়া সম্ভব নয়। শীর্ষগুলি SWAP = VIRT - RES তৈরি করে এই তথ্যটিকে নকল করে, তবে এটি একটি ভাল মেট্রিক নয়, কারণ ভিডিও মেমরির মতো অন্যান্য স্টাফগুলি ভিআইআরটি-তেও গণনা করা হয় (উদাহরণস্বরূপ: শীর্ষস্থানীয় বলে যে আমার এক্স প্রসেসটি 81১ এম অদলবদল ব্যবহার করছে, তবে এটিও আমার সিস্টেমে সামগ্রিকভাবে প্রতিবেদন করেছে যে কেবল 2M অদলবুদ্ধি ব্যবহার করা হচ্ছে Therefore সুতরাং, আমি এইচটিপিতে অনুরূপ স্ব্যাপ কলাম যুক্ত করব না কারণ এই তথ্য পাওয়ার কোনও নির্ভরযোগ্য উপায় আমি জানি না (বাস্তবে, আমি মনে করি না এটি পাওয়া সম্ভব) ভাগ করা পৃষ্ঠাগুলির কারণে একটি সঠিক সংখ্যা)।


137
ডকগুলি থেকে, শীর্ষে থাকা সুইট কলামটি কেবলমাত্র প্রক্রিয়াটির প্রকৃতপক্ষে অদলবদল করার পরিবর্তে পুরো প্রক্রিয়াটি অদলবদল করা থাকলে কতটা অদলবদলের প্রয়োজন হবে তা কেবল দেখায়। একটি সংক্ষিপ্ত অনুসন্ধানের পরে আমি যা বলতে পারি তা থেকে, প্রতিটি প্রক্রিয়াটির এই মুহুর্তে কতটা অদলবদল হয়েছে তা নির্ধারণের কোনও উপায় নেই। এইচটিপির লেখক এ কারণে এই জাতীয় কলাম স্থাপন করতে অস্বীকার করেছেন (আমি সিএনএসডাব্যাপ এবং এনএসডাব্ল্যাপ কলামগুলি দেখতে পাচ্ছি, তবে তারা আমার মেশিনে কিছুই করতে পারে বলে মনে হয় না): htop.sourceforge.net/index.php?page=faq
ইউকনডুড

6
@ ইউকনডুডে ঠিক আছে, শীর্ষে থাকা সোয়াপ্যাপ কলামটি কেবল ভিআইআরটি - আরইএস এবং এই প্রসঙ্গে এই তথ্য এক ধরণের অকেজো। যেমন ম্যাপ করা ভিডিও র‌্যামের ভাগ করা মেমরির কোনও ক্ষতিপূরণ নেই। এছাড়াও সমস্ত মেমরি এখনও প্রক্রিয়া দ্বারা রেফারেন্স করা যেতে পারে না। এই ক্ষেত্রে ওএসের জন্য ডিস্ক থেকে সম্পূর্ণ বাইনারি মেমোরিতে পড়ার প্রয়োজন হয় না এবং এইভাবে আরইএসের মান মেমরির এই অংশটি অন্তর্ভুক্ত করে না।
বার্ট

আমি যদি আরও কিছু করতে পারতাম এই আমার বেকন সংরক্ষণ করা হয়!
আতরিন

কৃতজ্ঞতার সাথে মন্তব্যগুলি @ জেটেরাস :) এর জন্য যা আছে :) (যদিও স্বীকার করে নিতে হবে আপনাকে সেগুলি পড়তে হবে: এস ... নিশ্চিত নয় যে কী অ্যাট্রেইন উল্লেখ করছে, আমি আশা করি এটি ইউকনডুড)
এজেপি

11
মন্তব্যটি আর কাজ করছে না সম্পর্কিত: মনে হয় শীর্ষের আরও সাম্প্রতিক সংস্করণগুলিতে বাছাই করা ক্ষেত্রগুলি বেছে নেওয়ার জন্য কী হিসাবে 'ও' সেট নেই। কখন ব্যবহার করবেন? কী আপনি আসল প্রোগ্রামের নাম এবং সংস্করণ দেখতে পাবেন, প্রোপস-এনজি সর্বশেষতম সংস্করণ। এটি দেবিয়ান , ফেডোরা এবং ওপেনসুএসের একটি কাঁটাচামচ: gitorious.org/procps । আপনি যদি এখনও SWAP কলামে বাছাই করতে চান: ক্ষেত্রগুলি দেখতে 'f' কীটি ব্যবহার করুন, SWAP এ যেতে তীর কীগুলি ব্যবহার করুন এবং বাছাই করতে 's' ব্যবহার করুন, তারপরে 'q' ব্যবহার করুন।
পিটার ভিএন

294

আমি খুঁজে পাওয়া সেরা স্ক্রিপ্টটি এই পৃষ্ঠায় রয়েছে: http://nurast.org/blog/find-out- কি-is- using-your-swap/

এখানে স্ক্রিপ্টের একটি বৈকল্পিক এবং মূলের প্রয়োজন নেই:

#!/bin/bash 
# Get current swap usage for all running processes
# Erik Ljungstrom 27/05/2011
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk3" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo

SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
    PID=`echo $DIR | cut -d / -f 3`
    PROGNAME=`ps -p $PID -o comm --no-headers`
    for SWAP in `grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'`
    do
        let SUM=$SUM+$SWAP
    done
    if (( $SUM > 0 )); then
        echo "PID=$PID swapped $SUM KB ($PROGNAME)"
    fi
    let OVERALL=$OVERALL+$SUM
    SUM=0
done
echo "Overall swap used: $OVERALL KB"

লিঙ্কটি মারা যাওয়ার ক্ষেত্রে এখানে অনুলিপিটি দেওয়া আছে: gitorious.org/dolanormisc/scriptts/blobs/master/getswapused
TautrimasPajarskas

4
মজার হলেও, আমি পেয়েছি Overall swap used: 260672 KB, 738932যেমন ব্যবহৃত হিসাবে বিনামূল্যে শো ...
ডনচো গুনচেভ

23
একই আউটপুট দশগুণ দ্রুত: for file in /proc/*/status ; do awk '/Tgid|VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | grep kB | sort -k 3 -nডেবিয়ান / আরএইচ 6x +, আর্চ, উবুন্টু (আরএইচ 5 এক্স এর VmSize) জন্য ( উত্স )। @ ডিগুনচেভের মতো এটি তুলনায় মোট কম স্বাপ দেয় free। @ টেনসিবাই আর্চে কাজ করে না; আপনার জাগ্রত কিছু কিছু অভাব হতে পারে।
tuk0z

1
দয়া করে এই স্ক্রিপ্টটির আমার নো কাঁটা সংস্করণটি দেখুন !
এফ। হাউরি

3
লেখক কিভাবে ব্যবহার করে এটি করতে প্রায় এক ফলো-আপ পোস্ট হয়েছে top: northernmost.org/blog/swap-usage-5-years-later
জ্যাক Valmadre

53

এখানে স্ক্রিপ্টের আরও একটি বৈকল্পিক, তবে আরও পঠনযোগ্য আউটপুট দেওয়ার অর্থ (সঠিক ফলাফল পেতে আপনাকে এটিকে মূল হিসাবে চালানো দরকার):

#!/bin/bash

    # find-out-what-is-using-your-swap.sh
    # -- Get current swap usage for all running processes
    # --
    # -- rev.0.3, 2012-09-03, Jan Smid          - alignment and intendation, sorting
    # -- rev.0.2, 2012-08-09, Mikko Rantalainen - pipe the output to "sort -nk3" to get sorted output
    # -- rev.0.1, 2011-05-27, Erik Ljungstrom   - initial version


SCRIPT_NAME=`basename $0`;
SORT="kb";                 # {pid|kB|name} as first parameter, [default: kb]
[ "$1" != "" ] && { SORT="$1"; }

[ ! -x `which mktemp` ] && { echo "ERROR: mktemp is not available!"; exit; }
MKTEMP=`which mktemp`;
TMP=`${MKTEMP} -d`;
[ ! -d "${TMP}" ] && { echo "ERROR: unable to create temp dir!"; exit; }

>${TMP}/${SCRIPT_NAME}.pid;
>${TMP}/${SCRIPT_NAME}.kb;
>${TMP}/${SCRIPT_NAME}.name;

SUM=0;
OVERALL=0;
    echo "${OVERALL}" > ${TMP}/${SCRIPT_NAME}.overal;

for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`;
do
    PID=`echo $DIR | cut -d / -f 3`
    PROGNAME=`ps -p $PID -o comm --no-headers`

    for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
    do
        let SUM=$SUM+$SWAP
    done

    if (( $SUM > 0 ));
    then
        echo -n ".";
        echo -e "${PID}\t${SUM}\t${PROGNAME}" >> ${TMP}/${SCRIPT_NAME}.pid;
        echo -e "${SUM}\t${PID}\t${PROGNAME}" >> ${TMP}/${SCRIPT_NAME}.kb;
        echo -e "${PROGNAME}\t${SUM}\t${PID}" >> ${TMP}/${SCRIPT_NAME}.name;
    fi
    let OVERALL=$OVERALL+$SUM
    SUM=0
done
echo "${OVERALL}" > ${TMP}/${SCRIPT_NAME}.overal;
echo;
echo "Overall swap used: ${OVERALL} kB";
echo "========================================";
case "${SORT}" in
    name )
        echo -e "name\tkB\tpid";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.name|sort -r;
        ;;

    kb )
        echo -e "kB\tpid\tname";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.kb|sort -rh;
        ;;

    pid | * )
        echo -e "pid\tkB\tname";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.pid|sort -rh;
        ;;
esac
rm -fR "${TMP}/";

2
খুব সুন্দর স্ক্রিপ্ট। এটি লোলোটাক্সের মতো একই তথ্য দেয় তবে আরও ভাল পাঠযোগ্য উপায়ে।
ফিলিপ ওয়েেন্ডলার

দুর্দান্ত আউটপুট। ধন্যবাদ।
ব্রায়ান ক্লাইন

2
আমি শুধু পরিবর্তিত ব্যবহার করছিলেন argsপরিবর্তে commমধ্যে psকমান্ড যেহেতু আমি একই নামের কিন্তু বিভিন্ন আর্গুমেন্টগুলি (পাইথন gunicorn প্রসেস একটি গুচ্ছ) সঙ্গে প্রক্রিয়ার অনেক আছে। অর্থাত:ps -p $PID -o args --no-headers
মগলগগুলি

1
সাইড নোটটি grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'সরলীকৃত করা যেতে পারেawk ' /VmSwap/ { print $2 }'
তেনসিবাই

12

আমি লক্ষ্য করেছি যে এই থ্রেডটি বরং পুরানো, তবে আপনি যদি এটির পিছনে পড়ে যান তবে আমি যেমনটি করেছি, এর আরও একটি উত্তর হ'ল: গন্ধ ব্যবহার করুন।

এখানে একটি লিঙ্ক রয়েছে যা আপনাকে এটি ইনস্টল করতে এবং এটি কীভাবে ব্যবহার করতে হয় উভয়কেই বলে:

http://www.cyberciti.biz/faq/linux-which-process-is-using-swap/


এই ভাল। পিআইডির সাথে অদলবদর ব্যবহার অনুসারে বাছাই করা প্রক্স দেখানোর জন্য নিবন্ধটি থেকে এখানে রূপান্তরিত সংস্করণ এখানে যুক্ত করা হয়েছে: proc / proc / * / স্থিতিতে ফাইলের জন্য; do awk '/ ^ Pid | VmSwap | Name / {printf $ 2 "" $ 3} END {মুদ্রণ ""}' $ ফাইল; সম্পন্ন | বাছাই-কে 3 -n -r | কম
স্টান ব্রাজিউস্কি

আপনার কয়েকটি / বিশেষ এন্ট্রি বাদ দেওয়ার জন্য আপনার / গ্লোবাল
প্রোক

10

এটি সম্পূর্ণরূপে পরিষ্কার নয় যদি আপনি বোঝেন যে সর্বাধিক পৃষ্ঠাগুলি অদলবদল হয়েছে এমন প্রক্রিয়াটি বা সর্বাধিক পৃষ্ঠাগুলি অদলবদলের কারণে কার প্রক্রিয়াটি সন্ধান করতে চান।

প্রথমটির জন্য আপনি topচালিয়ে যেতে পারেন এবং অদলবদলে ('প্রেস' চাপুন) অর্ডার করতে পারেন, পরেরটির জন্য আপনি চালাতে পারেন vmstatএবং 'তাই' এর জন্য শূন্য-নথির সন্ধান করতে পারেন ।


6

শীর্ষ কমান্ডটিতে প্রক্রিয়াটির জন্য পৃষ্ঠা ত্রুটির সংখ্যা প্রদর্শন করার জন্য একটি ক্ষেত্রও রয়েছে। সর্বাধিক পৃষ্ঠার ত্রুটিযুক্ত প্রক্রিয়াটি এমন প্রক্রিয়া হবে যা সর্বাধিক অদলবদল হয়। দীর্ঘকাল চলমান ডেমনগুলির জন্য এটি হতে পারে যে তারা শুরুতে প্রচুর পৃষ্ঠা ত্রুটি করে এবং পরে সংখ্যাটি বৃদ্ধি পায় না not সুতরাং আমাদের পৃষ্ঠা ফল্টগুলি বাড়ছে কিনা তা পর্যবেক্ষণ করতে হবে।


6

শেলের লুপটি এড়িয়ে অন্য স্ক্রিপ্ট রূপটি:

#!/bin/bash
grep VmSwap /proc/[0-9]*/status | awk -F':' -v sort="$1" '
  {
    split($1,pid,"/") # Split first field on /
    split($3,swp," ") # Split third field on space
    cmdlinefile = "/proc/"pid[3]"/cmdline" # Build the cmdline filepath
    getline pname[pid[3]] < cmdlinefile # Get the command line from pid
    swap[pid[3]] = sprintf("%6i %s",swp[1],swp[2]) # Store the swap used (with unit to avoid rebuilding at print)
    sum+=swp[1] # Sum the swap
  }
  END {
    OFS="\t" # Change the output separator to tabulation
    print "Pid","Swap used","Command line" # Print header
    if(sort) {
      getline max_pid < "/proc/sys/kernel/pid_max"
      for(p=1;p<=max_pid;p++) {
        if(p in pname) print p,swap[p],pname[p] # print the values
      }
    } else {
      for(p in pname) { # Loop over all pids found
        print p,swap[p],pname[p] # print the values
      }
    }
    print "Total swap used:",sum # print the sum
  }'

স্ট্যান্ডার্ড ব্যবহার হ'ল script.shএলোমেলো অর্ডার ( awkতার হ্যাশগুলি কীভাবে সঞ্চয় করা হয়) সহ প্রোগ্রামের প্রতি ব্যবহার পেতে বা পিডের script.sh 1সাহায্যে আউটপুটটিকে বাছাই করা।

আমি আশা করি যে কোডটি কী করে তা করার জন্য আমি যথেষ্ট মন্তব্য করেছি।


1
নোট করুন যে bashডিরেক্টরিগুলি সাজানো উপায়ে প্রসারিত করে (সংক্ষিপ্ত, সংখ্যাসূচক নয়)। এলোমেলো awkক্রমটি কীভাবে এর অ্যারে (হ্যাশ টেবিল) সঞ্চয় করে এবং কীভাবে for p in pnameতাদের পুনরুদ্ধার করে তা নীচে।
স্টিফেন চেজেলাস

@ স্টাফেনচাজেলাস ওয়েল, এগুলি এমনকি শব্দেরও নয়, এটি একটি এসকি কোড সাজান ( /proc/1/statusপরে আসে /proc/1992/statusএবং /এটি 9 এসকি কোডের উপরে একটি এসকি কোড রয়েছে this এটি একটি "এলোমেলো অর্ডার" চেহারা দেয় এবং অনুভবও করে দেয় I আমি অ্যাজকি হ্যাশ টেবিলের সাথে একমত , আমি এখানে একটি শর্টকাট নিয়েছি edit সম্পাদনা ইতিহাসে
বিশিষ্টতাটি

1
/proc/1/status/proc/1992/statusঅর্ডার বাইট মানের উপর ভিত্তি করে যেখানে সি লোকালে পরে আসে না । এটি আপনার লোকালে (বা আমার মধ্যে en_GB.UTF-8একটি জিএনইউ সিস্টেমে) রয়েছে, কারণ /কোলিশন অ্যালগরিদমের (এবং এর sপরে বাছাই করা 9) প্রথম ক্ষেত্রে উপেক্ষা করা হয়েছে । printf '/proc/%s/status\n' 1 1992 | LC_ALL=en_GB.UTF-8 sortসঙ্গে তুলনা করুন printf '/proc/%s/status\n' 1 1992 | LC_ALL=C sort। লোকেলে অন্য কোনও ক্ষেত্রে C, সাজানোর ক্রম সাধারণত বাইট মানের উপর ভিত্তি করে তৈরি হয় না
স্টিফেন চ্যাজেলাস

@ স্টেফেন চ্যাজেলাস ভাল পয়েন্ট, লোকেল সম্পর্কে না, যদিও। নির্ভুলতা যুক্ত করতে পুনরায় সম্পাদনা করতে দ্বিধা বোধ করুন যাতে ক্রেডিটগুলি আপনার হবে (অন্তত ইতিহাস সম্পাদনায়)।
তেনসিবাই

2
সম্পন্ন. এই উত্তরটি এখানে সর্বাধিক ভোট দেওয়া চেয়ে অনেক ভাল। এটি আরও উন্নয়নের দাবি রাখে। এটি এবং অন্যান্য উত্তরগুলি এখানে পাঠ্যকে প্রক্রিয়াজাত করতে শেল লুপ ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচনা করা হচ্ছে কেন তা নিয়ে আলোচনা করা হয়েছিল ? যা এখানে আমাকে এনেছে।
স্টিফেন চেজেলাস

6

তবুও আরও দুটি রূপ:

কারণ topবা htopছোট সিস্টেমে ইনস্টল করা যায়নি, ব্রাউজিং /procসর্বদা সম্ভব stay

এমনকি ছোট সিস্টেমেও আপনি একটি shell...

একজন বৈকল্পিক! (কেবল বাশ নয়)

এটি ললোটাক্স স্ক্রিপ্টের সাথে ঠিক একই , তবে কোনও কাঁটাচামচ ছাড়াই grep, awkবা ps। এটি অনেক দ্রুত!

এবং হিসাবে দরিদ্রতম এক পারফরম্যান্স সম্পর্কিত, এই স্ক্রিপ্টটি অধীনে ভাল চলবে তা নিশ্চিত করার জন্য একটু কাজ করা হয়েছিল , এবং কিছু অন্য। তারপরে, ( স্টাফেন চেজেলাসকে ধন্যবাদ ,) আবার আরও দ্রুত পরিণত হয়!

#!/bin/sh 
# Get current swap usage for all running processes
# Felix Hauri 2016-08-05
# Rewritted without fork. Inspired by first stuff from
# Erik Ljungstrom 27/05/2011
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk3" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo

OVERALL=0
rifs=`printf ': \t'`
for FILE in /proc/[0-9]*/status ;do
    SUM=0
    while IFS="$rifs" read FIELD VALUE ;do
        case $FIELD in
            Pid )    PID=$VALUE      ;;
            Name )   PROGNAME="$VALUE" ;;
            VmSwap ) SUM=$((SUM=${VALUE% *}))  ;;
        esac
    done <$FILE
    [ $SUM -gt 0 ] &&
        printf "PID: %9d  swapped: %11d KB (%s)\n" $PID $SUM "$PROGNAME"
    OVERALL=$((OVERALL+SUM))
done
printf "Total swapped memory: %14u KB\n" $OVERALL

ডাবল উদ্ধৃতি ভুলবেন না "$PROGNAME"! দেখুন Stéphane Chazelas এর মন্তব্য :

read FIELD PROGNAME < <(
    perl -ne 'BEGIN{$0="/*/*/../../*/*"} print if /^Name/' /proc/self/status
)
echo $FIELD "$PROGNAME"

echo $PROGNAMEবোধগম্য সিস্টেমে ডাবল উদ্ধৃতি ব্যতীত চেষ্টা করবেন না , এবং বর্তমান শেলটি মারার জন্য প্রস্তুত থাকুন!

এবং ক সংস্করণ

এটি যেহেতু খুব সহজ স্ক্রিপ্টে পরিণত হচ্ছে না , সময় আরও দক্ষ ভাষা ব্যবহার করে একটি উত্সর্গীকৃত সরঞ্জাম লিখতে চলেছে।

#!/usr/bin/perl -w

use strict;
use Getopt::Std;
my ($tot,$mtot)=(0,0);
my %procs;

my %opts;
getopt('', \%opts);

sub sortres {
    return $a <=> $b                                          if $opts{'p'};
    return $procs{$a}->{'cmd'} cmp $procs{$b}->{'cmd'}        if $opts{'c'};
    return $procs{$a}->{'mswap'} <=> $procs{$b}->{'mswap'}    if $opts{'m'};
    return $procs{$a}->{'swap'} <=> $procs{$b}->{'swap'};
};

opendir my $dh,"/proc";

for my $pid (grep {/^\d+$/} readdir $dh) {
    if (open my $fh,"</proc/$pid/status") {
        my ($sum,$nam)=(0,"");
        while (<$fh>) {
            $sum+=$1 if /^VmSwap:\s+(\d+)\s/;
            $nam=$1 if /^Name:\s+(\S+)/;
        }
        if ($sum) {
            $tot+=$sum;
            $procs{$pid}->{'swap'}=$sum;
            $procs{$pid}->{'cmd'}=$nam;
            close $fh;
            if (open my $fh,"</proc/$pid/smaps") {
                $sum=0;
                while (<$fh>) {
                    $sum+=$1 if /^Swap:\s+(\d+)\s/;
                };
            };
            $mtot+=$sum;
            $procs{$pid}->{'mswap'}=$sum;
        } else { close $fh; };
    };
};
map {
    printf "PID: %9d  swapped: %11d (%11d) KB (%s)\n",
        $_, $procs{$_}->{'swap'}, $procs{$_}->{'mswap'}, $procs{$_}->{'cmd'};
} sort sortres keys %procs;
printf "Total swapped memory: %14u (%11u) KB\n", $tot,$mtot;

এক সাথে চালাতে পারে

-c  sort by command name
-p  sort by pid
-m  sort by swap values
by default, output is sorted by status's vmsize

এটি ধরে নিয়েছে যে প্রক্রিয়া নামগুলিতে স্থান, ট্যাব :, ব্যাকস্ল্যাশ, ওয়াইল্ডকার্ড বা নিয়ন্ত্রণের অক্ষর নেই।
স্টিফেন চেজেলাস

@ স্টাফেন চ্যাজেলাস ধন্যবাদ! আমি কেবল সংখ্যাযুক্ত পাথ গণনা [1-9]করার *জন্য এর আগে যোগ করেছি (না self, না thread-self)
এফ হৌরি

1
সিনট্যাক্সটি জানা গেছে, তবে প্রক্রিয়াটির নামগুলি নেই। কমপক্ষে আপনার ভেরিয়েবলগুলি উদ্ধৃত করুন । (যে কোনও ক্ষেত্রে, আপনার স্ক্রিপ্টটি লোলোক্সাক্সের তুলনায় অনেক কম খারাপ)।
স্টিফেন চেজেলাস

1
লিনাক্সের প্রসেসের নামগুলিতে 0 কোনও বাইট মান থাকতে পারে তবে দৈর্ঘ্যে 15 বাইটে সীমাবদ্ধ। Nameমধ্যে এন্ট্রি /proc/*/statusএনকোড ঐ বাইট মান কিছু। উদাহরণস্বরূপ চেষ্টা করুন perl -ne 'BEGIN{$0="\n\t\\"} print if /^Name/' /proc/self/status। কারণ এটি খুব সংক্ষিপ্ত, perl -ne 'BEGIN{$0="/*/*/../../*/*"} print if /^Name/' /proc/self/statusআপনি যখন নিজের ভেরিয়েবলগুলি উদ্ধৃত করতে ভুলে যান তবে ক্ষতির পরিমাণ যেমন সীমাবদ্ধ থাকে।
স্টিফেন চেজেলাস

1
এটি (কমপক্ষে পার্ল সংস্করণ যা আমি চেষ্টা করেছি) অন্যান্য উত্তরগুলির তুলনায় অত্যন্ত দ্রুত।
ডেভিড গার্ডনার

5

আমি ওয়েবে লম্বা ওয়ান-লাইনারে একটি ভিন্ন স্ক্রিপ্টটি রূপান্তর করেছি:

 { date;for f in /proc/[0-9]*/status; do 
   awk '{k[$1]=$2} END { if (k["VmSwap:"]) print k["Pid:"],k["Name:"],k["VmSwap:"];}' $f 2>/dev/null; 
   done | sort -n ; }

যা আমি তারপর ক্রোনজব মধ্যে ফেলেছি এবং আউটপুটটিকে একটি লগফাইলে পুনর্নির্দেশ করি। এখানে তথ্য Swap:smaps ফাইলে প্রবেশের পরিমাণ সংগ্রহ করার মতোই তবে আপনি যদি নিশ্চিত হতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

{ date;for m in /proc/*/smaps;do 
  awk '/^Swap/ {s+=$2} END { if (s) print FILENAME,s }' $m 2>/dev/null;
  done | tr -dc ' [0-9]\n' |sort -k 1n; }

এই সংস্করণটির আউটপুট দুটি কলামে রয়েছে: পিড, অদলবদুর পরিমাণ। উপরের সংস্করণে, trঅ-সংখ্যাসূচক উপাদানগুলি বাদ দেয়। উভয় ক্ষেত্রেই আউটপুট পিডের মাধ্যমে সংখ্যাগতভাবে বাছাই করা হয়।


2
এটি ভাল তবে প্রথমটি পিড আরোহণের মাধ্যমে বাছাই করুন (সাজানো-এন)। আরোহণের ক্রমে (তালিকার সামনে সর্বাধিক ব্যবহার করা) স্যুপের ব্যবহারের দ্বারা এটি বাছাই করা আরও ভাল ব্যবহার। এটি "
सॉर्ट-

3

ম্যাকোএসএক্স-এ, আপনি শীর্ষ কমান্ডটি চালান তবে "ও" টাইপ করতে হবে তারপর "ভার্সাইজ করুন" তারপরে এন্টার দিন।


2

আমি মনে করি আপনি topপ্রচুর স্মৃতি ব্যবহার করে সক্রিয় প্রক্রিয়াগুলি চালনা করে এবং সন্ধান করে একটি ভাল অনুমান পেতে পারেন । এই প্রোগ্রামক্রমেটিক্যালি করা আরও শক্ত --- কেবল লিনাক্স ওওএম হত্যাকারী হিউরিস্টিক্স সম্পর্কে অন্তহীন বিতর্কগুলি দেখুন।

অদলবদল করা ইনস্টল করা চেয়ে সক্রিয় ব্যবহারে আরও মেমরি থাকার একটি ফাংশন , তাই একক প্রক্রিয়াতে এটি দোষী করা সাধারণত কঠিন। যদি এটি একটি চলমান সমস্যা হয় তবে সবচেয়ে ভাল সমাধান হ'ল আরও মেমরি ইনস্টল করা বা অন্যান্য পদ্ধতিগত পরিবর্তন করা।



1

অদলবদল স্থানটি কী কী প্রক্রিয়াটি ব্যবহার করছে ঠিক কীভাবে তা সন্ধান করার জন্য আমি সরাসরি কোনও উত্তর জানি না, তবে এই লিঙ্কটি সহায়ক হতে পারে । আরও একটি ভাল এখানে শেষ

এছাড়াও, কোন প্রসেসগুলি প্রচুর মেমরি ব্যবহার করছে এবং সামগ্রিকভাবে কতগুলি স্ব্যাপ ব্যবহৃত হচ্ছে তা দেখার জন্য হটোপের মতো একটি ভাল সরঞ্জাম ব্যবহার করুন।


1

iotopএকটি খুব দরকারী সরঞ্জাম। এটি I / O এর লাইভ পরিসংখ্যান দেয় এবং প্রক্রিয়া / থ্রেডের জন্য অদলবদল করে। ডিফল্টরূপে এটি প্রতি থ্রেড দেখায় তবে আপনি iotop -Pপ্রতিটি প্রক্রিয়া সম্পর্কিত তথ্য পেতে পারেন । এটি ডিফল্টরূপে উপলভ্য নয়। আপনাকে আরপিএম / অ্যাপের মাধ্যমে ইনস্টল করতে হতে পারে।


1

এখানে এমন একটি সংস্করণ যা @ লোলোটাক্স দ্বারা স্ক্রিপ্টের মতোই হয় তবে এটি আরও দ্রুত (কম পাঠযোগ্য)। এই লুপটি আমার মেশিনে প্রায় 10 সেকেন্ড সময় নেয়, আমার সংস্করণটি 0.019 সেকেন্ডে লাগে, যা আমার কাছে গুরুত্বপূর্ণ কারণ আমি এটিকে একটি সিজি পৃষ্ঠাতে তৈরি করতে চেয়েছিলাম।

    join -t / -1 3 -2 3 \
    <(grep VmSwap /proc/*/status  |egrep -v '/proc/self|thread-self' | sort -k3,3 --field-separator=/ ) \
    <(grep -H  '' --binary-files=text /proc/*/cmdline |tr '\0' ' '|cut -c 1-200|egrep -v '/proc/self|/thread-self'|sort -k3,3 --field-separator=/ ) \
    | cut -d/ -f1,4,7- \
    | sed 's/status//; s/cmdline//' \
    | sort -h -k3,3 --field-separator=:\
    | tee >(awk -F: '{s+=$3} END {printf "\nTotal Swap Usage = %.0f kB\n",s}') /dev/null

1

২০১৫ সাল থেকে কার্নেল প্যাচ যেটি যুক্ত করে SwapPss( https://lore.kernel.org/patchwork/patch/570506/ ) শেষ পর্যন্ত আনুপাতিক স্বাপের গণনা পাওয়া যায় যার অর্থ যদি কোনও প্রক্রিয়া অনেক কিছু বদলে যায় এবং তা কাঁটাচামচ হয়, উভয়ই কাঁটাচামচ প্রক্রিয়া প্রতিটি 50% অদলবদল রিপোর্ট করা হবে। এবং যদি হয় তবে কাঁটাচামচ, প্রতিটি প্রক্রিয়া অদলবদল করা পৃষ্ঠাগুলির 33% গণনা করা হয় তাই আপনি যদি সে সমস্ত স্ব্যাপের ব্যবহার একসাথে গণনা করেন তবে প্রক্রিয়া গণনা দ্বারা গুণিত মানের পরিবর্তে আপনি সত্যিকারের সোয়াপ ব্যবহার পাবেন।

সংক্ষেপে:

(cd /proc; for pid in [0-9]*; do printf "%5s %6s %s\n" "$pid" "$(awk 'BEGIN{sum=0} /SwapPss:/{sum+=$2} END{print sum}' $pid/smaps)" "$(cat $pid/comm)"; done | sort -k2n,2 -k1n,1)

প্রথম কলামটি হ'ল পিড, দ্বিতীয় কলামটি কিবিতে অদলবদল এবং বাকী রেখার কমান্ডটি কার্যকর করা হচ্ছে। আইডেন্টিকাল অদলবদ সংখ্যা পিড অনুসারে বাছাই করা হয়।

উপরে যেমন লাইন নির্গত হতে পারে

awk: cmd. line:1: fatal: cannot open file `15407/smaps' for reading (No such file or directory)

যার সহজ অর্থ পিড 15407 এর সাথে /proc/প্রক্রিয়াটি smapsফাইলটির তালিকায় এটি দেখার এবং পড়ার মধ্যে শেষ হয়েছিল । যদি এটি আপনার কাছে গুরুত্বপূর্ণ হয় তবে কেবল শেষটি যুক্ত করুন 2>/dev/null। মনে রাখবেন যে আপনি সম্ভবত অন্য কোনও সম্ভাব্য ডায়াগনস্টিকও হারাবেন।

প্রকৃত বিশ্বের উদাহরণস্বরূপ, এটি অন্য সার্ভারে চলমান প্রতিটি অ্যাপাচি শিশুর জন্য really 40 মেগাবাইটের সোয়াপ ব্যবহারের প্রতিবেদনের অন্যান্য সরঞ্জামগুলিকে পরিবর্তন করে যা সত্যই প্রতি সন্তানের জন্য ব্যবহৃত -3-30 KB৩০ কেবি এর মধ্যে আসল ব্যবহার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.