커널이 시계 한도에 도달 한 경우


206

나는 현재 inotify watch limit에 도달했기 때문에 루트로 오류를 반환하는 명령이있는 Linux 상자에 문제가 있습니다.

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

나는 조금 구글 검색하고 내가 찾은 모든 솔루션은 다음과 같이 한계를 늘리는 것입니다.

sudo sysctl fs.inotify.max_user_watches=<some random high number>

그러나 그 가치를 높이는 결과에 대한 정보를 찾을 수 없었습니다. 기본 커널 값이 이유로 설정되었지만 특정 용도에는 적합하지 않은 것 같습니다. (예 : 많은 폴더가있는 Dropbox 또는 많은 파일을 모니터링하는 소프트웨어를 사용하는 경우)

내 질문은 다음과 같습니다.

  • 그 가치를 높이는 것이 안전하고 너무 높은 가치의 결과는 무엇입니까?
  • 현재 설정된 시계가 무엇인지, 어떤 프로세스가 결함이있는 소프트웨어로 인해 한계에 도달했는지 여부를 확인할 수있는 프로세스를 찾는 방법이 있습니까?

8 개월이 지났으므로 지금까지이를 확인했지만 드라이브가 꽉 찼습니까? "꼬리 : '/ var / log / messages'를 볼 수 없음 : 기기에 남은 공간이 없습니다"
froggythefrog

답변:


273

그 가치를 높이는 것이 안전하고 너무 높은 가치의 결과는 무엇입니까?

예, 그 가치를 높이는 것이 안전하며 가능한 비용은 다음과 같습니다 [ source ] :

  • 사용 된 각 inotify watch는 540 바이트 (32 비트 시스템) 또는 1kB (이중 64 비트)를 사용합니다. [출처 : 1 , 2 ]
  • 이것은 커널 메모리 에서 나오며 스왑 할 수 없습니다.
  • 최대 값을 524288로 설정하고 모두 사용 (불가능)한다고 가정하면 약 256MB / 512MB의 32 비트 / 64 비트 커널 메모리를 사용하게됩니다.
    • 응용 프로그램은 또한 inotify 핸들, 파일 / 디렉토리 경로 등을 추적하기 위해 추가 메모리를 사용합니다. 디자인의 양에 따라 다릅니다.

inotify 시계의 최대 개수를 확인하려면 :

cat /proc/sys/fs/inotify/max_user_watches

inotify 시계의 최대 개수를 설정하려면

일시적으로 :

  • sudo sysctl fs.inotify.max_user_watches=마지막에 원하는 값으로 실행하십시오 .

영구적으로 ( 보다 자세한 정보 ) :

  • fs.inotify.max_user_watches=524288sysctl 설정에 넣으 십시오. 시스템에 따라 다음 위치 중 하나에있을 수 있습니다.
    • 데비안 / 레드햇 : /etc/sysctl.conf
    • 아치 :에 새로운 파일을 넣습니다 /etc/sysctl.d/./etc/sysctl.d/40-max-user-watches.conf
  • 재부팅을 피하기 위해 sysctl 설정을 다시로드 할 수 있습니다 : sysctl -p(Debian / RedHat) 또는 sysctl --system(Arch)

inotify 시계의 최대 개수에 도달했는지 확인하십시오.

예를 들어, 다음과 같은 이전 파일 tail에서 -f(따라) 옵션 과 함께 사용하십시오 tail -f /var/log/dmesg.-모든 것이 정상이면 마지막 10 행을 표시하고 일시 정지합니다. Ctrl-C로 중단- 시계를 벗어난 경우 다소 복잡한 오류로 인해 실패 합니다 .

꼬리 : '/ var / log / dmsg'를 볼 수 없음 : 기기에 남은 공간이 없습니다.

inotify 시계 사용 내역을 확인하려면

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

첫 번째 열은 inotify fd의 수 (시계 수는 아님)를 나타내고 두 번째 열은 해당 프로세스의 PID를 나타냅니다 [sources : 1 , 2 ].


3
I guess very few codes need the values higher than the defaultDropbox는 파일 수에 따라 더 높은 제한이 필요할 수 있습니다. 나는 아무런 문제없이 광산을 키 웠습니다. 실제로 보관 용 계정 알림 (한도에 도달 할 때 발생)은 알림을 올리도록 명시 적으로 지시합니다.
Falmarri

1
@ ultrasawblade- inotify는 교체 된 dnotify입니다. dnotify는 느리고 버그가 많았습니다. 디렉토리에서 inotify를 사용할 수 있으며 해당 디렉토리의 파일 중 하나 (한 레벨 깊이)가 수정되면 디렉토리가 "변경"됩니다. 어쨌든 디렉토리는 파일입니다.
beatgammit

6
"영구적으로 : / proc / sys / fs / inotify / max_user_watches 내의 값을 바꾸십시오"<-이것은 올바르지 않습니다. 이하려면 영구적 당신은 변경해야/etc/sysctl.conf
용병

3
설명에서 sysctl! = systemd입니다. 또한 /etc/sysctl.d최신 RedHat 기반 시스템에서도 작동합니다.
aairey

1
@stackexchanger 이것들이 유사하다는 것을 확신한다면 (예를 들어 테스트 한 것), 질문을 제출하고 편집하십시오. 나는 스스로 확인하지 않았고 배포판이 패키지를 패치하는 경향이 있다는 것을 알고 있으므로 동일한 패키지에 대해 동작이 다를 수 있습니다. 패키지 버전의 차이점은 말할 것도 없습니다.
tshepang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.