उच्च I / O के लिए विशिष्ट फ़ाइल जिम्मेदार का निर्धारण


37

यह एक साधारण समस्या है, लेकिन पहली बार मैंने वास्तव में इसे ठीक किया है: यह पता लगाना कि कौन सी विशिष्ट फाइलें / आईएनडी सबसे अधिक I / O का लक्ष्य हैं। मैं एक सामान्य सिस्टम अवलोकन प्राप्त करने में सक्षम होना चाहता हूं, लेकिन अगर मुझे पीआईडी ​​या टीआईडी ​​देना है तो मैं इसके साथ ठीक हूं।

मैं straceउस कार्यक्रम को करने के बिना जाना चाहता हूं जिसमें पॉप अप होता है iotop। अधिमानतः, एक ही नस में एक उपकरण का उपयोग करते हुए iotopलेकिन एक जो फ़ाइल द्वारा आइटम करता है। मैं यह lsofदेखने के लिए उपयोग कर सकता हूं कि मेलमैन के पास कौन सी फाइलें हैं, लेकिन यह इंगित नहीं करता है कि कौन सी फाइल I / O प्राप्त कर रही है या कितनी।

मैंने अन्यत्र देखा है जहाँ इसका उपयोग करने का सुझाव दिया गया था, auditdलेकिन मैं ऐसा नहीं करना पसंद करूँगा क्योंकि यह जानकारी को हमारी ऑडिट फ़ाइलों में डाल देगा, जिसका उपयोग हम अन्य उद्देश्यों के लिए करते हैं और ऐसा लगता है कि मुझे इस विषय पर शोध करने में सक्षम होना चाहिए इस तरह।

मेरे पास अभी जो विशिष्ट समस्या है वह LVM स्नैपशॉट को बहुत तेज़ी से भरने के साथ है। मैंने तब से इस समस्या को हल कर लिया है, लेकिन यह देखना चाहता हूं कि इस तरह से इसे ठीक किया जा सकता है, न कि lsसभी ओपन फाइल डिस्क्रिप्टर पर ऐसा /proc/<pid>/fdकरने के लिए कि कौन सबसे तेजी से बढ़ रहा है।


संभवतः संबंधित: unix.stackexchange.com/questions/9520/...
SLM

हाँ, मैंने पहले ऐसा नहीं देखा था, लेकिन इस सवाल के अधिकांश उत्तर मूल रूप से इस तरह थे: "ठीक है अगर आप चीजों को अविश्वसनीय रूप से विशिष्ट तरीके से करते हैं, और कुछ अजीब करते हैं तो आप एक मोटा विचार रख सकते हैं" बनाम कुछ ऐसा जो सीधे हल करता है आवश्यकता के बिना समस्या है कि व्यवस्थापक को भी फैंसी मिले। मेरा मतलब दूसरों की आलोचना करना नहीं है, और मुझे एहसास है कि अब इस समस्या का हल संभव है कि इस तरह के समाधान की पेशकश की गई थी, लेकिन ऐसा लगता है कि भले ही कोई उपकरण नहीं है, fatraceलेकिन पुराने जैसा , कि मुझे लिखी गई स्क्रिप्ट की तरह कुछ करना चाहिए क्योंकि यह अधिक व्यापक रूप से प्रयोग करने योग्य है।
ब्राचली

बस स्पष्ट होने के लिए: मैं दूसरों की आलोचना नहीं कर रहा हूं जिन्होंने मदद की पेशकश की थी। मदद हमेशा बिना किसी मदद के बेहतर होती है। यह केवल निराशाजनक है जब आपको लगता है कि समस्या को एक सीधे आगे की प्रतिक्रिया होनी चाहिए और सभी आप स्वयं पता लगा सकते हैं या दूसरों को यह सुझाव देते हुए देख सकते हैं कि या तो क्लूडी वर्कआर्डर या बहुत मैनुअल प्रक्रियाएं हैं (जैसे कि मैंने अपनी मेलमैन समस्या के साथ क्या किया)।
ब्राचली

