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


37

Это простая проблема, но впервые мне когда-либо пришлось ее исправлять: найти, какие именно файлы / иноды являются объектами большинства операций ввода-вывода. Я бы хотел получить общий обзор системы, но если мне нужно дать PID или TID, я согласен с этим.

Я хотел бы пойти без необходимости straceв программе, которая появляется в iotop. Предпочтительно использовать инструмент в том же духе, что и инструмент, iotopкоторый разбит по файлам. Я могу использовать, lsofчтобы увидеть, какие файлы почтальон открыл, но это не указывает, какой файл получает ввод-вывод или сколько.

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

Конкретная проблема, с которой я столкнулся сейчас, заключается в слишком быстром заполнении снимков LVM. С тех пор я решил проблему, но хотел бы иметь возможность исправить ее таким образом, вместо того, чтобы просто использовать lsвсе дескрипторы открытых файлов, /proc/<pid>/fdчтобы увидеть, какой из них растет быстрее всего.


возможно , связано: unix.stackexchange.com/questions/9520/...
ОДС

Да, я раньше такого не видел, но большинство ответов на этот вопрос были в основном такими: «Ну, если вы делаете вещи таким невероятным образом, и делаете что-то странное, вы можете иметь грубое представление», а не то, что напрямую решает проблема, не требуя, чтобы администратор стал слишком причудливым. Я не хочу критиковать других, и теперь я понимаю, что сложность этой проблемы, вероятно, заключается в том, что такие решения были предложены, но кажется, что даже если нет такого инструмента, как fatraceболее старый, что-то вроде сценария, который я написал, должно были предложены, так как он более широко используется.
Братчли

Просто чтобы прояснить: я не критикую других, кто предлагал помощь. Помощь всегда лучше, чем никакой помощи. Это просто расстраивает, когда вы чувствуете, что проблема должна иметь прямой ответ, и все, что вы можете выяснить самостоятельно или увидеть, как другие предлагают, это либо грязные обходные пути, либо очень ручные процессы (например, то, что я в итоге сделал с моей проблемой почтальона).
Братчли

Да, я всегда поражаюсь, когда нахожу здесь ответы на новые Q, которые не появляются, пока я не копаюсь некоторое время. Похоже, что-то сломано там 8-). Следовательно, почему хорошо спросить один и тот же Q несколькими способами и связать его со старыми, когда они вышли из строя. Согласитесь, ваш сценарий - лучший подход, я все еще удивлен, что нет универсального инструмента, который бы выполнял то, что вы просите. Похоже, большой разрыв в Unix.
SLM

Большая часть помощи просто чрезвычайно адресна, что может немного раздражать, поскольку, отвечая, вы повторяете одно и то же много раз по-разному. Но это природа сайтов SE. Я не знаю, как Жиль это делает. Мне больше нравятся эти длинные вопросы и ответы.
SLM

Ответы:


60

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

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

Эта опция слишком низкого уровня. Ему не хватает представления о том, какие файлы и / или узлы доступны, просто необработанные номера блоков.

$ 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параметр наиболее перспективен для ПОЛНОСТЬЮ предоставления инструмента, который может показать совокупное использование дискового ввода-вывода в зависимости от файлов, к которым осуществляется доступ, а не от процессов, осуществляющих доступ.

Ссылки


6
Милый ребенок Иисус, slm. Вы, как рок-звезда Unix SE, насколько я понимаю. Ваши ответы всегда невероятно образовательны и показывают много исследований в одном месте. Большинство людей (если бы они знали об этом) просто бы опубликовали последнюю информацию о ней, fatraceа не разработали ее, но многое пропустили. Я действительно ценю то, как вы делаете все возможное, чтобы люди понимали полную картину и хотели, чтобы я мог сделать больше, чем просто повысить голосование и дать щедрость.
Братчли

@JoelDavis - спасибо за твои очень добрые слова. Мне понравилась ваша идея сделать канонический ответ, поэтому я пытался начать это здесь. Я много раз сталкивался с этой проблемой и хотел, чтобы у меня был такой ресурс, поэтому я решил, что мы создадим его здесь 8-).
SLM

Одна вещь, в которой я запутался: когда я сделал установку yum, по какой-то причине потянуло в библиотеки python3. Я сделал fileна нем, и похоже, что это исполняемый файл ELF. lddне показывает ссылки на pythonи не сделал strings. Любая идея, почему это беспокоило Python3?
Братчли

1
Кстати, по-видимому, я должен подождать некоторое время после принятия ответа на награду. Не то, чтобы это имело значение для кого-то с примерно половиной очков репутации совокупного количества Unix SE, но только для вас.
Братчли

1
Для меня это не проблема, нет. Я могу получить необходимую информацию об этом через соответствующие iotopи iostatзвонки. Кроме того, я разобрался с Python, похоже, (по крайней мере, на Fedora 18) есть pythonсценарий «отчет об использовании мощности», поэтому yumон просто отвечал на тот факт, что pythonв зависимостях RPM. Так что эта конкретная тайна разгадана.
Братчли

4

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

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

Я не проверил его полностью, но если он не работает «из коробки», он должен дать людям возможность начать. Если это станет более понятным, может быть целесообразно переписать это на язык более высокого уровня, такой как python .

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

Автор сценария:

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

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

$ iwatch -m admin@smsgw.local /etc

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


1
Я полагаю, это использует inotifyэто правильно? Я не решался использовать что-либо на основе, inotifyтак как вы должны указать ему пути (что, по сути, я и ищу), и я беспокоился о том, сколько будет накладных расходов, если я просто сделаю все под ним. /Может ли этот фильтр фильтровать по PID? Я мог бы терпеть временную медлительность, если будет достаточно легко определить, какая программа это делает. На сайте также нет примера вывода команды.
Братчли

1
@JoelDavis Я действительно не уверен. Насколько я знаю, он потребляет огромное количество оперативной памяти, поэтому запускать его под "/" будет опасно.
vfbsilva
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.