inotify(file change notification system)覚書-Part2

ファイルシステムの変更イベントを捕まえて同期を行う Lsyncd(Live Syncing Daemon) というツールがある。
いろいろと使えそうだったので、lsyncd がファイルシステムのイベント通知に利用している inotify を調査。


手頃に入る inotify 系ドキュメントについて一口メモ


なにはともあれ man。


(おそらく)Kernel 開発者向けのドキュメント。inotify のAPIだけでなく現在の設計にいたった背景(rationale)までがコンパクトにまとまっている。rationale が一番のよみどころ。イベントの詳細や 2.6.13 以降の変更はかかれていない。
15 Mar 2005 作成?

Table Of Contents
(i) User Interface
(ii) Prototypes
(iii) Kernel Interface
(iv) Kernel Interface Prototypes
(v) Internal Kernel Implementation
(vi) Rationale

Q: What is the design decision behind not tying the watch to the open fd of the watched object?
Q: What is the design decision behind using an-fd-per-instance as opposed to an fd-per-watch?
Q: Why the system call approach?

Robert Love : Why Not dnotify and Why inotify の “Rationale” とかぶる内容。
dnotify は設計上どこがまずくて、inotify ではどのようにしてその問題を解決しているのか。

Robert Love : Linux Journal : Kernel Korner – Intro to inotify

inotify が Linux Kernel に正式にとりこまれたタイミングでの inotify の紹介記事。Sep 28, 2005。

なぜ inotify という仕組みが必要だったのか dnotify と対比させつつ説明したあと(What Is inotify?)、API について解説(Getting Started with inotify)
inotify は read 処理が少し面倒なので、少し手厚く説明。select をつかった multi-plexing の例もある。

Michael Kerrisk :The Linux Programming Interface

Ch.19 Monitoring File Events で inotify のためにまるまる1章をさいているが、P.375-P.386 までと分量はあまりない。man よりは濃いが、他の章よりは記述が淡白に感じる。

Table Of Contents
19.1 Overview
19.2 The inotify API
19.3 inotify Events
19.4 Reading inotify Events
19.5 Queue Limits and /proc Files
19.6 An Older System for Monitoring File Events: dnotify

IBM DeveloperWorks : Monitor Linux file system events with inotify

  1. select で file descriptor を監視
  2. read して各イベントを enqueue
  3. キューをdequeue して各イベントを処理

という一連の流れを C で実装。プログラムの見通しがよく、inotify をコードで理解するなら、まずこのチュートリアルから入るとよいと思う。
すごくテキトーな Python/epoll 移植

Jonathan Lemon : Kqueue: A generic and scalable event notification facility

BSDCon 2000 の発表資料

select/poll はファイルディスクリプタが増えるとスケールしない上、拾えるイベントも限られている。kqueue(Kernel Queue) でこの問題を克服。kqueue は FreeBSD 4.1 から取り込まれた。

This paper presents a generic event delivery mechanism, which allows an application to select from a wide range of event sources, and be notified of activity on these sources in a scalable and efficient manner. The mechanism may be extended to cover future event sources without changing the application interface.

select/poll のスケーラビリティについて、Python のドキュメントに以下の記述があった

poll() scales better because the system call only requires listing the file descriptors of interest, while select() builds a bitmap, turns on bits for the fds of interest, and then afterward the whole bitmap has to be linearly scanned again. select() is O(highest file descriptor), while poll() is O(number of file descriptors).

Robert Love : Linux Kernel Development

“Chapter 6. Kernel Data Structures” で

  • Linked List
  • Queue
  • Map
  • Binary Tree

といった Kernel で利用されているデータ構造が解説されている。
Linked List の具体例として inotify のウォッチリストを管理している inode->inotify_watches が取り上げられている。

Tagged with:
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: