Menentukan File Tertentu yang Bertanggung jawab untuk I / O Tinggi

37

Ini adalah masalah sederhana tetapi pertama kali saya harus benar-benar memperbaikinya: menemukan file / inode spesifik mana yang merupakan target dari sebagian besar I / O. Saya ingin bisa mendapatkan gambaran umum sistem secara umum, tetapi jika saya harus memberikan PID atau TID saya tidak masalah dengan itu.

Saya ingin pergi tanpa harus melakukan straceprogram yang muncul iotop. Lebih disukai, menggunakan alat dalam nada yang sama seperti iotoptetapi satu yang diperinci berdasarkan file. Saya dapat menggunakan lsofuntuk melihat file mailman mana yang terbuka tetapi tidak menunjukkan file mana yang menerima I / O atau berapa banyak.

Saya telah melihat di tempat lain di mana ia disarankan untuk digunakan, auditdtetapi saya lebih suka tidak melakukannya karena akan memasukkan informasi ke dalam file audit kami, yang kami gunakan untuk tujuan lain dan ini sepertinya merupakan masalah yang saya harus dapat teliti lewat sini.

Masalah spesifik yang saya miliki saat ini adalah dengan mengisi snapshot LVM terlalu cepat. Saya sudah menyelesaikan masalah tetapi ingin bisa memperbaikinya dengan cara ini daripada hanya melakukan lspada semua deskriptor file terbuka /proc/<pid>/fduntuk melihat mana yang tumbuh paling cepat.

Bratchley
sumber
Ya, saya belum pernah melihat yang sebelumnya, tetapi sebagian besar jawaban untuk pertanyaan ini pada dasarnya seperti itu: "Ya, jika Anda melakukan hal-hal ini dengan cara yang sangat spesifik, dan melakukan sesuatu yang aneh Anda dapat memiliki ide kasar" versus sesuatu yang langsung memecahkan masalah tanpa mengharuskan admin menjadi terlalu mewah. Saya tidak bermaksud mengkritik orang lain, dan saya menyadari sekarang kesulitan dari masalah ini mungkin adalah cara solusi seperti itu ditawarkan, tetapi sepertinya bahkan jika tidak ada alat seperti fatracetetapi lebih tua, bahwa sesuatu seperti naskah yang saya tulis seharusnya telah ditawarkan karena lebih dapat digunakan.
Bratchley
Untuk lebih jelasnya: Saya tidak mengkritik yang lain yang menawarkan bantuan. Bantuan selalu lebih baik daripada tidak ada bantuan. Itu hanya membuat frustasi ketika Anda merasa masalah harus memiliki tanggapan yang lurus ke depan dan semua yang dapat Anda ketahui sendiri atau melihat orang lain menyarankan penyelesaian yang baik atau proses yang sangat manual (seperti apa yang akhirnya saya lakukan dengan masalah tukang pos saya).
Bratchley
Ya saya selalu kagum ketika saya menemukan jawaban untuk Q baru di sini terkubur di situs yang tidak muncul sampai saya menggali sebentar. Sepertinya ada sesuatu yang rusak di sana 8-). Karena itu mengapa ada baiknya menanyakan Q yang sama beberapa cara dan menautkannya ke yang lebih lama saat mereka dialihkan. Setuju skrip Anda adalah pendekatan yang lebih baik, saya masih terkejut bahwa tidak ada alat tujuan umum yang melakukan apa yang Anda minta. Sepertinya ada celah besar di Unix.
slm
Sebagian besar bantuan hanya sangat ditargetkan yang dapat sedikit mengganggu, karena ketika menjawab Anda mengatakan hal yang sama berkali-kali dengan cara yang berbeda. Tapi itulah sifat situs SE. Saya tidak tahu bagaimana Gilles melakukannya. Saya suka bentuk Q & A yang lebih lama ini lebih baik.
slm

Jawaban:

60

