inotify 잊지 않겠다... -_-

vamf12의 이미지

inotify를 이용한 file db를 맹글고 있었습니다.
(서버에 하드디스크 탐색기가 하나 필요한디 google데탑은 너무 무겁고 - 근데 리눅스용이 있기는 있나요?, 비글은 버그가 너무 많은 것 같아서리...)
그런데... 역시 세상은 만만치 않습니다. ㅠ_ㅠ

inotify는 세가지 속성을 가지고 있습니다.

-rw-r--r-- 1 root root 0 2008-04-09 19:07 max_queued_events
-rw-r--r-- 1 root root 0 2008-04-09 19:07 max_user_instances
-rw-r--r-- 1 root root 0 2008-04-09 20:52 max_user_watches

전 이것을 보고 처음에 이렇게 생각했습니다.
max_user_instances : 유저당 생성가능한 inofity객채수(inotify 파일 기술자)
max_user_watches : 한 inotify객채당 등록 가능한 watch객채수

기본값은 대충 이러 합니다.
max_queued_events : 16384
max_user_instances : 128
max_user_watches : 8192

살짝 머리를 굴려 보니, 8192라는 값은 확실히 작은 값입니다. (/home 전체에 파일이 몇개 인데.. -_-)
max_user_instances * max_user_watches = 1048576

옷 이렇게 만들면 충분 하겠구나. 속으로 쾌재를 외치고 뚝딱맹글었습니다.
1. inotify 파일 기술자 하나당 8192까지 등록하고, 8192개를 넘어 가면 새로운 기술자를 만들어서 등록하도록 한다.
2. DB니까, 무조건(파일정보이든, inotify든) 인덱스를 타서 O(1)으로 접근 가능하도록 한다.

상당히 빡세지만, 어쨌든 맹글었습니다. 특히 동적으로 증가하는 inotify를 파일 정보들하고 매칭시키는 게 좀 힘들 었습니다.(O(1)으로 연결 해야 하니까요..)
완성다하고 하드 디스크 전체를 대상으로 테스트를 했더니... 이거 왠걸.. -_-?
<span>inotify_add_watch :: No space left on device</span>

예 그렇습니다...
max_user_watches : 한 유저당 등록할수 있는 watch수

inotify를 몇개를 오픈하든, 여러개의 프로세서를 동원하든 결국 8192개 밖에 사용할 수 없습니다. 만든면서 가장 많은 부분을 소모한 코드가 쓸데없는 코드가 되어 버렸습니다. ㅠ_ㅠ

걍 때려 치울까 하는 마음이 간절 합니다. -_-
(perl로 만든 간단하게 서치엔진을 맹글어서 쓰고 있는데, 21836개의 파일을 검색하는데 1초 안으로 검색 가능하니까.. 머 그냥...)

danskesb의 이미지

구글 데스크톱 리눅스용은 여기에 있습니다.

윈도용처럼 가젯을 지원하지는 않습니다만, 단순한 파일 인덱싱용으로는 쓸 수 있습니다. 저도 과거에 한 번 사용해 본 적이 있었는데, 뭐 이건 어느 데스크톱 검색 엔진이나 해당하겠지만 색인 파일 크기에 겁먹어서(그리고 자주 쓰지도 않아서) 지웠던 기억이 나네요.
---- 절취선 ----
http://blog.peremen.name

vamf12의 이미지

예 그렇습니다. 이건 너무 무거워요 ㅠ_ㅠ

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

Tracker도 있죠. 우분투에 기본 포함되었을걸요?

http://www.gnome.org/projects/tracker/

vamf12의 이미지

오 가벼워 보이고, API도 준비 되어 있군요. 근데 inotify를 사용하지 않는듯 하네요...
아무래도 실시간으로 파일 변화가 감지 되었으면 해서요.

ganadist의 이미지

inotify 대신 fschange라는것도 있습니다. (물론 따로 커널을 패치해야합니다.)

하시려는 작업에 이게 더 어울릴지도 모르겠네요.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

superkkt의 이미지

저랑 똑같은 벽에 부딪히셨군요. 실시간 백업 만든다고 코드 거의 다 만들었는데 나중에 그 사실을 알게되었습니다. 당연히 watch 하나 걸어두면 recursive하게 감시할 줄 알았는데..ㄷㄷㄷ
그래서 inotify는 포기하고 프로젝트 접었죠.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

azirael의 이미지

제가 제대로 이해하지 못한 것 같아서 쓰기에 주저하게 됩니다만,
sysctl.conf에 이렇게 넣어주면 되지 않나요?

fs.inotify.max_user_watches = 16384 (or higher value)

아니면 /proc/에 직접 넣어주시던지요.
beagle 사용할 때 이렇게 했던 기억이 있습니다.

superkkt의 이미지

네, 늘려줄수 있습니다. 그런데 그런 제한이 있다는것 자체가 대용량 시스템에 적용할 수 없는 이유이죠. 그리고 내부적으로 커널 스택을 사용할텐데 무한정 늘릴수도 없을테구요.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com