Определение определенного файла, ответственного за высокий ввод-вывод

От FreeBSD tee страница справочника:

DESCRIPTION
 The tee utility copies standard input to standard output, making a copy
 in zero or more files.  The output is unbuffered.

освободивший буфер сигнал, Bash (или Ваша оболочка) перенаправление вывода (> p) вероятно, буферизуется, таким образом вызывая другое поведение.

(Я сожалею, что не могу быть более уверен с этим, но я беру +1 на комментарии как индикаторы для этого являющегося правильной дорожкой...),

37
19.08.2013, 08:34
3 ответа

Существует несколько аспектов к этому вопросу, которые были обращены частично через другие инструменты, но, кажется, нет единственного инструмента, который обеспечивает все функции, которые Вы ищете.

iotop

Это оснащает шоу, какие процессы используют большую часть ввода-вывода. Но это испытывает недостаток в опциях показать определенные имена файлов.

$ 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 делает для процессов, соперничающих в течение времени ЦП, за исключением диска ввод-вывод. Можно подключить его коаксиальным кабелем для предоставления Вам 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

я* инструменты (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 и встречаемому с одобрением, таким образом, это находится только в более новых дистрибутивах, таких как 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

Вышеупомянутые шоу Вы идентификатор процесса, это делает доступ файла и к какому файлу он получает доступ, но он не дает Вам полного использования пропускной способности, таким образом, каждый доступ неразличим к любому другому доступу.

Таким образом, что сделать?

fatrace опция показывает большую часть обещания для того, чтобы НАКОНЕЦ обеспечить инструмент, который может показать Вам совокупное использование диска ввод-вывод на основе файлов, получаемых доступ, а не процессы, делающие доступ.

Ссылки

60
27.01.2020, 19:36
  • 1
    Милый ребенок Jesus, slm. Вы похожи на рок-звезду Unix SE, что касается меня. Вы отвечаете, являются всегда невероятно образовательными и показывают большое исследование все в одном месте. Большинство людей (если бы они знали об этом) просто отправило бы последний бит о fatrace и не разработанное это очень передало это. Я действительно ценю, как Вы прикладываете дополнительные усилия, чтобы удостовериться, что люди понимают полное изображение и жаль, что я не мог сделать больше, чем просто upvote и дать щедрость. –  Bratchley 19.08.2013, 08:22
  • 2
    @JoelDavis - благодарит за Ваши очень любезные слова. Мне понравилась Ваша идея сделать канонический ответ, таким образом, я пытался запустить это здесь. Я столкнулся с этой проблемой много раз также и жаль, что у меня не было ресурса как это так, я полагал, что мы создадим ее здесь 8-). –  slm♦ 19.08.2013, 08:26
  • 3
    Одна вещь я смущен: Когда я сделал установку yum вытянутый в библиотеках python3 по некоторым причинам. Я сделал a file на нем и похоже, что это - исполняемый файл ELF. ldd не показывает ссылок на python и ни один не сделал strings. Какая-либо идея, почему это беспокоилось python3? –  Bratchley 19.08.2013, 08:26
  • 4
    BTW, по-видимому, я должен ожидать некоторое время после принятия, что ответ награждает щедрость. Не то, чтобы это имеет значение для кого-то примерно с половиной точек репутации общего количества Unix SE, но просто к вашему сведению. –  Bratchley 19.08.2013, 08:44
  • 5
    Едва ли проблема для меня, нет. Я могу получить информацию, в которой я нуждаюсь об этом через соответствующее iotop и iostat вызовы. Кроме того, я выяснил вещь Python, она похожа (на Fedora 18, по крайней мере) существует "отчет энергопотребления" python сценарий так yum просто отвечал на факт это python находится в зависимостях об/мин. Так, чтобы конкретная тайна была решена. –  Bratchley 19.08.2013, 08:50

Я еще не получил ответ, но я действительно писал этот сценарий (в конце), и это, кажется, делает то, что я хочу. Я не протестировал его в других системах, и это является определенным для Linux.

В основном это просто повторяется strace в течение 30 секунд, фильтрующих для связанных с файлом системных вызовов и, прилагает усилие для разделения имени файла. Это считает количество случаев того файла в strace и представляет нумеровавшую страницы сводку пользователю. Это не прекрасно, но количество системных вызовов конкретного файла может иметь некоторую слабую корреляцию к тому, сколько ввода-вывода это выполняет.

Я не протестировал его полностью, но если это не работает из поля, это должно дать людям место для запуска с. Если это больше излагается в деталях, может быть желательно переписать это на высокоуровневый язык как Python.

Если я не получу ответ в течение недели после меньшего количества homebrewed способа сделать это (даже если это будет другой инструмент, который просто считает ввод-вывод конкретного процесса), то я приму это как свой ответ для потомства.

Сценарий:

#!/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
5
27.01.2020, 19:36

Можно использовать iwatch Используя iWatch

iWatch очень прост в использовании, предположите, что Вы хотите наблюдать изменение в / и т.д. файловая система, просто необходимо выполнить его в консоли

$ iwatch /etc

и iwatch скажет Вам, если что-то изменится в этом каталоге. И если Вы хотите быть уведомленными на электронную почту:

$ iwatch -m admin@smsgw.local /etc

В этом случае администратор получит уведомление по электронной почте (возможно, можно использовать учетную запись шлюза SMS, таким образом, Вы будете сразу предупреждены в любое время и где угодно). И если Вы хотите контролировать много каталогов различия, можно использовать конфигурационный файл. Этот конфигурационный файл является XML-файлом с легкой понятной структурой.

2
27.01.2020, 19:36
  • 1
    , я предполагаю это, использует inotify это корректно? Я не решился использовать что-либо на основе inotify так как необходимо дать ему пути (который является по существу, что я ищу), и я волновался в сколько наверху было бы то, если бы я просто сделал все внизу / Это может отфильтровать PID? Я смог терпеть временное замедление, если будет достаточно легким извлечь, какая программа делает его. Веб-сайт также не имеет никакого вывода команды в качестве примера. –  Bratchley 15.08.2013, 17:40
  • 2
    @JoelDavis я действительно не уверен. Насколько я знаю, что это использует огромную сумму RAM, следовательно выполняющей его под "/", будет опасно. –  vfbsilva 15.08.2013, 17:46

Теги

Похожие вопросы