Yüksek Giriş / Çıkışlardan Sorumlu Belirli Dosyaların Belirlenmesi


37

Bu basit bir sorundur, ancak ilk defa düzeltmem gerekti: hangi belirli dosyaların / inode'ların en fazla G / Ç'nin hedefi olduğunu bulmak. Genel bir sisteme genel bakış elde etmek isterim, ancak bir PID veya TID vermek zorunda kalırsam, tamam.

straceAçılan programa katılmak zorunda kalmadan gitmek istiyorum iotop. Tercihen, aynı damarda, iotopancak dosya yoluyla gösterilen bir alet kullanarak . lsofHangi postacının hangi dosyaları açtığını görmek için kullanabilirim , ancak hangi dosyanın I / O aldığını veya ne kadarını aldığını göstermez.

Kullanılması önerildiği başka bir yerde gördüm, auditdancak bilgiyi başka amaçlar için kullandığımız denetim dosyalarımıza koyacağından bunu yapmamayı tercih ediyorum ve bu araştırma yapmam gereken bir konu gibi görünüyor. Böylece.

Şu anki sorunum LVM anlık görüntülerinin çok hızlı bir şekilde dolması ile ilgili. O zamandan beri sorunu çözdüm ancak hangisinin en hızlı şekilde büyüdüğünü görmek lsiçin tüm açık dosya tanımlayıcıları üzerinde çalışmak yerine, bu şekilde bu sorunu çözmeyi istiyorum /proc/<pid>/fd.



Evet, bunu daha önce görmemiştim, ancak bu sorunun cevaplarının çoğu temelde şuydu: "Peki, eğer bu inanılmaz özel bir şey yaparsanız ve tuhaf bir şey yaparsanız, doğrudan çözen bir şeye sahipseniz" Yönetici çok süslü olsun gerektirmeden sorun. Başkalarını eleştirmek istemem ve şimdi bu sorunun zorluğunun muhtemelen bu tür çözümler önerildiğinin farkındayım, fatraceancak daha eski gibi bir araç olmasa bile yazdığım senaryo gibi bir şey olmalı daha yaygın olarak kullanıldığından beri teklif edildi.
Bratchley

Sadece açık olmak gerekirse: Yardım sunan diğerlerini eleştirmiyorum. Yardım her zaman yardımdan daha iyidir. Sorunun doğrudan bir yanıt vermesi gerektiğini düşündüğünüzde sinir bozucu bir durumdur ve kendinizi çözebileceğiniz ya da başkalarını öneren görebileceğiniz tek şey ya çok geçici çözümler ya da çok manuel süreçlerdir (örneğin postacı sorunumla ne yaptıysam).
Bratchley

Evet, burada bir süre kazana kadar görünmeyen sitedeki gömülü yeni Q'ların cevaplarını bulduğumda hep şaşırıyorum. Orada kırılmış bir şey gibi görünüyor 8-). Bu nedenle, aynı Q çoklu yolunu sormanın ve yönlendirildikleri gibi eskilerine bağlamanın neden iyi olduğu. Senaryonuzun daha iyi bir yaklaşım olduğunu kabul ettim, hala istediğiniz şeyi yapan genel bir amaç aracı olmadığına şaşırdım. Unix'te büyük bir boşluk gibi görünüyor.
slm

Yardımın çoğu, biraz can sıkıcı olabilecek son derece hedeftir, çünkü cevap verirken aynı şeyi defalarca farklı şekillerde söylediğinizi söylersiniz. Ancak bu SE sitelerinin doğasıdır. Gilles nasıl yapar bilmiyorum. Bu daha uzun Q & A formunu daha çok seviyorum.
slm

Yanıtlar:


59

Bu soruya kısmen başka araçlar aracılığıyla değinilen birkaç yön var, ancak aradığınız tüm özellikleri sağlayan tek bir araç görünmüyor.

iotop

Bu araçlar, hangi işlemlerin en fazla G / Ç kullandığını gösterir. Ancak, belirli dosya adlarını gösterme seçenekleri yoktur.

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

Varsayılan olarak, topdisk G / Ç hariç, CPU süresi için çalışan işlemler için düzenli olanları yapar. -aDüğmeyi kullanarak 30.000 ayak görünümü elde etmek için zamana göre bir birikim gösterecek şekilde koaksiyel olarak kullanabilirsiniz .

$ 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 * araçlar (inotify, iwatch, vs.)

Bu araçlar dosya erişim olaylarına erişim sağlar, ancak belirli dizinlere veya dosyalara özel olarak yönelik olmaları gerekir. Bu nedenle, performans sorunlarını ayıklarken, sahte bir dosya erişimini bilinmeyen bir işlemle izlemeye çalışırken bu işe yaramazlar.

Ayrıca, inotifyçerçeve erişilen dosyalar hakkında herhangi bir ayrıntı sağlamaz. Yalnızca erişim türü, bu araçlar kullanılarak ileri ve geri taşınan veri miktarı hakkında bilgi bulunmuyor.

iostat

Belirli bir aygıta (sabit sürücü) veya bölüme erişimi temel alarak genel performansı gösterir (okuma ve yazma). Ancak, dosyaların bu erişimleri sağladığı hakkında bir fikir vermez.

$ 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

Bu seçenek çok düşük seviyede. Hangi ham dosyalara ve / veya inode'lara erişildiğine dair görünürlükten yoksundur, sadece ham blok sayılarıdır.

$ 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

Bu, Linux Çekirdeğine yeni bir ektir ve memnuniyetle karşılanır, bu yüzden sadece Ubuntu 12.10 gibi yeni dağıtımlarda. Fedora 14 sistemimde 8- yoktu.

