
프로세스 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 -l
1000이 주어진 경우. 그러면 백분율은 다음과 같습니다:- 1000/4096*100= 약 25%
때때로 내가 얻는 비율은 220입니다.
이제 시나리오를 재현할 수 있습니다. 이 상황은 서버에서 발생했으며
/proc/pid/fd/29
프로세스에 5000개의 로그 파일이 열려 있다는 사실을 발견했습니다.
이는 프로세스 pid가 최대 열린 파일 제한(4096)을 초과했음을 의미합니다.
답변1
이 제한은 현재 열려 있는 파일이나 파일 설명자 수가 아니라 새로 생성된 파일 설명자 값에 대한 것입니다( open()
/ 등 은 설정된 제한보다 큰 숫자를 socket()
반환하지 않으며 실패하므로).pipe()
n-1
n
dup2(1, n or n+1...)
효과적으로 이렇게 하면 제한이 로 설정된 순간부터 프로세스가 여러 파일을 열 수 없게 되지만 , n
제한이 낮아지기 전에 위의 파일 설명자가 생성된 경우 n
프로세스가 여러 파일을 열 수 있습니다 .n
n
예:
$ 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개 이상을 생성할 수 있습니다.