การพิจารณาไฟล์เฉพาะที่รับผิดชอบสำหรับ High I / O


37

นี่เป็นปัญหาง่าย ๆ แต่ครั้งแรกที่ฉันต้องแก้ไขจริง ๆ : การค้นหาไฟล์ / inodes ที่เจาะจงเป็นเป้าหมายของ I / O ส่วนใหญ่ ฉันต้องการรับภาพรวมระบบทั่วไป แต่ถ้าฉันต้องให้ PID หรือ TID ฉันไม่เป็นไร

ฉันต้องการที่จะไปโดยไม่ต้องทำในโปรแกรมที่ปรากฏขึ้นในstrace iotopควรใช้เครื่องมือในหลอดเลือดดำเดียวกับiotopที่ใช้แยกแยะไฟล์ ฉันสามารถใช้lsofเพื่อดูว่าไฟล์ mailman นั้นเปิดอยู่ แต่ไม่ได้ระบุว่าไฟล์ใดที่ได้รับ I / O หรือเท่าไหร่

ฉันเคยเห็นที่อื่นที่แนะนำให้ใช้auditdแต่ฉันไม่ต้องการทำเพราะจะใส่ข้อมูลลงในไฟล์การตรวจสอบของเราซึ่งเราใช้เพื่อวัตถุประสงค์อื่นและดูเหมือนว่าเป็นปัญหาที่ฉันควรจะวิจัย ทางนี้.

ปัญหาเฉพาะที่ฉันมีอยู่ในขณะนี้คือด้วยสแนปชอตของ LVM ที่เติมอย่างรวดเร็วเกินไป ฉันได้แก้ไขปัญหาแล้ว แต่อยากจะสามารถแก้ไขได้ด้วยวิธีนี้แทนที่จะทำเพียงตัวlsอธิบายไฟล์แบบเปิดทั้งหมด/proc/<pid>/fdเพื่อดูว่าอันไหนเติบโตเร็วที่สุด


อาจเกี่ยวข้อง: unix.stackexchange.com/questions/9520/…
slm

ใช่ฉันไม่เคยเห็นแบบนั้นมาก่อน แต่คำตอบส่วนใหญ่ของคำถามนี้เป็นแบบนั้น: "ถ้าคุณทำสิ่งนี้ด้วยวิธีที่เฉพาะเจาะจงอย่างไม่น่าเชื่อและทำสิ่งแปลก ๆ ที่คุณสามารถมีความคิดคร่าว ๆ " กับสิ่งที่แก้ได้โดยตรง ปัญหาโดยไม่ต้องให้ผู้ดูแลได้รับแฟนซีเกินไป ฉันไม่ได้ตั้งใจจะวิพากษ์วิจารณ์ผู้อื่นและตอนนี้ฉันก็รู้ว่าความยากของปัญหานี้อาจเป็นไปได้ว่าวิธีการดังกล่าวได้รับการเสนอ แต่ดูเหมือนว่าแม้ว่าจะไม่มีเครื่องมือเหมือนfatraceแต่เก่ากว่า ได้รับการนำเสนอเนื่องจากมีประโยชน์มากขึ้น
Bratchley

เพื่อให้ชัดเจน: ฉันไม่ได้วิจารณ์คนอื่นที่เสนอความช่วยเหลือ ช่วยเหลืออยู่เสมอดีกว่าไม่ช่วย มันน่าผิดหวังเมื่อคุณรู้สึกว่าปัญหาควรมีการตอบสนองตรงไปตรงมาและทั้งหมดที่คุณสามารถคิดออกเองหรือดูคนอื่น ๆ ที่แนะนำว่าเป็นวิธีการแก้ปัญหา kludgy หรือกระบวนการด้วยตนเองมาก (เช่นสิ่งที่ฉันลงเอยกับปัญหา mailman ของฉัน)
Bratchley

ใช่ฉันประหลาดใจอยู่เสมอเมื่อพบคำตอบของคำถามใหม่ที่ฝังอยู่ในไซต์ที่ไม่ปรากฏจนกว่าฉันจะขุดสักพัก ดูเหมือนว่ามีบางสิ่งแตกที่นั่น 8-) ดังนั้นทำไมจึงเป็นการดีที่จะถามคำถามหลาย ๆ แบบเดียวกันและเชื่อมโยงกับคำถามเก่า ๆ ตกลงสคริปต์ของคุณเป็นวิธีที่ดีกว่าฉันยังคงประหลาดใจที่ไม่มีเครื่องมือวัตถุประสงค์ทั่วไปที่ทำในสิ่งที่คุณถาม ดูเหมือนว่าช่องว่างขนาดใหญ่ใน Unix
slm

ความช่วยเหลือส่วนใหญ่มีเป้าหมายอย่างมากซึ่งอาจทำให้รำคาญเล็กน้อยตั้งแต่เมื่อตอบคุณกำลังพูดในสิ่งเดียวกันหลายครั้งหลายหนหลายวิธี แต่นั่นเป็นธรรมชาติของเว็บไซต์ SE ฉันไม่รู้ว่า Gilles ทำอย่างไร ฉันชอบแบบฟอร์มที่ยาวกว่านี้ถาม & ตอบจะดีกว่า
slm

คำตอบ:


58

มีหลายแง่มุมสำหรับคำถามนี้ซึ่งได้รับการแก้ไขบางส่วนผ่านเครื่องมืออื่น ๆ แต่ดูเหมือนจะไม่เป็นเครื่องมือเดียวที่ให้คุณสมบัติทั้งหมดที่คุณต้องการ

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]

โดยค่าเริ่มต้นมันทำสิ่งที่ปกติtopสำหรับกระบวนการ vying สำหรับเวลาของ CPU ยกเว้นดิสก์ I / O คุณสามารถเกลี้ยกล่อมเพื่อให้คุณได้รับมุมมอง 30,000 ฟุตโดยใช้-aสวิตช์เพื่อให้แสดงการสะสมตามกระบวนการเมื่อเวลาผ่านไป

$ 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, iwatch และอื่น ๆ )

เครื่องมือเหล่านี้จัดเตรียมการเข้าถึงเหตุการณ์การเข้าถึงไฟล์อย่างไรก็ตามพวกเขาจำเป็นต้องกำหนดเป้าหมายเป็นการเฉพาะไปยังไดเรกทอรีหรือไฟล์ที่ระบุ ดังนั้นจึงไม่เป็นประโยชน์เมื่อพยายามติดตามการเข้าถึงไฟล์โกงโดยกระบวนการที่ไม่รู้จักเมื่อแก้ไขข้อบกพร่องด้านประสิทธิภาพ

นอกจากนี้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

ตัวเลือกนี้อยู่ในระดับต่ำเกินไป มันขาดความสามารถในการมองเห็นว่าไฟล์ใดและ / หรือ inodes กำลังเข้าถึงอยู่แค่หมายเลขบล็อกดิบ

$ 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

นี่เป็นส่วนเสริมใหม่ของเคอร์เนล Linux และเป็นที่ต้อนรับดังนั้นจึงเป็นเฉพาะใน distros รุ่นใหม่เช่น Ubuntu 12.10 ระบบ Fedora 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

ด้านบนแสดง ID กระบวนการที่ทำให้การเข้าถึงไฟล์และไฟล์ที่กำลังเข้าถึง แต่ไม่ให้การใช้แบนด์วิดท์โดยรวมสำหรับคุณดังนั้นการเข้าถึงแต่ละครั้งจะไม่สามารถแยกแยะการเข้าถึงอื่น ๆ ได้

แล้วจะทำอย่างไรดี?

fatraceตัวเลือกการแสดงสัญญามากที่สุดสำหรับFINALLYให้เครื่องมือที่สามารถแสดงให้คุณใช้งานของดิสก์รวม I / O ที่อยู่บนพื้นฐานของการเข้าถึงไฟล์มากกว่ากระบวนการทำเข้าถึงได้

อ้างอิง


5
พระเยซูที่รัก คุณเป็นเหมือน rockstar ของ Unix SE เท่าที่ฉันกังวล คำตอบของคุณมักจะให้ความรู้และแสดงการวิจัยมากมายในที่เดียว คนส่วนใหญ่ (ถ้าพวกเขารู้เกี่ยวกับมัน) จะเพิ่งโพสต์บิตสุดท้ายเกี่ยวกับfatraceและไม่ได้พัฒนามันผ่านมาก ฉันรู้สึกซาบซึ้งจริงๆที่คุณได้รับไมล์พิเศษเพื่อให้แน่ใจว่าผู้คนเข้าใจภาพรวมทั้งหมดและหวังว่าฉันจะสามารถทำได้มากกว่าเพียงการโหวตขึ้นและให้เงินรางวัล
Bratchley

@JoelDavis - ขอบคุณสำหรับคำพูดที่ดีของคุณ ฉันชอบความคิดของคุณในการสร้างคำตอบที่ยอมรับได้ดังนั้นฉันจึงพยายามเริ่มต้นที่นี่ ฉันพบปัญหานี้หลายครั้งด้วยและหวังว่าฉันจะมีทรัพยากรเช่นนี้ดังนั้นฉันจึงคิดว่าเราจะสร้างมันขึ้นที่นี่ 8-)
slm

สิ่งหนึ่งที่ฉันสับสนเกี่ยวกับ: เมื่อฉันติดตั้งyumดึงในห้องสมุดของ python3 ด้วยเหตุผลบางอย่าง ฉันทำfileมันและมันดูเหมือนว่ามันเป็นปฏิบัติการของเอลฟ์ lddไม่แสดงลิงก์ไปยังpythonและไม่ได้stringsแสดง มีความคิดว่าทำไมมันถึงรบกวน python3?
Bratchley