हाँ, मैं हमेशा आश्चर्यचकित होता हूं जब मुझे नई क्यू के उत्तर मिलते हैं जो उस साइट में दफन हो जाते हैं जो तब तक दिखाई नहीं देते जब तक मैं थोड़ी देर के लिए खुदाई नहीं करता। वहाँ somethings की तरह लगता है 8-)। इसलिए एक ही Q को कई तरीकों से पूछना और पुराने लोगों से इसे जोड़ना अच्छा है क्योंकि वे बाहर रूट किए जाते हैं। अपनी स्क्रिप्ट पर सहमत होना एक बेहतर दृष्टिकोण है, मुझे अभी भी आश्चर्य है कि एक सामान्य उद्देश्य उपकरण नहीं है जो आप पूछते हैं। यूनिक्स में एक बड़े अंतर की तरह लगता है।
स्लम

ज़्यादातर मदद सिर्फ बेहद टारगेट की जाती है, जो थोड़ा परेशान कर सकती है, जब जवाब देने पर आप एक ही बात को कई बार अलग-अलग तरीके से कह रहे होते हैं। लेकिन यह एसई साइटों की प्रकृति है। मुझे नहीं पता कि गिल्स यह कैसे करते हैं। मुझे ये लंबे फॉर्म क्यू और ए के बेहतर लगते हैं।
स्लम

जवाबों:


59

इस सवाल के कई पहलू हैं जिन्हें आंशिक रूप से अन्य उपकरणों के माध्यम से संबोधित किया गया है, लेकिन एक भी उपकरण नहीं दिखता है जो उन सभी सुविधाओं को प्रदान करता है जिनकी आप तलाश कर रहे हैं।

iotop

यह उपकरण दिखाता है कि कौन सी प्रक्रिया सबसे अधिक I / O का उपभोग कर रही है। लेकिन इसमें विशिष्ट फ़ाइल नामों को दिखाने के लिए विकल्पों का अभाव है।

$ sudo iotop
Total DISK READ:       0.00 B/s | Total DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                        
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/u:0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    7 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]

डिफ़ॉल्ट रूप से यह वही करता है जो topCPU I के समय के लिए डिस्क I / O को छोड़कर प्रक्रियाओं के लिए नियमित करता है। आप इसे -aस्विच का उपयोग करके आपको 30,000 फुट का दृश्य देने के लिए मनाना कर सकते हैं ताकि यह समय के साथ प्रक्रिया द्वारा संचय को दर्शाता है।

$ sudo iotop -a
Total DISK READ:       0.00 B/s | Total DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                        
  258 be/3 root          0.00 B    896.00 K  0.00 %  0.46 % [jbd2/dm-0-8]
22698 be/4 emma          0.00 B     72.00 K  0.00 %  0.00 % chrome
22712 be/4 emma          0.00 B    172.00 K  0.00 %  0.00 % chrome
 1177 be/4 root          0.00 B     36.00 K  0.00 %  0.00 % cupsd -F
22711 be/4 emma          0.00 B    120.00 K  0.00 %  0.00 % chrome
22703 be/4 emma          0.00 B     32.00 K  0.00 %  0.00 % chrome
22722 be/4 emma          0.00 B     12.00 K  0.00 %  0.00 % chrome

i * उपकरण (इनोटिफाई, आईवॉच आदि)

ये उपकरण फ़ाइल एक्सेस घटनाओं तक पहुंच प्रदान करते हैं, हालांकि उन्हें विशेष रूप से विशिष्ट निर्देशिका या फ़ाइलों को लक्षित करने की आवश्यकता होती है। जब वे प्रदर्शन की समस्याओं को डीबग करते समय किसी अज्ञात प्रक्रिया द्वारा दुष्ट फ़ाइल पहुंच का पता लगाने का प्रयास करते हैं, तो वे सहायक नहीं होते हैं।