inotifyBelirli bir dizini ve / veya dosyaları hedeflemenize gerek kalmadan erişebileceğiniz aynı erişimi sağlar.

$ 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

Yukarıdakiler, dosya erişimini yapan ve hangi dosyaya eriştiğini gösteren işlem kimliğini gösterir, ancak genel bant genişliği kullanımı sağlamaz, bu nedenle her erişim başka bir erişim için ayırt edilemez.

Peki ne yapmalı?

Bu fatraceseçenek, SONUÇ olarak , erişen işlemleri yerine, erişilen dosyalara dayalı olarak disk G / Ç kullanımını toplam kullanımını gösteren bir araç sağlama konusunda en büyük sözü gösterir .

Referanslar


6
Tatlı bebek İsa, slm. İlgilendiğim kadarıyla Unix SE'nin rock yıldızı gibisin. Cevaplar her zaman inanılmaz derecede eğitici ve tek bir yerde çok fazla araştırma gösteriyorsunuz. Çoğu kişi (bilselerdi) son hakkında biraz fatraceşey yayınlarlardı ve onu geliştirmezlerdi. İnsanların tüm resmi anlamalarını ve keşke sadece abartmadan ve ödül vermekten daha fazlasını yapabilmeyi diliyorum.
Bratchley

@JoelDavis - Çok nazik sözlerin için teşekkürler. Kanonik bir cevap verme fikrini beğenmiştim, bu yüzden buradan başlamaya çalışıyordum. Bu soruna da birçok kez rastladım ve bunun gibi bir kaynağım olmasını diledim, bu yüzden burada yaratacağımızı düşündüm.
slm

yumKafamı karıştırdığım bir şey: Bir kere yaptığım zaman, kurulum python3'ün kütüphanelerine çekildi. fileÜzerinde bir yaptım ve bir ELF çalıştırılabilir gibi görünüyor. lddhiçbir bağlantı göstermedi pythonve göstermedi strings. Python3 ile neden uğraştığı hakkında bir fikrin var mı?
Bratchley

1
BTW, görünüşe göre ödül ödülünün cevabını kabul ettikten sonra biraz beklemeliyim. Unix SE'nin toplam tutar itibari puanlarının kabaca yarısı olan ama sadece bir FYI olan biri için önemli değil.
Bratchley

1
Gerçekten benim için bir sorun değil, hayır. Bununla ilgili ihtiyacım olan bilgiyi uygun aramalar iotopve iostatçağrılar yoluyla alabilirim . Ayrıca, python meselesini anladım, öyle görünüyor ki (en azından Fedora 18'de) bir "güç kullanım raporu" pythonyazısı vardı, bu yüzden yumsadece RPM'nin pythonbağımlılıklarına cevap veriyordu. Böylece bu gizem çözüldü.
Bratchley

4

Henüz bir cevap alamadım ancak bu senaryoyu yazdım (sonunda) ve istediğimi yapıyor gibi görünüyor. Diğer sistemlerde test etmedim ve Linux'a özel.

Temelde sadece strace30 saniye boyunca sarar , dosya bağlantılı sistem çağrıları için filtreleme yapar ve dosya adını çıkarmak için çaba gösterir. Bu dosyanın oluşum sayısını sayar straceve kullanıcıya sayfalara ayrılmış bir özet sunar. Mükemmel değil, ancak belirli bir dosyaya yapılan çağrıların sayısı, ne kadar G / Ç gerçekleştirdiği ile zayıf bir korelasyon gösterebilir.

Tamamen test etmedim, ancak kutudan kalkmazsa, insanlara başlangıç ​​için bir yer vermelidir. Daha fazla kızarırsa, bunu python gibi daha yüksek bir dilde tekrar yazmanız önerilir .

Bunu yapmadan daha az evsiz bir yöntemle bir hafta içinde bir cevap alamazsam (belirli bir işlemin G / Ç'sini sayan başka bir araç olsa bile) bunu gelecek vaad eden yanıtım olarak kabul edeceğim.

Senaryo:

#!/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

İwatch kullanabilirsiniz iWatch kullanarak

iWatch'in kullanımı çok basittir, varsa / etc dosya sistemindeki değişiklikleri izlemek istediğinizi varsayalım.

$ iwatch /etc

ve iwatch bu dizinde bir değişiklik olup olmadığını size söyleyecektir. Ve e-posta başına bildirilmek istiyorsanız:

$ iwatch -m admin@smsgw.local /etc

Bu durumda, yönetici e-posta bildirimi alır (belki de sms gateway hesabınızı kullanabilirsiniz, bu yüzden hemen ve istediğiniz yerde hemen alarm alırsınız). Ve birçok fark dizinini izlemek istiyorsanız, bir yapılandırma dosyası kullanabilirsiniz. Bu yapılandırma dosyası, kolay anlaşılabilir bir yapıya sahip bir xml dosyasıdır.


1
Sanırım bu kullanıyor inotifymu, doğru mu? Ben dayalı kullanım şey için kararsız olduğunu inotifybunu (aslında aradığım ne) yolları vermek zorunda beri ve ben sadece altına herşeyi yaptım eğer havai olacağını ne kadar endişeli edildi /PID bu filtre Can? Hangi programı yaptığını çıkarmak yeterince kolay olacaksa geçici yavaşlığa tahammül edebilirim. Web sitesinde ayrıca örnek komut çıktısı yoktur.
Bratchley

1
@JoelDavis Gerçekten emin değilim. Bildiğim kadarıyla büyük miktarda RAM tüketiyor, bu nedenle "/" altında çalıştırmak tehlikeli olacak.
vfbsilva
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.