Ada beberapa aspek untuk pertanyaan ini yang telah ditangani sebagian melalui alat lain, tetapi tampaknya tidak ada alat tunggal yang menyediakan semua fitur yang Anda cari.

iotop

Alat ini menunjukkan proses mana yang paling banyak mengonsumsi I / O. Tetapi tidak memiliki opsi untuk menampilkan nama file tertentu.

$ 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]

Secara default ia melakukan apa yang biasa topdilakukan untuk proses berlomba-lomba untuk waktu CPU, kecuali untuk disk I / O. Anda dapat membujuknya untuk memberi Anda tampilan 30.000 kaki dengan menggunakan -asakelar sehingga menunjukkan akumulasi dengan proses, seiring waktu.

$ 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 * tools (inotify, iwatch, dll.)

Alat-alat ini menyediakan akses ke acara akses file, namun mereka harus ditargetkan secara khusus ke direktori atau file tertentu. Jadi mereka tidak begitu membantu ketika mencoba melacak akses file jahat oleh proses yang tidak diketahui, ketika debugging masalah kinerja.

Juga inotifykerangka tidak menyediakan keterangan tentang file yang sedang diakses. Hanya tipe akses, jadi tidak ada informasi tentang jumlah data yang dipindahkan bolak-balik tersedia, menggunakan alat ini.

iostat

Menampilkan kinerja keseluruhan (baca & tulis) berdasarkan akses ke perangkat (hard drive) atau partisi yang diberikan. Tetapi tidak memberikan wawasan apa pun tentang file mana yang menghasilkan akses ini.

$ 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

Opsi ini terlalu rendah. Itu tidak memiliki visibilitas ke mana file dan / atau inode sedang diakses, hanya nomor blok mentah.

$ 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

Ini adalah tambahan baru untuk Kernel Linux dan yang disambut, jadi itu hanya di distro yang lebih baru seperti Ubuntu 12.10. Sistem Fedora 14 saya kurang 8 -).

Ini memberikan akses yang sama yang dapat Anda lalui inotifytanpa harus menargetkan direktori dan / atau file tertentu.

$ 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

Di atas menunjukkan kepada Anda ID proses yang melakukan pengaksesan file dan file mana yang diaksesnya, tetapi tidak memberikan Anda keseluruhan penggunaan bandwidth, sehingga setiap akses tidak dapat dibedakan dengan akses lainnya.

Jadi apa yang harus dilakukan?

The fatracepilihan menunjukkan paling menjanjikan untuk AKHIRNYA menyediakan alat yang dapat menunjukkan penggunaan agregat disk I / O berdasarkan file sedang diakses, daripada proses melakukan pengaksesan tersebut.

Referensi

slm
sumber
6
Bayi yang manis Yesus, slm. Anda seperti bintang rock Unix SE sejauh yang saya ketahui. Jawaban Anda selalu sangat mendidik dan menunjukkan banyak penelitian di satu tempat. Kebanyakan orang (jika mereka mengetahuinya) hanya akan memposting sedikit terakhir tentang fatracedan tidak mengembangkannya banyak melewati itu. Saya benar-benar menghargai bagaimana Anda berusaha lebih keras untuk memastikan orang memahami gambaran lengkap dan berharap saya bisa melakukan lebih dari sekadar mendukung dan memberi hadiah.
Bratchley
@ JoelDavis - terima kasih atas kata-kata Anda yang sangat baik. Saya menyukai ide Anda untuk membuat jawaban kanonik, jadi saya mencoba memulainya di sini. Saya telah mengalami masalah ini berkali-kali juga dan berharap saya memiliki sumber daya seperti ini jadi saya pikir kami akan membuatnya di sini 8-).
slm
Satu hal yang saya bingung: Ketika saya melakukan instalasi yummenarik perpustakaan python3 untuk beberapa alasan. Saya melakukan fileitu dan sepertinya itu adalah executable ELF. lddtidak menunjukkan tautan apa pun ke pythondan juga tidak strings. Ada yang tahu mengapa itu terganggu dengan python3?
Bratchley
1
BTW, rupanya saya harus menunggu beberapa saat setelah menerima jawaban untuk pemberian hadiah. Bukan berarti itu penting bagi seseorang dengan sekitar setengah dari poin jumlah reputasi Unix SE tetapi hanya FYI.
Bratchley
1
Tidak masalah bagi saya, tidak. Saya bisa mendapatkan informasi yang saya butuhkan tentang hal itu melalui telepon iotopdan iostatpanggilan yang sesuai . Juga, saya menemukan hal python, sepertinya (pada Fedora 18 setidaknya) ada "laporan penggunaan daya" pythonskrip jadi yumhanya menanggapi fakta yang pythonada dalam dependensi RPM. Sehingga misteri tertentu terpecahkan.
Bratchley
4