इसके अलावा inotifyफ्रेमवर्क एक्सेस की जा रही फाइलों के बारे में कोई विवरण प्रदान नहीं करता है। केवल एक्सेस का प्रकार, इसलिए इन उपकरणों का उपयोग करके डेटा की मात्रा के बारे में कोई जानकारी उपलब्ध नहीं है।

iostat

किसी दिए गए उपकरण (हार्ड ड्राइव) या विभाजन तक पहुंच के आधार पर समग्र प्रदर्शन (पढ़ता और लिखता) दिखाता है। लेकिन कोई जानकारी प्रदान नहीं करता है कि कौन सी फाइलें इन एक्सेस को उत्पन्न कर रही हैं।

$ iostat -htx 1 1
Linux 3.5.0-19-generic (manny)  08/18/2013  _x86_64_    (3 CPU)

08/18/2013 10:15:38 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          18.41    0.00    1.98    0.11    0.00   79.49

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda
                  0.01     0.67    0.09    0.87     1.45    16.27    37.06     0.01   10.92   11.86   10.82   5.02   0.48
dm-0
                  0.00     0.00    0.09    1.42     1.42    16.21    23.41     0.01    9.95   12.22    9.81   3.19   0.48
dm-1
                  0.00     0.00    0.00    0.02     0.01     0.06     8.00     0.00  175.77   24.68  204.11   1.43   0.00

blktrace

यह विकल्प बहुत निम्न स्तर का है। इसमें दृश्यता का अभाव है, जिसके कारण फ़ाइलें और / या इनोड एक्सेस किए जा रहे हैं, बस कच्चे ब्लॉक नंबर।

$ sudo blktrace -d /dev/sda -o - | blkparse -i -
  8,5    0        1     0.000000000   258  A WBS 0 + 0 <- (252,0) 0
  8,0    0        2     0.000001644   258  Q WBS [(null)]
  8,0    0        3     0.000007636   258  G WBS [(null)]
  8,0    0        4     0.000011344   258  I WBS [(null)]
  8,5    2        1 1266874889.709032673   258  A  WS 852117920 + 8 <- (252,0) 852115872
  8,0    2        2 1266874889.709033751   258  A  WS 852619680 + 8 <- (8,5) 852117920
  8,0    2        3 1266874889.709034966   258  Q  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        4 1266874889.709043188   258  G  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        5 1266874889.709045444   258  P   N [jbd2/dm-0-8]
  8,0    2        6 1266874889.709051409   258  I  WS 852619680 + 8 [jbd2/dm-0-8]
  8,0    2        7 1266874889.709053080   258  U   N [jbd2/dm-0-8] 1
  8,0    2        8 1266874889.709056385   258  D  WS 852619680 + 8 [jbd2/dm-0-8]
  8,5    2        9 1266874889.709111456   258  A  WS 482763752 + 8 <- (252,0) 482761704
...
^C
...
Total (8,0):
 Reads Queued:           0,        0KiB  Writes Queued:           7,       24KiB
 Read Dispatches:        0,        0KiB  Write Dispatches:        3,       24KiB
 Reads Requeued:         0       Writes Requeued:         0
 Reads Completed:        0,        0KiB  Writes Completed:        5,       24KiB
 Read Merges:            0,        0KiB  Write Merges:            3,       12KiB
 IO unplugs:             2           Timer unplugs:           0

Throughput (R/W): 0KiB/s / 510KiB/s
Events (8,0): 43 entries
Skips: 0 forward (0 -   0.0%)

fatrace

यह लिनक्स कर्नेल और एक स्वागत योग्य के लिए एक नया अतिरिक्त है, इसलिए यह केवल नए डिस्ट्रोस जैसे कि उबंटू 12.10 में है। मेरे फेडोरा 14 सिस्टम में इसकी कमी थी 8-)।

