Xác định tệp cụ thể chịu trách nhiệm cho I / O cao


37

Đây là một vấn đề đơn giản nhưng lần đầu tiên tôi phải thực sự khắc phục nó: tìm tập tin / nút cụ thể nào là mục tiêu của nhiều I / O nhất. Tôi muốn có thể có được một cái nhìn tổng quan về hệ thống, nhưng nếu tôi phải cung cấp cho một PID hoặc TID thì tôi không sao với điều đó.

Tôi muốn đi mà không phải thực hiện một stracechương trình bật lên iotop. Tốt hơn là, sử dụng một công cụ trong cùng một tĩnh iotopnhưng một công cụ ghi thành từng mục. Tôi có thể sử dụng lsofđể xem tập tin mailman nào đã mở nhưng nó không cho biết tập tin nào đang nhận I / O hoặc bao nhiêu.

Tôi đã thấy ở những nơi khác được đề xuất sử dụng auditdnhưng tôi không muốn làm điều đó vì nó sẽ đưa thông tin vào các tệp kiểm toán của chúng tôi, chúng tôi sử dụng cho các mục đích khác và đây có vẻ như là một vấn đề tôi phải nghiên cứu theo cách này

Vấn đề cụ thể tôi có ngay bây giờ là với ảnh chụp nhanh LVM quá nhanh. Kể từ đó, tôi đã giải quyết vấn đề nhưng muốn có thể khắc phục theo cách này thay vì chỉ thực hiện lstrên tất cả các mô tả tệp đang mở /proc/<pid>/fdđể xem cái nào đang phát triển nhanh nhất.



Vâng, tôi đã không thấy câu hỏi đó trước đây nhưng hầu hết các câu trả lời cho câu hỏi này về cơ bản là như thế: "Chà nếu bạn làm mọi thứ theo cách cực kỳ cụ thể này, và làm điều gì đó kỳ lạ, bạn có thể có một ý tưởng sơ bộ" so với điều gì đó trực tiếp giải quyết vấn đề mà không yêu cầu quản trị viên nhận được quá ưa thích. Tôi không có ý chỉ trích người khác và tôi nhận ra rằng khó khăn của vấn đề này có lẽ là cách đưa ra các giải pháp như vậy, nhưng có vẻ như ngay cả khi không có một công cụ nào như fatracecũ hơn, mà một thứ như kịch bản tôi đã viết nên đã được cung cấp kể từ khi nó có thể sử dụng rộng rãi hơn.
Bratchley

Nói rõ hơn: Tôi không chỉ trích những người khác đã đề nghị giúp đỡ. Giúp đỡ luôn luôn tốt hơn là không giúp đỡ. Thật là bực bội khi bạn cảm thấy vấn đề cần có phản hồi thẳng thắn và tất cả những gì bạn có thể tự mình tìm ra hoặc thấy những người khác đề xuất là cách giải quyết khác hoặc các quy trình rất thủ công (chẳng hạn như những gì tôi đã làm với vấn đề người đưa thư của tôi).
Bratchley

Vâng, tôi luôn luôn ngạc nhiên khi tôi tìm thấy câu trả lời cho câu hỏi mới của Q ở đây trong trang web không hiển thị cho đến khi tôi đào được một lúc. Có vẻ như đôi khi bị hỏng ở đó 8-). Do đó, tại sao nên hỏi cùng một cách Q và liên kết nó với những cách cũ hơn khi chúng được chuyển đi. Đồng ý kịch bản của bạn là một cách tiếp cận tốt hơn, tôi vẫn ngạc nhiên rằng không có một công cụ mục đích chung nào thực hiện những gì bạn yêu cầu. Có vẻ như một khoảng cách lớn trong Unix.
slm

Hầu hết các trợ giúp chỉ là cực kỳ nhắm mục tiêu có thể gây ra một chút khó chịu, vì khi trả lời bạn đang nói điều tương tự rất nhiều lần theo nhiều cách khác nhau. Nhưng đó là bản chất của các trang SE. Tôi không biết làm thế nào Gilles làm điều đó. Tôi thích những câu hỏi dài hơn này.
slm

Câu trả lời:


60

Có một số khía cạnh cho câu hỏi này đã được giải quyết một phần thông qua các công cụ khác, nhưng dường như không có một công cụ nào cung cấp tất cả các tính năng bạn đang tìm kiếm.