Saya belum mendapatkan jawaban tetapi saya sudah menulis skrip ini (pada akhirnya) dan sepertinya melakukan apa yang saya inginkan. Saya belum mengujinya di sistem lain dan khusus Linux.

Pada dasarnya itu hanya membungkus sekitar strace30 detik, memfilter untuk panggilan sistem terkait file dan berusaha untuk menghapus nama file. Itu menghitung jumlah kemunculan file itu di stracedan menyajikan ringkasan paginasi kepada pengguna. Itu tidak sempurna tetapi jumlah panggilan sistem ke file tertentu mungkin memiliki beberapa korelasi yang lemah dengan berapa banyak I / O itu berkinerja.

Saya belum mengujinya sepenuhnya tetapi jika itu tidak berhasil, itu akan memberi orang tempat untuk memulai. Jika itu disempurnakan lagi, mungkin disarankan untuk menulis ulang ini ke bahasa tingkat yang lebih tinggi seperti python .

Jika saya tidak mendapatkan jawaban dalam waktu seminggu dari cara yang kurang homebrewed untuk melakukan ini (bahkan jika itu alat lain yang hanya menghitung I / O dari proses tertentu) saya akan menerima ini sebagai jawaban saya untuk anak cucu.

Naskah:

#!/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
Bratchley
sumber
2

Anda dapat menggunakan iwatch Menggunakan iWatch

iWatch sangat mudah digunakan, misalkan Anda ingin menonton perubahan pada sistem file / etc, Anda hanya perlu menjalankannya di konsol

$ iwatch /etc

dan iwatch akan memberi tahu Anda jika ada perubahan dalam direktori ini. Dan jika Anda ingin diberitahu per email:

$ iwatch -m [email protected] /etc

Dalam hal ini, admin akan mendapatkan notifikasi email (mungkin Anda dapat menggunakan akun gateway sms Anda, sehingga Anda akan langsung khawatir kapan saja dan di mana saja). Dan jika Anda ingin memonitor banyak direktori perbedaan, Anda dapat menggunakan file konfigurasi. File konfigurasi ini adalah file xml dengan struktur yang mudah dimengerti.

vfbsilva
sumber
1
Saya kira ini menggunakan inotifyapakah itu benar? Saya ragu-ragu untuk menggunakan apa pun berdasarkan inotifykarena Anda harus memberikan jalan (yang pada dasarnya apa yang saya cari) dan saya khawatir pada berapa banyak overhead yang akan terjadi jika saya hanya melakukan semuanya di bawahnya. /Dapatkah ini disaring oleh PID? Saya mungkin bisa mentolerir kelambatan sementara jika itu akan cukup mudah untuk mengekstrak program mana yang melakukannya. Situs web ini juga tidak memiliki contoh output perintah.
Bratchley
1
@ JoelDavis Saya benar-benar tidak yakin. Sejauh yang saya tahu itu mengkonsumsi sejumlah besar RAM maka menjalankannya di bawah "/" akan berbahaya.
vfbsilva