এক্স টাইমের পরে উচ্চ সিপিইউ ব্যবহারের মাধ্যমে প্রক্রিয়াটি মেরে ফেলবেন? [বন্ধ]


21

লিনাক্স চালানোতে আমার কয়েকটি প্রক্রিয়া রয়েছে যা মাঝে মাঝে ক্রাশ হয় (গেম সার্ভার), যা 100% সিপিইউ ব্যবহার করে শেষ হয়।

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

কেবলমাত্র 100% ব্যবহারে প্রক্রিয়াটি হত্যা করা কার্যকর হবে না কারণ এটি সাধারণ ক্রিয়াকলাপের সময় সংক্ষিপ্ত সময়ের জন্য ক্ষতিগ্রস্থ হবে।

আমি এই স্ক্রিপ্টটিও পেয়েছি যা মনে হয় যা করতে চায় বলে মনে হয়, তবে এটি কেবল একটি প্রক্রিয়াতেই সীমাবদ্ধ: লিঙ্ক

কোন সাহায্য ব্যাপকভাবে প্রশংসা করা হয়!


আপনি দয়া করে আবার স্ক্রিপ্টের একটি লিঙ্ক পোস্ট করতে পারেন যার কারণে এটি একটি পেস্টবিন.com/m1c814cb4 আর বৈধ বলে মনে হচ্ছে না।

আপনি কি মাইনক্রাফ্ট সার্ভার চালাচ্ছেন তা অনুমান করার ক্ষেত্রে আমি কি ঠিক বলতে পারি? ;)
ফোনিউক

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

উত্তর:


19

মনিট চেষ্টা করুন ।

আপনি নিজের কাজটি সম্পাদন করতে এই জাতীয় কনফিগারেশন ব্যবহার করতে পারেন:

check process gameserver with pidfile /var/run/gameserver.pid
  start program = "/etc/init.d/gameserver start" with timeout 60 seconds
  stop program  = "/etc/init.d/gameserver stop"
  if cpu > 80% for 2 cycles then alert
  if cpu > 95% for 5 cycles then restart
  if totalmem > 200.0 MB for 5 cycles then restart
  if loadavg(5min) greater than 10 for 8 cycles then stop
  if failed port 12345 type tcp with timeout 15 seconds
    then restart
  if 3 restarts within 5 cycles then timeout

এই কনফিগারেশন সম্পর্কিত বিশদটি মনিটের ডকুমেন্টেশনে পাওয়া যাবে ।


উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ! প্রক্রিয়াটি মনিট দিয়ে শুরু না করে নিরীক্ষণের কোনও উপায় আছে কি? আমার কাছে মেশিনে প্রচুর পরিমান সার্ভার চলছে যা ওয়েব ইন্টারফেসের মাধ্যমে পরিচালিত হয়, মনিট দিয়ে সেগুলি চালু করা আদর্শ নয়।
ব্যবহারকারী 30153

নিশ্চিত, start programএবং stop programলাইন ধরো যদি যখন জন্য monitচাহিদা আপনার প্রক্রিয়া পুনরায় চালু করতে। আপনি এখনও এটি আপনার সাধারণ আরআর স্ক্রিপ্ট দিয়ে শুরু করতে পারেন। monitপ্রোগ্রামটি ইতিমধ্যে চলছে কিনা তাও পরীক্ষা করতে পারে (যেমন পিআইডি ফাইল বা প্রক্রিয়া নাম দ্বারা)।
joschi

কল্পনাপ্রসূত, আমি মনে করি আমি এটি খুঁজে পেয়েছি। একমাত্র সমস্যা হ'ল এটি একটি পিড ফাইলের উপর নির্ভরতা, আমাকে 200 টিরও বেশি প্রক্রিয়ার জন্য একটি উত্পন্ন করতে হবে এবং আমি মনে করি প্রতিটিটির জন্য নিয়ম তৈরি করতে হবে। সাহায্যের জন্য ধন্যবাদ!
ব্যবহারকারী 30153

