ファイルシステムへの現在の読み書きを要求時にどのように印刷できますか?

ファイルシステムへの現在の読み書きを要求時にどのように印刷できますか?

ファイルシステムの読み取りと書き込み、特にNFSマウントに関する統計を取得することに興味があります。

たとえば、多くのツールがあることを知っていますが、iostatすべてのnfsstatプログラムinotifywaitに問題があります。

階層の複雑さのため、ファイルシステムを参照したり、ファイル名を明示的に言及したりする必要があるものは使用できません。

必要に応じて次のことができるプログラムはありますか?

  1. 読み取り/書き込み表示
  2. 読み書きパスの表示
  3. バイト数表示

オンデマンドとは実行時間を意味します。ポイント(3)は必須ではありません。

たとえば、私は次のことができるようにしたいと思います。

$ magicIOprogram
read, 512, /path/to/file1
read, 256, /path/to/file2
write, 15, /path/to/file3
write, 10562, /path/to/file4

私が知らない上記のツールを使用してこの情報を取得する方法がある場合は、それも十分な解決策になります。

答え1

試してみたいかもしれませんシステム蛇口

ここで少し修正してくださいはい100ミリ秒ごとに開く、読み取り、書き込みを表示する:

#! /usr/bin/env stap

global fileread, filewrite

probe syscall.open.return {
    if ($return != -1) {
        printf("open, %s, %d/%d\n", user_string($filename), pid(), $return)
    }
}

probe syscall.read.return {
    p = pid()
    fd = $fd
    bytes = $return
    if (bytes > 0)
        fileread[p, fd] += bytes
}

probe syscall.write.return {
    p = pid()
    fd = $fd
    bytes = $return
    if (bytes > 0)
        filewrite[p, fd] += bytes
}

probe timer.ms(100) {
    foreach (v = [p,fd] in fileread) {
        printf("read, %d, %d/%d\n", v, p, fd)
    }                                                                                                                                                                                          
    delete fileread                                                                                                                                                                            
    foreach (v = [p,fd] in filewrite) {                                                                                                                                                        
        printf("write, %d, %d/%d\n", v, p, fd)                                                                                                                                                 
    }                                                                                                                                                                                          
    delete filewrite                                                                                                                                                                           
}

出力ラインの形式は次のとおりです。

  • open,(パス名),(pid)/(fd)

  • 読み取り、(バイト)、(pid)/(fd)

  • 書き込み、(バイト)、(pid)/(fd)

答え2

Linux審査1番と2番のアイテムに関する情報を入手できます。

RHEL / CentOS 6を実行しており、nfs共有がマウントされているとします/mnt/nfs/foo

$ tree /mnt/nfs/foo
/mnt/nfs/foo
|-- a
|   `-- foo
|-- b
    `-- bar

で次の規則を定義する必要があります/etc/audit/audit.rules

# Delete existing rules
-D
# Set buffer size
-b 320
# Log read and write operations
-w /mnt/nfs/foo -p r -k read -k nfs
-w /mnt/nfs/foo -p w -k write -k nfs

その後、auditdリロードサービスを使用してください/etc/init.d/auditd reload

完了すると、次のコマンドで生成されたイベントログを使用してausearch読み取ることができます。aureportauditd

$ cat /mnt/nfs/foo/a/foo
$ echo 'test' > /mnt/nfs/foo/b/bar
$ ausearch -k nfs | aureport -f
File Report
===============================================
# date time file syscall success exe auid event
===============================================
1. 07/15/2015 11:39:04 /mnt/nfs/foo/a/foo 2 yes /bin/cat 500 59
2. 07/15/2015 11:39:05 /mnt/nfs/foo/b/bar 2 yes /bin/bash 500 60

クライアントからのみ情報を収集できます。クライアントが信頼できない場合は、この方法を使用してクライアントがnfsを介してアクセスする宛先を安全に確認することはできません。

関連情報