यह एक ही पहुंच प्रदान करता है जिसे आप inotifyकिसी विशेष निर्देशिका और / या फ़ाइलों को लक्षित किए बिना प्राप्त कर सकते हैं ।

$ sudo fatrace
pickup(4910): O /var/spool/postfix/maildrop
pickup(4910): C /var/spool/postfix/maildrop
sshd(4927): CO /etc/group
sshd(4927): CO /etc/passwd
sshd(4927): RCO /var/log/lastlog
sshd(4927): CWO /var/log/wtmp
sshd(4927): CWO /var/log/lastlog
sshd(6808): RO /bin/dash
sshd(6808): RO /lib/x86_64-linux-gnu/ld-2.15.so
sh(6808): R /lib/x86_64-linux-gnu/ld-2.15.so
sh(6808): O /etc/ld.so.cache
sh(6808): O /lib/x86_64-linux-gnu/libc-2.15.so

उपरोक्त आपको उस प्रक्रिया आईडी को दिखाता है जो फ़ाइल एक्सेस कर रही है और यह किस फ़ाइल तक पहुंच रही है, लेकिन यह आपको कोई संपूर्ण बैंडविड्थ उपयोग नहीं देता है, इसलिए प्रत्येक एक्सेस किसी अन्य एक्सेस के लिए अप्रभेद्य है।

इसलिए क्या करना है?

fatraceविकल्प शो के लिए सबसे वादा अंत में एक उपकरण है कि आप डिस्क की सकल उपयोग दिखा सकते हैं प्रदान करने आई / ओ एक्सेस किए जा रहे फ़ाइलें, बल्कि एक्सेस कर प्रक्रियाओं की तुलना के आधार पर।

संदर्भ


6
मीठे बच्चे यीशु, एसएलएम। जहाँ तक मेरा संबंध है आप यूनिक्स एसई के रॉकस्टार की तरह हैं। आप जवाब हमेशा अविश्वसनीय रूप से शैक्षिक होते हैं और सभी एक स्थान पर बहुत सारे अनुसंधान दिखाते हैं। अधिकांश लोग (यदि वे इसके बारे में जानते थे) तो बस पिछले बिट के बारे में पोस्ट किया होगा fatraceऔर इसे विकसित नहीं किया होगा। मैं वास्तव में सराहना करता हूं कि आप कैसे अतिरिक्त मील जाते हैं, यह सुनिश्चित करने के लिए कि लोग पूरी तस्वीर को समझते हैं और चाहते हैं कि मैं सिर्फ अपवोट से अधिक कर सकता हूं और इनाम दे सकता हूं।
ब्राचली

@JoelDavis - अपने बहुत ही दयालु शब्दों के लिए धन्यवाद। मुझे एक विहित उत्तर बनाने का आपका विचार पसंद आया इसलिए मैं इसे यहाँ शुरू करने का प्रयास कर रहा था। मैं इस समस्या में भी कई बार भाग चुका हूं और कामना करता हूं कि मेरे पास भी इस तरह का कोई संसाधन हो ताकि मुझे लगा कि हम इसे यहां 8-8 तक बनाएंगे।
स्लम

एक बात मैं उलझन में हूँ: जब मैंने yumकिसी कारण से python3 के पुस्तकालयों में स्थापित किया था । मैंने इस fileपर काम किया और ऐसा लग रहा है कि यह एक ईएलएफ निष्पादन योग्य है। lddकोई लिंक नहीं दिखाता है pythonऔर न ही किया है strings। किसी भी विचार क्यों यह python3 के साथ परेशान?
ब्राचली

1
BTW, जाहिरा तौर पर मुझे इनाम देने के जवाब को स्वीकार करने के बाद कुछ समय इंतजार करना होगा। ऐसा नहीं है कि यह यूनिक्स एसई के कुल राशि प्रतिष्ठा अंक के लगभग आधे के साथ किसी के लिए मायने रखता है लेकिन सिर्फ एक FYI करें।
ब्राचली