iotop

Công cụ này cho thấy các quá trình đang tiêu thụ nhiều I / O nhất. Nhưng nó thiếu các tùy chọn để hiển thị tên tệp cụ thể.

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

Theo mặc định, nó thực hiện những gì thường xuyên topđối với các quá trình ganh đua thời gian của CPU, ngoại trừ I / O đĩa. Bạn có thể dỗ nó để cung cấp cho bạn chế độ xem 30.000 feet bằng cách sử dụng công -atắc để nó hiển thị tích lũy theo quy trình, theo thời gian.

$ 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 * công cụ (inotify, iwatch, v.v.)

Các công cụ này cung cấp quyền truy cập vào các sự kiện truy cập tệp, tuy nhiên chúng cần được nhắm mục tiêu cụ thể đến các thư mục hoặc tệp cụ thể. Vì vậy, chúng không hữu ích khi cố gắng theo dõi truy cập tệp giả mạo bằng một quy trình không xác định, khi gỡ lỗi các vấn đề về hiệu suất.

Ngoài ra inotifykhung không cung cấp bất kỳ chi tiết nào về các tệp được truy cập. Chỉ có loại quyền truy cập, vì vậy không có thông tin nào về lượng dữ liệu được di chuyển qua lại có sẵn, sử dụng các công cụ này.

i điều hòa

Hiển thị hiệu suất tổng thể (đọc & ghi) dựa trên quyền truy cập vào một thiết bị nhất định (ổ cứng) hoặc phân vùng. Nhưng không cung cấp bất kỳ cái nhìn sâu sắc nào về các tập tin đang tạo ra các truy cập này.

$ 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

Tùy chọn này là mức quá thấp. Nó thiếu khả năng hiển thị các tập tin và / hoặc inodes đang được truy cập, chỉ là số khối thô.

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

béo

Đây là một bổ sung mới cho Linux Kernel và được hoan nghênh, vì vậy nó chỉ có trong các bản phát hành mới hơn như Ubuntu 12.10. Hệ thống Fedora 14 của tôi đã thiếu nó 8-).

Nó cung cấp cùng một quyền truy cập mà bạn có thể có được thông qua inotifymà không phải nhắm mục tiêu một thư mục và / hoặc tệp cụ thể.

$ 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

Ở trên cho bạn thấy ID tiến trình đang thực hiện truy cập tệp và tệp nào đang truy cập, nhưng nó không cung cấp cho bạn bất kỳ mức sử dụng băng thông chung nào, vì vậy mỗi quyền truy cập không thể phân biệt với bất kỳ quyền truy cập nào khác.

Vậy lam gi?

Các fatracetùy chọn chương trình hứa hẹn nhất cho cuôi cung cấp một công cụ có thể cho bạn sử dụng tổng hợp của đĩa I / O dựa trên các tập tin được truy cập, chứ không phải là quá trình làm việc truy cập.

Tài liệu tham khảo


6
Chúa Giêsu bé bỏng, slm. Bạn giống như ngôi sao nhạc rock của Unix SE theo như tôi nghĩ. Bạn trả lời luôn vô cùng giáo dục và hiển thị rất nhiều nghiên cứu tất cả ở một nơi. Hầu hết mọi người (nếu họ biết về nó) sẽ chỉ đăng những gì cuối cùng về fatracevà không phát triển nó đã vượt qua điều đó. Tôi thực sự đánh giá cao cách bạn đi xa hơn để đảm bảo mọi người hiểu được bức tranh hoàn chỉnh và ước tôi có thể làm được nhiều hơn là chỉ nâng cấp và đưa tiền thưởng.
Bratchley

@JoelDavis - cảm ơn vì những lời rất tử tế của bạn. Tôi thích ý tưởng của bạn về việc đưa ra một câu trả lời kinh điển vì vậy tôi đã cố gắng bắt đầu điều đó ở đây. Tôi đã gặp phải vấn đề này nhiều lần và ước gì tôi có một tài nguyên như thế này vì vậy tôi nghĩ rằng chúng tôi sẽ tạo ra nó ở đây 8-).
slm

