시계가 제대로 표시되지 않는지 어떻게 알 수 있습니까?


47

나는 inotify 시계를 소비하는 응용 프로그램을 사용합니다. 나는 한 이미 설정

fs.inotify.max_user_watches=32768

에서 /etc/sysctl.conf내가 수동으로 실행하지 않는하지만 지난 밤 응용 프로그램은 내가 시계에서 오전 의심하는 날 리드하는 색인을 중단했다.

이 숫자를 늘릴 때 트레이드 오프가 무엇인지 알지 못하므로 (더 많은 RAM을 소비합니까?)이 숫자를 늘려야할지 모르겠습니다. 따라서 방법이 있는지 알고 싶습니다. 시계를 모두 사용하고 있는지, 시계 증가에 대한 장단점을 알 수 있습니다.


이 질문은 18.04 년에 아이 노드 시계가 부족한 경우 화면 잠금을 해제 할 수 없기 때문에 다시 관련성이 높아졌습니다.
kasperd

답변:


64

시계가 부족한지 어떻게 알 수 있습니까? 꼬리 는 말할 것이다!

  • 예를 들어 다음 과 같은 오래된 파일 tail에서 -f(따라) 옵션으로 시작하십시오 tail -f /var/log/dmesg.
    • 모든 것이 정상이면 마지막 10 줄을 표시하고 일시 중지합니다. Ctrl-C로 중단
    • 당신이 시계를 벗어난 경우 ,이 다소 암호 오류 와 함께 실패 합니다 :
      꼬리 : '/ var / log / dmsg'를 볼 수 없음 : 기기에 남은 공간이 없습니다.

궁금한 점 : 꼬리 는 왜 "말꼬리"인가

  • 사실, 어떤 잘 작성된 응용 프로그램은 이후, 말하고의 예의가 있어야 inotify를 API는 / 명확하게 호출하는 계약이 무엇인지를 알려줍니다.
  • strace tail -f ...대신 시도 하고 성공하면 다음과 같이 끝납니다.
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • 그러나 실패하면, 예 를 들어 시계가 부족하면 다음과 같이 말합니다.
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (장치에 남은 공간 없음)
    

시계를 늘릴 수 있습니까? 얼마만큼? 어떤 장단점이 있습니까?

짧은 대답 : 물론 땀이 나지 않습니다. 원하는 경우 50 만 개 (524288)로 바로 이동하십시오. 사용되는 추가 메모리 는 4GB 이상의 메모리가있는 최신 시스템에서는 무시할 수 있어야합니다 .

  • 사용 된 각 inotify watch는 540 바이트 (32 비트 시스템) 또는 1kB (이중 64 비트)를 사용합니다. [출처 : 1 , 2 ]
  • 이것은 커널 메모리 에서 나오며 스왑 할 수 없습니다.
  • 따라서 최대 값을 524288로 설정하고 모두 사용 (불가능)한다고 가정하면 약. 256MB / 512MB의 32 비트 / 64 비트 커널 메모리

    • 응용 프로그램은 또한 inotify 핸들, 파일 / 디렉토리 경로 등을 추적하기 위해 추가 메모리를 사용합니다. 디자인의 양에 따라 다릅니다.
  • 최대 값은 얼마입니까? 충분한 RAM이있는 한 이론적으로는 아무도 생각하지 않습니다. 실제로 524288 은 앱 에서 공식적으로 권장했으며 사람들은 메모리 사용과 함께 2 백만 으로 설정했습니다 .


5
또한 현재 inotify 시계의 실제 수를 알고 싶다면 (예 : 아니오 / 아니요)sudo lsof | grep -i inotify | wc -l
Frank Nocke

2
"잘 작성된 앱"링크가 끊어졌습니다.
Gaurav Sharma

11

이 숫자 만 늘려야할지 모르겠어요

max_user_watches값에 도달했는지 확인하는 쉬운 방법은 사용자와 함께 inotifywatch패키지 inotify-tools에서 사용하고 파일에서 정보를 수집 할 수 있는지 확인하는 것입니다.

예를 들어 inotifywatch -v /home/bruno/.profile나를 위해 반환합니다.

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

그래서 inotify여기에, 어떤 문제를 새로운 시계를 생성하지 더 문제가 없습니다.

inotify 시계의 최대 한도에 도달하면

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

이와 같은 내용이 표시되면 한도에 도달했으며 허용 된 시계 한도를 늘려야합니다.

더 많은 RAM을 소비합니까?

그렇습니다. 그러나이 이전 기사 에 따르면 소비되는 양은 실행중인 데스크톱의 다른 측면에 비해 최소입니다.

-메모리 사용량-

inotify 데이터 구조는 가볍습니다 :

inotify watch는 40 바이트입니다 inotify 장치는 68 바이트입니다 inotify 이벤트는 272 바이트입니다

따라서 장치에 8192 개의 시계가 있다고 가정하면 구조는 320KB의 메모리 만 소비합니다. 한 번에 최대 8 개의 장치를 사용할 수 있지만 여전히 2.5MB입니다.

각 장치에는 한 번에 256 개의 이벤트가 대기열에있을 수 있으며 이는 장치 당 68KB입니다. 모든 장치가 열려 있고 전체 이벤트 큐가있는 경우에만 0.5MB입니다.

따라서 거의 3MB의 메모리가 열리고 가득 찬 모든 경우에 사용됩니다.

각각의 inotify watch는 디렉토리 / 파일의 inode를 메모리에 고정 시키며, inode의 크기는 파일 시스템마다 다르지만 512 바이트라고 가정 할 수 있습니다.

따라서 최대 개수의 전역 시계가 활성화되어 있다고 가정하면 inode 캐시에 32MB의 inode가 핀 다운됩니다. 현대 시스템에서는 다시 문제가되지 않습니다.

물론 기사가 작성된 이후 많은 것이 바뀌지 않았다고 가정하지만 걱정하지 않을 숫자를보고 한계를 늘리면 RAM 소비가 크게 증가하지는 않습니다.


관련 게시물 inotify


죄송합니다, 어제 몇 시간 동안 초안을 열 었는데 내 게시물을 게시하기 전에 답변을 보지 못했습니다. 두 가지 접근법이 있기 때문에 괜찮습니다 :-) 최근 커널에서 inotify는 시계 당 0.5KB (32 비트) 또는 1KB (64 비트)의 커널 메모리를 사용한다는 것을 분명히 알 수 있습니까? 2005 년은 더 이상 사실이 아닌 것 같습니까?
ish
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.