프로세스가 최대 열린 파일 제한을 초과했습니다.

프로세스가 최대 열린 파일 제한을 초과했습니다.

프로세스 pid:- cmd1:-를 기준으로 현재 열려 있는 파일을 계산 중입니다.

ls /proc/$pid/fd/* | wc -l 

그런 다음 최대 열린 파일 제한을 가져와 백분율을 계산했습니다. cmd2:-

$ cat /proc/$pid/limits
Limit                     Soft Limit           Hard Limit           Units

Max resident set          unlimited            unlimited            bytes     
Max processes             30425                30425                processes
Max open files            4096                 4096                 files
Max locked memory         65536                65536                bytes

출력의 일부만 붙여넣습니다.

나는 백분율을 계산하고 있습니다 :-

cmd1/cmd2*100

즉, ls /proc/$pid/fd/* | wc -l1000이 주어진 경우. 그러면 백분율은 다음과 같습니다:- 1000/4096*100= 약 25%

때때로 내가 얻는 비율은 220입니다.

이제 시나리오를 재현할 수 있습니다. 이 상황은 서버에서 발생했으며 /proc/pid/fd/29프로세스에 5000개의 로그 파일이 열려 있다는 사실을 발견했습니다.

이는 프로세스 pid가 최대 열린 파일 제한(4096)을 초과했음을 의미합니다.

답변1

이 제한은 현재 열려 있는 파일이나 파일 설명자 수가 아니라 새로 생성된 파일 설명자 값에 대한 것입니다( open()/ 등 은 설정된 제한보다 큰 숫자를 socket()반환하지 않으며 실패하므로).pipe()n-1ndup2(1, n or n+1...)

효과적으로 이렇게 하면 제한이 로 설정된 순간부터 프로세스가 여러 파일을 열 수 없게 되지만 , n제한이 낮아지기 전에 위의 파일 설명자가 생성된 경우 n프로세스가 여러 파일을 열 수 있습니다 .nn

예:

$ limit descriptors 10000 # ulimit -n 10000 in bash
$ perl -MBSD::Resource -MPOSIX -e '
    dup2(1,$_) for (2000..4000);
    setrlimit(RLIMIT_NOFILE, 1024, 1024);
    exec zsh'
zsh$ ls /proc/$$/fd | wc -w
2009
zsh$ readlink /proc/$$/fd/3000
/dev/pts/1
zsh$ repeat 100 exec {a}>&1
zsh$ ls /proc/$$/fd | wc -w
2109
zsh$ grep files /proc/$$/limits
Max open files            1024                 1024                 files

실행 시 zsh프로세스의 .fds 2000부터 4000까지 열려 있었습니다 /dev/pts/1. 그러나 fd 제한은 1024입니다.

이미 2009 fd가 있지만 여전히 100개 이상을 생성할 수 있습니다.

관련 정보