Một điều tôi bối rối: Khi tôi thực hiện cài đặt yumđã kéo các thư viện của python3 vì một số lý do. Tôi đã làm fileđiều đó và có vẻ như đó là một thực thi ELF. lddkhông hiển thị bất kỳ liên kết đến pythonvà không làm strings. Bất cứ ý tưởng tại sao nó bận tâm với python3?
Bratchley

1
BTW, rõ ràng tôi phải đợi một thời gian sau khi chấp nhận câu trả lời để nhận tiền thưởng. Không phải là vấn đề với ai đó có khoảng một nửa số điểm danh tiếng tổng hợp của Unix SE mà chỉ là một FYI.
Bratchley

1
Không thực sự là một vấn đề đối với tôi, không. Tôi có thể nhận được thông tin tôi cần về điều đó thông qua các cuộc gọi iotopiostatcuộc gọi phù hợp . Ngoài ra, tôi đã tìm ra điều trăn, có vẻ như (ít nhất là trên Fedora 18) có một pythonkịch bản "báo cáo sử dụng năng lượng" nên yumđã phản ứng với thực tế pythonlà phụ thuộc vào RPM. Vì vậy, bí ẩn đặc biệt được giải quyết.
Bratchley

4

Tôi chưa nhận được câu trả lời nhưng tôi đã viết kịch bản này (ở cuối) và nó dường như làm những gì tôi muốn. Tôi chưa thử nghiệm nó trên các hệ thống khác và nó dành riêng cho Linux.

Về cơ bản, nó chỉ gói gọn stracetrong 30 giây, lọc các cuộc gọi hệ thống liên quan đến tệp và nỗ lực loại bỏ tên tệp. Nó đếm số lần xuất hiện của tập tin đó trong stracevà trình bày tóm tắt phân trang cho người dùng. Nó không hoàn hảo nhưng số lượng cuộc gọi hệ thống đến một tệp cụ thể có thể có một số tương quan yếu với mức độ hoạt động của I / O.

Tôi đã không kiểm tra nó đầy đủ nhưng nếu nó không hoạt động, nó sẽ cung cấp cho mọi người một nơi để bắt đầu. Nếu nó được bổ sung thêm nữa, có thể nên viết lại nó thành ngôn ngữ cấp cao hơn như python .

Nếu tôi không nhận được câu trả lời trong vòng một tuần về cách làm việc ít bị mắc kẹt này (ngay cả khi đó là một công cụ khác chỉ tính I / O của một quy trình cụ thể) tôi sẽ chấp nhận đây là câu trả lời của tôi cho hậu thế.

Kịch bản:

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

Bạn có thể sử dụng iwatch bằng iWatch

iWatch rất đơn giản để sử dụng, giả sử bạn muốn xem sự thay đổi trong hệ thống tập tin / etc, bạn chỉ cần chạy nó trong bảng điều khiển

$ iwatch /etc

và iwatch sẽ cho bạn biết nếu có gì đó thay đổi trong thư mục này. Và nếu bạn muốn được thông báo cho mỗi email:

$ iwatch -m admin@smsgw.local /etc

Trong trường hợp này, quản trị viên sẽ nhận được thông báo qua email (có thể bạn có thể sử dụng tài khoản cổng sms của mình, vì vậy bạn sẽ được báo động ngay lập tức mọi lúc mọi nơi). Và nếu bạn muốn theo dõi nhiều thư mục khác nhau, bạn có thể sử dụng tệp cấu hình. Tệp cấu hình này là một tệp xml có cấu trúc dễ hiểu.


1
Tôi cho rằng điều này đang sử dụng inotifylà đúng? Tôi đã do dự khi sử dụng bất cứ thứ gì dựa trên inotifyvì bạn phải cung cấp cho nó các đường dẫn (mà về cơ bản là thứ tôi đang tìm kiếm) và tôi đã lo lắng về việc sẽ có bao nhiêu chi phí nếu tôi chỉ làm mọi thứ bên dưới /Bộ lọc này có thể được lọc bởi PID không? Tôi có thể chịu đựng được sự chậm chạp tạm thời nếu nó đủ dễ để trích xuất chương trình nào đang thực hiện. Trang web cũng không có bất kỳ đầu ra lệnh ví dụ.
Bratchley

1
@JoelDavis Tôi thực sự không chắc chắn. Theo như tôi biết, nó tiêu tốn một lượng lớn RAM do đó chạy nó dưới "/" sẽ rất nguy hiểm.
vfbsilva
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.