1
मेरे लिए वास्तव में कोई मुद्दा नहीं है, नहीं। मुझे इसके बारे में जो जानकारी चाहिए, वह मुझे उचित iotopऔर iostatकॉल के माध्यम से मिल सकती है । इसके अलावा, मैंने अजगर की बात का पता लगाया, ऐसा लगता है (फेडोरा 18 पर कम से कम) एक "पावर-यूज-रिपोर्ट" pythonस्क्रिप्ट है, इसलिए yumकेवल इस तथ्य पर प्रतिक्रिया दे pythonरही थी जो आरपीएम की निर्भरता में है। ताकि विशेष रहस्य सुलझ जाए।
ब्राचली

4

मुझे अभी तक कोई जवाब नहीं मिला है, लेकिन मैंने यह स्क्रिप्ट (अंत में) लिखी है और ऐसा लगता है कि मुझे वही चाहिए जो मुझे चाहिए। मैंने अन्य प्रणालियों पर इसका परीक्षण नहीं किया है और यह लिनक्स-विशिष्ट है।

मूल रूप से यह सिर्फ strace30 सेकंड के लिए चारों ओर लपेटता है , फ़ाइल से संबंधित सिस्टम कॉल के लिए फ़िल्टरिंग करता है और फ़ाइल नाम को हटाने का प्रयास करता है। यह उस फ़ाइल की घटनाओं की संख्या को गिनता है straceऔर उपयोगकर्ता को एक पृष्ठांकित सारांश प्रस्तुत करता है। यह सही नहीं है, लेकिन किसी विशेष फ़ाइल में सिस्टम कॉल की संख्या कुछ कमजोर सहसंबंध हो सकती है कि मैं कितना / ओ प्रदर्शन कर रहा हूं।

मैंने इसका पूरी तरह से परीक्षण नहीं किया है, लेकिन अगर यह बॉक्स से बाहर काम नहीं करता है, तो इसे लोगों को शुरू करने के लिए जगह देनी चाहिए। यदि यह किसी भी तरह से बाहर हो जाता है, तो इसे अजगर की तरह उच्च स्तर की भाषा में फिर से लिखना उचित हो सकता है ।

अगर मुझे ऐसा करने के एक कम घरेलू तरीके के एक सप्ताह के भीतर जवाब नहीं मिलता है (भले ही यह एक और उपकरण है जो सिर्फ एक विशेष प्रक्रिया के I / O को गिनता है) मैं इसे उत्तरोत्तर के लिए अपने उत्तर के रूप में स्वीकार करूंगा।

स्क्रिप्ट:

#!/bin/bash

####
# Creates files underneath /tmp
# Requires commands: timeout  strace  stty
####
#
# All commands are GNU unless otherwise stated
#
##########################################################


####
## Initialization
####

outputFile=/tmp/out.$RANDOM.$$
uniqueLinesFile=/tmp/unique.$RANDOM.$$
finalResults=/tmp/finalOutput.txt.$$