1
BTW เห็นได้ชัดว่าฉันต้องรอสักครู่หลังจากยอมรับคำตอบเพื่อรับรางวัล ไม่ใช่เรื่องสำคัญสำหรับใครบางคนที่มีคะแนนชื่อเสียงรวมกันประมาณครึ่งหนึ่งของ Unix SE แต่เป็นเพียงแค่ FYI
Bratchley

1
ไม่ใช่ปัญหาสำหรับฉันจริงๆ ฉันสามารถรับข้อมูลที่ฉันต้องการเกี่ยวกับสิ่งนั้นผ่านทางที่เหมาะสมiotopและการiostatโทร นอกจากนี้ฉันพบสิ่งที่หลามดูเหมือน (ใน Fedora 18 อย่างน้อย) มีpythonสคริปต์"รายงานการใช้พลังงาน" ดังนั้นyumก็แค่ตอบสนองต่อความจริงที่pythonอยู่ในการพึ่งพาของ RPM เพื่อแก้ไขความลึกลับนั้น
Bratchley

4

ฉันยังไม่ได้รับคำตอบ แต่ฉันเขียนสคริปต์นี้ (ตอนท้าย) และดูเหมือนว่าจะทำสิ่งที่ฉันต้องการ ฉันยังไม่ได้ทดสอบกับระบบอื่นและเป็นเฉพาะ Linux

โดยทั่วไปมันจะล้อมรอบstraceเป็นเวลา 30 วินาทีกรองการเรียกระบบที่เกี่ยวข้องกับไฟล์และพยายามดึงชื่อไฟล์ออก มันนับจำนวนการเกิดขึ้นของไฟล์นั้นในstraceและนำเสนอบทสรุปหน้าให้กับผู้ใช้ มันไม่สมบูรณ์แบบ แต่จำนวนการเรียกใช้ระบบไปยังไฟล์หนึ่ง ๆ อาจมีความสัมพันธ์ที่อ่อนแอเล็กน้อยต่อประสิทธิภาพของ I / O

ฉันยังไม่ได้ทดสอบอย่างเต็มที่ แต่ถ้ามันไม่ได้ผลมันควรให้สถานที่เริ่มต้นกับคน หากได้รับความโป่งพองออกมามาก ๆ ก็อาจจะแนะนำให้เขียนใหม่นี้เป็นภาษาระดับที่สูงขึ้นเช่นงูหลาม

หากฉันไม่ได้รับคำตอบภายในหนึ่งสัปดาห์โดยใช้วิธีการแบบโฮมเบียนน้อยกว่านี้ (แม้ว่าจะเป็นอีกเครื่องมือหนึ่งที่นับ 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 Using iWatch

iWatch นั้นใช้งานง่ายมากสมมติว่าคุณต้องการดูการเปลี่ยนแปลงในระบบไฟล์ / etc คุณเพียงแค่เรียกใช้ในคอนโซล

$ iwatch /etc

และ iwatch จะบอกคุณว่ามีอะไรเปลี่ยนแปลงในไดเรกทอรีนี้หรือไม่ และหากคุณต้องการได้รับการแจ้งเตือนต่ออีเมล:

$ iwatch -m admin@smsgw.local /etc

ในกรณีนี้ผู้ดูแลระบบจะได้รับการแจ้งเตือนทางอีเมล (บางทีคุณสามารถใช้บัญชีเกตเวย์ SMS ของคุณดังนั้นคุณจะได้รับการเตือนทันทีทุกที่ทุกเวลา) และถ้าคุณต้องการตรวจสอบไดเรกทอรีที่แตกต่างคุณสามารถใช้ไฟล์กำหนดค่า ไฟล์การกำหนดค่านี้เป็นไฟล์ xml ที่มีโครงสร้างที่เข้าใจง่าย


1
ฉันคิดว่าสิ่งนี้ใช้inotifyถูกต้องหรือไม่ ฉันลังเลที่จะใช้ทุกอย่างตามที่inotifyคุณต้องให้ทาง (ซึ่งเป็นสิ่งที่ฉันกำลังมองหา) และฉันกังวลว่าจะมีค่าใช้จ่ายมากแค่ไหนถ้าฉันทำทุกอย่างภายใต้/PID ตัวกรองนี้ ฉันอาจทนความเชื่องช้าชั่วคราวได้ถ้ามันง่ายพอที่จะแยกโปรแกรมที่กำลังทำอยู่ เว็บไซต์ยังไม่มีตัวอย่างคำสั่งเอาต์พุต
Bratchley

1
@JoelDavis ฉันไม่แน่ใจจริงๆ เท่าที่ฉันรู้ว่ามันใช้แรมจำนวนมากดังนั้นการรันภายใต้ "/" จะเป็นอันตราย
vfbsilva
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.