जानिए कौन सी प्रक्रिया आईओटी के बिना I / O करती है


12

लिनक्स पर, मैं जानना चाहता हूं कि कौन सी प्रक्रिया मेरी डिस्क I / O बैंडविथ का उपयोग करती है।

मुझे पता है कि मैं उपयोग कर सकता हूं iotopलेकिन मेरे पास एक मशीन है जहां, विभिन्न कारणों से, iotopस्थापित नहीं किया जा सकता है।

मैं मैन्युअल रूप से वह जानकारी कैसे प्राप्त कर सकता हूं? ( iotopखुद कैसे आगे बढ़ता है?)

जवाबों:


15

फ़ाइल को /proc/<pid>/ioआपकी ज़रूरत का प्रतिनिधित्व करता है। इसके समान आउटपुट पाने के लिए यह एक स्क्रिप्टिंग का काम है iotop। देखें लिनक्स कर्नेल प्रलेखन के लिए /proc/<pid>/ioफ़ाइल मान:

rchar

I / O काउंटर: chars read बाइट्स की संख्या जो इस कार्य के कारण स्टोरेज से पढ़ी जाती है। यह केवल बाइट्स का योग है जिसे पढ़ने के लिए यह प्रक्रिया पास की गई है () और pread ()। इसमें tty IO जैसी चीजें शामिल हैं और यह इस बात से अप्रभावित है कि वास्तविक भौतिक डिस्क IO की आवश्यकता थी या नहीं (रीड पेजेक से संतुष्ट हो सकती है)

wchar

I / O काउंटर: chars लिखा बाइट्स की संख्या जो इस कार्य के कारण हुई है, या डिस्क पर लिखे जाने का कारण होगा। इसी तरह के कैचर्स यहां rchar के साथ लागू होते हैं।

[...]

read_bytes

I / O काउंटर: बाइट्स ने बाइट्स की संख्या को गिनने का प्रयास किया है जो इस प्रक्रिया को वास्तव में भंडारण परत से प्राप्त करने का कारण बना। सबमिट_बीओ () स्तर पर किया गया, इसलिए यह ब्लॉक-समर्थित फ़ाइल सिस्टम के लिए सटीक है।

write_bytes

I / O काउंटर: बाइट्स में बाइट्स की संख्या को गिनने का प्रयास किया जाता है, जिसके कारण यह प्रक्रिया स्टोरेज लेयर पर भेजी जाती है। यह पृष्ठ-गंदा समय पर किया जाता है।

अब, आप उस छोटी bashस्क्रिप्ट का उपयोग कर सकते हैं :

#!/bin/bash

if [ "$(id -u)" -ne 0 ] ; then
  echo "Must be root" 2>&1
  exit 1
fi

delay=2
lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)

while :; do

  echo "-----"
  listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)

  echo "$lista" | while read -r pida xa bytesa; do
    [ -e "/proc/$pida" ] || continue
    echo -en "$pida:\t"
    bytesb=$(echo "$listb" | awk -v pid=$pida '$1==pid{print $3}')
    echo "$((($bytesb - $bytesa) / $delay)) b/s"
  done | sort -nk2 | tail
  sleep $delay
  listb=$lista
done

यह दो सेकंड की देरी के साथ दो सूचियाँ बनाता है $delay: ( उनके बीच में या में कमी हो सकती है), और फिर सूचियों की तुलना करता है और अंतरों की गणना करता है। सबसे अधिक I / O के साथ 10 प्रक्रिया अंतिम 2 सेकंड में उनके I / O बैंडविथ के साथ मुद्रित होती है। आप आई / ओ के बजाय पढ़ के बारे में जानना चाहते हैं मैं / हे बस संपादित grepकरने के लिए सूची में आदेश wcharके बजाय rchar:

lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)
listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.