4

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

#!/bin/bash

## Note: will kill the top-most process if the $CPU_LOAD is greater than the $CPU_THRESHOLD.
echo
echo checking for run-away process ...

CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=300
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)

if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
  # kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
  # kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
  kill -9 $TOPPROCESS
  echo system overloading!
  echo Top-most process killed $TOPPROCESS
  echo load average is at $CPU_LOAD
  echo 
  echo Active processes...
  ps aux r

  # send an email using mail
  SUBJECT="Runaway Process Report at Marysol"
  # Email To ?
  EMAIL="myemail@somewhere.org"
  # Email text/message
  EMAILMESSAGE="/tmp/emailmessage.txt"
  echo "System overloading, possible runaway process."> $EMAILMESSAGE
  echo "Top-most process killed $TOPPROCESS" >>$EMAILMESSAGE
  echo "Load average was at $CPU_LOAD" >>$EMAILMESSAGE
  echo "Active processes..." >>$EMAILMESSAGE
  echo "$PROCESS" >>$EMAILMESSAGE
  mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE

else
 echo
 echo no run-aways. 
 echo load average is at $CPU_LOAD
 echo 
 echo Active processes...
 ps aux r
fi
exit 0


এই ছোট স্ক্রিপ্টটি অত্যন্ত কার্যকর হয়েছে, আপনি যদি কোনও প্রক্রিয়া হত্যার বিষয়টি পছন্দ করেন না তবে ইমেলটি আপনাকে অবহিত রাখতে সহায়তা করবে।


আপনার উত্তরের জন্য ধন্যবাদ! আমি ঠিক উল্লেখ করতে চাই যে আপনার বাছাই TOPPROCESSবন্ধ আছে। এটি প্রকৃত মান অনুসারে বাছাই করবে না, পরিবর্তে এটি এন্ট্রিগুলিকে বর্ণানুক্রমিকভাবে আদেশ করবে (উদাহরণস্বরূপ 6% এর 12% এর চেয়ে বেশি অগ্রাধিকার থাকবে)। আরও ভাল বিকল্প নিম্নলিখিত কমান্ড হতে পারে:top -b -n 1 | sed 1,6d | sed -n 2p
গ্লুটোনিমেট

1
সিপিইউ যদি 90% হয় তবে সিপিইউ_এলএড কি? এবং আপনি কিভাবে থ্রেশহোল্ড গণনা? ধন্যবাদ
অফির আটিয়া

1
মাল্টি কোর সার্ভারে একটি প্রক্রিয়া সর্বাধিক আউট হওয়াতে এই পরিস্থিতি ধরা পড়বে না।
আপক্রিক

0

নীচে একটি নমুনা বেস স্ক্রিপ্ট যা আপনাকে নিজের প্রয়োজনের জন্য কিছু ইঙ্গিত পেতে সহায়তা করতে পারে।

#!/bin/bash

CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=700

if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
  kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1)
fi

exit 0

দয়া করে নোট করুন যে আপনার $ CPU_THRESHOLD এর মান আপনার সিস্টেমে থাকা (সিপিইউ) কোরের সংখ্যার উপর নির্ভর করবে। এই বিষয় সম্পর্কে একটি বিশদ বিবরণ http://blog.scoutapp.com/articles/2009/07/31/ বোঝা- লোড-averages এ পাওয়া যাবে ।

আপনি আপনার স্ক্রিপ্টটি / etc / inittab এর ভিতরে থেকে বা আপনার পছন্দের প্রতিটি মিনিটের জন্য কল করতে পারেন call দয়া করে নোটটিও রাখবেন যে script সিপিইউ_এলএইচডি $ সিপিইউ_থ্রেশহোল্ডের চেয়ে বেশি হলে উদাহরণস্বরূপ স্ক্রিপ্টটি সর্বাধিক সর্বাধিক প্রক্রিয়াটিকে হত্যা করবে kill

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