মোট সিপিইউ সময় নিরীক্ষণের সবচেয়ে সহজ উপায় - প্রতি ব্যবহারকারী?


25

একাধিক ব্যবহারকারী সিস্টেমে, আমি প্রতিটি ব্যবহারকারীর সিপিইউ ব্যবহারের সিপিইউ সময়ের সেকেন্ডে পরিমাপ করতে চাই। এই পরিমাপের উদ্দেশ্যে, আমি ধরে নিয়েছি যে যদি কোনও পিআইডি কোনও ব্যবহারকারীর অন্তর্ভুক্ত থাকে তবে এই ব্যবহারকারী সিপিইউ সময় সৃষ্টি করছে - এটি হ'ল আমি ডিমন এবং কার্নেলটিকে উপেক্ষা করছি।

বর্তমানে আমি প্রতি পাঁচ সেকেন্ডে এটি করছি:

  1. প্রতিটি ব্যবহারকারী এবং তারা যে পিআইডি চালাচ্ছেন তা পান ps aux
  2. প্রতিটি পিআইডি-র জন্য, ইউটিউম, কিউটাইম, স্টাইম এবং সিএসটাইমেরx যোগফল/proc/[pid]/stat
  3. গণনা করুন t = x / interval(উচ্চ চাপের পরে যখন বিরতি সর্বদা ঠিক 5 সেকেন্ড হয় না)

যদি আমি এটি চালনা করি তবে আমি বোধগম্য মানগুলি পাই। উদাহরণস্বরূপ: এই সিস্টেমে একজন ব্যবহারকারী পাইথন ( while True: pass) এ ঘুরছিলেন এবং সিস্টেমটি প্রতি সেকেন্ডে প্রায় 750 মিলিসেকেন্ড সিপিইউ সময় দেখায়। যখন সিস্টেমটি কিছুটা স্থির হয়ে গিয়েছিল, তখন এটি 1-সেকেন্ড ইনভার্ভালের জন্য 1600ms রিপোর্ট করেছিল। যা সঠিক সম্পর্কে মনে হয়, তবে আমি অবজ্ঞা করি যে এই মানগুলি ছলচাতুর হতে পারে, বিশেষত প্রদত্ত যে আমি তাদের সত্যই বুঝতে পারি না ।

তাই আমার প্রশ্ন হল এটি:

প্রতি ব্যবহারকারীর ভিত্তিতে সিপিইউ লোড পরিমাপ করার উপযুক্ত এবং সঠিক উপায় কী?

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

যদিও এটি জটিল হতে পারে, আমি অবশ্যই জানি এটি সম্ভব। এটি আমার সূচনা পয়েন্ট:

কার্নেল একটি প্রসেস তৈরির সময় এবং সিপিইউর সময়কালে যা তার জীবদ্দশায় গ্রাস করে তা ট্র্যাক করে। প্রতিটি ঘড়ির টিক চিহ্ন দেওয়ার পরে, কার্নেল জিফিতে সময় প্রক্রিয়াকরণটি আপডেট করে যা বর্তমান প্রক্রিয়াটি সিস্টেম এবং ব্যবহারকারী মোডে ব্যয় করেছে। - ( লিনাক্স ডকুমেন্টেশন প্রকল্প থেকে )

আমি যে মানটি পরে আছি তা হ'ল সেকেন্ডের পরিমাণ (বা জিফি) যা কোনও ব্যবহারকারী সিপিইউতে ব্যয় করেছে, সিস্টেম লোড বা সিপিইউ ব্যবহারের শতাংশ নয় percentage

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


1
500 খ্যাতি: o
প্রারম্ভিকদের

একজন আমার দলের বাইরে বিট, কিন্তু একটি খুব আকর্ষণীয় প্রশ্ন তাই আমি একটি বিট খনন এবং কিছু পাওয়া গেছে যে আমি আশা করি আপনি এই সমাধানে সহায়তা করার জন্য অন্তত দরকারী হল: stackoverflow.com/a/1424556/905573
kingmilo

1
আপনি কি জানেন topব্যাচ মোড করতে পারেন? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'সেই মুহুর্তে {ব্যবহারকারী for এর জন্য বোঝাটি প্রদর্শন করা উচিত।
রিনজুইন্ড

উত্তর:


11

আপনার মত প্রক্রিয়া অ্যাকাউন্টিং প্রয়োজন মনে হচ্ছে।

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

উবুন্টুতে, প্রক্রিয়া অ্যাকাউন্টিং সরঞ্জামগুলি acctপ্যাকেজে রয়েছে অ্যাক্ট ইনস্টল করুন

প্রতি ব্যবহারকারী প্রতিবেদন পেতে, চালান

sa -m

দুর্ভাগ্যক্রমে, এটি আমার পক্ষে কাজ করবে না কারণ "সা" দীর্ঘস্থায়ী প্রক্রিয়া গণনা করবে না। আমার যা প্রয়োজন (আমার মনে হয়) প্রক্রিয়াগুলি শুরু এবং সমাপ্ত হওয়ার শনাক্ত করার একটি উপায় এবং তারা সিপু করার সময় তাদের সিপিইউ রেকর্ড করার পাশাপাশি পাশাপাশি চলমান অবস্থায় রেকর্ড করা।
স্টেফানো মধ্যে Palazzo

@ স্টেফানোপালাজো আমি বিশ্বাস করি এটি আপনিই পাবেন সেরা। থেকে চলমান প্রক্রিয়াগুলির জন্য সময়ের সাথে এটি বৃদ্ধি করুন /proc/[pid]/stat
ündrük

দেখা যাচ্ছে যে, বেশিরভাগ সমস্ত প্রক্রিয়া (.ps.gz) দ্বারা সঠিকভাবে saগণনা করা হবে । এবং দীর্ঘস্থায়ী প্রক্রিয়াগুলি "অনুমান" করার আমারও একটি ভাল উপায় আছে, অবশেষে সেইগুলির জন্য একটি সঠিক মান পাওয়ার আগে। সুতরাং আমরা এটি সর্বোপরি ব্যবহার করব এবং আপনার উত্তরের অনুগ্রহটি প্রদান করে আমি বেশি খুশি। একটি গুচ্ছ ধন্যবাদ!
স্টিফানো প্যালাজো

3

এটি প্রতিটি ব্যবহারকারীর জন্য ব্যবহারকারীর নাম এবং তাদের সিপিইউ সময় দেখায় একটি লাইন দেবে:

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done

2

আরও সুস্পষ্ট উত্তরগুলির মধ্যে একটি হ'ল আপনি বর্তমানে যা করছেন তা কেবল প্রসারিত করা।

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

আশা করি এটি আপনাকে যে দিকে নিয়ে যাচ্ছে সে সম্পর্কে আরও কিছু ধারণা দিতে পারে।

http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm


0

এটি কয়েক দিন ধরে চলমান প্রক্রিয়াগুলিও পরিচালনা করবে..সপ্তাহ / মাস / বছর ধরে কীভাবে প্রসারিত হবে তা নিশ্চিত নয় ..

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.