if [ $# -ne 1 ]; then
    echo "USAGE: traceIO [PID]" >&2
    exit 2
fi

if ! [[ "$1" =~ ^[0-9]+$ ]]; then
    echo "USAGE: traceIO [PID]" >&2
    echo -e "\nGiven Process ID is not a number." >&2
    exit 2
fi

if [ ! -e /proc/$1 ]; then
    echo "USAGE: traceIO [PID]" >&2
    echo -e "\nThere is no process with $1 as the PID." >&2
    exit 2
fi

if [[ "x$PAGER" == "x" ]]; then

   for currentNeedle in less more cat; do

      which $currentNeedle >/dev/null 2>&1

      if [ $? -eq 0 ]; then
         PAGER=$currentNeedle
         break;
      fi

   done

  if [[ "x$PAGER" == "x" ]]; then

     echo "Please set \$PAGER appropriately and re-run" >&2
     exit 1

  fi

fi

####
## Tracing
####

echo "Tracing command for 30 seconds..."

timeout 30 strace -e trace=file -fvv -p $1 2>&1 | egrep -v -e "detached$" -e "interrupt to quit$" | cut -f2 -d \" > $outputFile

if [ $? -ne 0 ]; then
   echo -e "\nError performing Trace. Exiting"
   rm -f $outputFile 2>/dev/null
   exit 1
fi

echo "Trace complete. Preparing Results..."

####
## Processing
####

sort $outputFile | uniq > $uniqueLinesFile

echo -e "\n--------  RESULTS --------\n\n  #\t Path " > $finalResults
echo -e " ---\t-------" >> $finalResults

while IFS= read -r currentLine; do

   echo -n $(grep -c "$currentLine" "$outputFile")
   echo -e "\t$currentLine"

done < "$uniqueLinesFile" | sort -rn >> $finalResults

####
## Presentation
####

resultSize=$(wc -l $finalResults | awk '{print $1}')
currentWindowSize=$(stty size | awk '{print $1}')

  # We put five literal lines in the file so if we don't have more than that, there were no results
if [ $resultSize -eq 5 ]; then

   echo -e "\n\n No Results found!"

elif [ $resultSize -ge $currentWindowSize ] ; then

   $PAGER $finalResults

else

   cat $finalResults

fi

  # Cleanup
rm -f $uniqueLinesFile $outputFile $finalResults

2

आप iWatch का उपयोग करके आईवॉच का उपयोग कर सकते हैं

iWatch का उपयोग करना बहुत आसान है, मान लीजिए कि आप / आदि फाइल सिस्टम में परिवर्तन देखना चाहते हैं, आपको बस इसे कंसोल में चलाने की आवश्यकता है

$ iwatch /etc

और iwatch आपको बताएगा कि क्या इस निर्देशिका में कुछ परिवर्तन हुआ है। और यदि आप प्रति ईमेल पर सूचित होना चाहते हैं:

$ iwatch -m admin@smsgw.local /etc

इस स्थिति में, व्यवस्थापक को ईमेल सूचना प्राप्त होगी (हो सकता है कि आप अपने एसएमएस गेटवे खाते का उपयोग कर सकते हैं, इसलिए आपको किसी भी समय और कहीं भी तुरंत अलार्म दिया जाएगा)। और अगर आप कई अंतर निर्देशिकाओं की निगरानी करना चाहते हैं, तो आप एक कॉन्फ़िगरेशन फ़ाइल का उपयोग कर सकते हैं। यह कॉन्फ़िगरेशन फ़ाइल एक xml फ़ाइल है जिसमें एक आसान समझने योग्य संरचना है।


1
मुझे लगता है यह प्रयोग कर रहा inotifyहै कि सही है? मैं किसी भी चीज़ का उपयोग करने में संकोच कर रहा था inotifyक्योंकि आपको इसे पथ देना होगा (जो कि अनिवार्य रूप से मैं क्या देख रहा हूं) और मुझे इस बात की चिंता थी कि अगर मेरे बस के नीचे सब कुछ /पीआईडी ​​द्वारा फ़िल्टर किया जा सकता है तो कितना उपरि होगा ? मैं अस्थायी सुस्ती को सहन करने में सक्षम हो सकता हूं अगर यह आसान हो जाए कि कौन सा कार्यक्रम यह कर रहा है। वेबसाइट में कोई उदाहरण कमांड आउटपुट भी नहीं है।
ब्राचली

1
@JoelDavis Im वास्तव में निश्चित नहीं है। जहां तक ​​मुझे पता है कि यह रैम की एक बड़ी मात्रा में खपत करता है इसलिए इसे "/" के तहत चलाना खतरनाक होगा।
vfbsilva
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.