Визначення конкретного файлу, відповідального за високий вхід / вивід


37

Це проста проблема, але вперше мені довелося фактично її виправити: знайти, які конкретні файли / вставки є цілями найбільшого вводу / виводу. Я хотів би отримати загальний огляд системи, але якщо мені доведеться дати PID або TID, я з цим добре.

Мені хотілося б піти, не роблячи straceпрограму, що вискакує iotop. Переважно, використовуючи інструмент у тій же самій iotopформі, як і той, який розбивається на файл. Я можу використовувати, lsofщоб побачити, які файли відкрив пошта, але він не вказує, який файл отримує введення / вивід або скільки.

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

Зараз у мене є специфічна проблема, коли знімки LVM заповнюються занадто швидко. З тих пір я вирішив проблему, але хотів би мати можливість її виправити таким чином, а не просто робити lsвсі дескриптори відкритих файлів, /proc/<pid>/fdщоб побачити, який із них швидко зростає.


можливо, пов’язані: unix.stackexchange.com/questions/9520/…
slm

Так, я цього раніше не бачив, але більшість відповідей на це питання були в основному такими: "Ну, якщо ви робите щось неймовірно специфічним способом і робите щось дивне, ви можете мати грубую ідею" проти того, що безпосередньо вирішує проблема, не вимагаючи, щоб адміністратор надто фантазував. Я не маю на увазі критикувати інших, і зараз я розумію, що складність цієї проблеми, мабуть, пропонується таким рішенням, але, здається, навіть якщо не існує такого інструменту, як fatraceстаріший, щось подібне до сценарію, який я написав, повинен були запропоновані, оскільки вони широко використовуються.
Братчлі

Щоб було зрозуміло: я не критикую інших, хто пропонував допомогу. Допомога завжди краща, ніж ніяка допомога. Це просто засмучує, коли ви відчуваєте, що проблема повинна мати пряму відповідь вперед, і все, що ви можете самі зрозуміти, або побачити інших, які говорять про те, що це - невдалі способи вирішення чи дуже ручні процеси (наприклад, те, що я в кінцевому підсумку займався проблемою моєї пошти).
Братчлі

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

Більша частина допомоги є надзвичайно націленою, що може трохи дратувати, оскільки, відповідаючи, ви багато разів повторюєте те саме, по-різному. Але така природа сайтів SE. Я не знаю, як це робить Джилз. Мені подобається, що ці довші форми запитань краще
slm

Відповіді:


60

Є кілька аспектів цього питання, які частково були вирішені за допомогою інших інструментів, але, здається, не існує жодного інструменту, який надає всі функції, які ви шукаєте.

іотоп

Цей інструмент показує, які процеси споживають найбільше вводу / виводу. Але не вистачає варіантів показу конкретних імен файлів.

$ 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

i * інструменти (прищеплювати, спостерігати тощо)

Ці інструменти забезпечують доступ до подій доступу до файлів, однак їх потрібно спеціально орієнтувати на конкретні каталоги чи файли. Таким чином, вони не так корисні, коли намагаєтеся відслідковувати несанкціонований доступ до файлів невідомим процесом при налагодженні проблем з продуктивністю.

Крім того, inotifyфреймворк не містить деталей про файли, до яких можна отримати доступ. Тільки тип доступу, тому інформація про кількість даних, що переміщуються вперед і назад, не доступна за допомогою цих інструментів.

іостат

Показує загальну продуктивність (читає і записує) на основі доступу до певного пристрою (жорсткого диска) або розділу. Але не дає зрозуміти, які файли генерують цей доступ.

$ 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%)

фетрас

Це нове доповнення до ядра 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
Милий дитина Ісусе, слм. Ти, як я, як рок-зірка Unix SE. Ви відповіді завжди неймовірно навчальні і показуєте багато досліджень в одному місці. Більшість людей (якби вони про це знали) тільки-но опублікували останній шматочок fatraceі не розробили його, і це значно перейшло. Я дуже вдячний, як ви пройдете додаткову милю, щоб переконатися, що люди зрозуміли повну картину, і хотілося б, щоб я міг зробити більше, ніж просто проголосувати та дати винагороду.
Братчлі

@JoelDavis - дякую за дуже добрі слова. Мені сподобалася ваша ідея зробити канонічну відповідь, тому я намагався почати це тут. Я також багато разів стикався з цією проблемою і хотів, щоб у мене був такий ресурс, тому я зрозумів, що ми створимо його тут 8-).
slm

Мене бентежить одне: коли я встановив yumчомусь у бібліотеках python3. Я зробив це fileна ньому, і схоже, це виконаний ELF. lddне показує жодних посилань на, pythonа також ні strings. Будь-яка ідея, чому це турбує python3?
Братчлі

1
До речі, я маю зачекати деякий час після прийняття відповіді про нагороду. Мало того, що це важливо для когось із приблизно половиною сумарної репутації Unix SE, але лише з виправданням.
Братчлі

1
Насправді для мене це не проблема. Я можу отримати необхідну інформацію про це через відповідні дзвінки iotopта iostatдзвінки. Крім того, я зрозумів, що це за python, схоже, що (як мінімум, у Fedora 18) є pythonсценарій "power-use-report", тому 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 Im дійсно не впевнений. Наскільки я знаю, вона споживає величезну кількість оперативної пам’яті, тому запуск її під «/» буде небезпечним.
vfbsilva
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.