Kafka 서비스가 있습니다 ( systemctl
서비스로)
서비스에서 열린 파일 수를 구성했습니다.
예:
[Service]
LimitMEMLOCK=infinity
LimitNOFILE=1500000
Type=forking
User=root
Group=kafka
이제 서비스가 시작되면 kafka 서비스에서 소비하는 파일 수를 알고 싶습니다.
구글링을 통해 알게 된 사실 -https://www.cyberciti.biz/faq/howto-linux-get-list-of-open-files/
fstat
이 명령을 사용하여 열려 있는 파일 수를 캡처 할 수 있습니다.
~처럼
fstat -p {PID}
우리는 프로덕션 RHEL 7.6 보안 서버를 사용하고 있기 때문에 이것이 fstat
우리 서버에 설치될 수 있는지 확실하지 않습니다.
그럼 다른 아이디어를 알고 싶나요?
다른 접근 방식을 취해 주셔서 감사합니다.
다른 제안된 방법은 다음과 같습니다 -ls "/proc/$pid/fd"
하지만 이것은 내 컴퓨터의 실제 예입니다.
ls /proc/176909/fd |more
0
1
10
100
1000
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
1001
10010
10011
10012
.
.
.
그러면 우리는 긴 숫자 목록을 얻게 되는데, 열린 파일의 수를 어떻게 알 수 있을까요?
답변1
주석에서 언급했듯이 wc
다음 명령을 사용할 수 있습니다.
ls "/proc/$pid/fd"|wc -l
-l
줄 수 계산( ls
명령 결과)
답변2
(참조) LimitNOFILE
의 지시문은 (참조)에서 설정한 리소스 제한에 해당합니다. 일부 쉘에서 사용하거나 설정할 수 있습니다.systemd
man systemd.exec
RLIMIT_NOFILE
setrlimit()
man setrlimit
ulimit -n
limit descriptors
이는 프로세스가 열 수 있는 최대 파일 설명자 수보다 1 큰 값을 지정합니다. 이 제한을 초과하려는 시도(open(2), Pipe(2), dup(2) 등)는 EMFILE 오류를 생성합니다. (역사적으로 이 제한은 BSD에서 RLIMIT_OFILE로 명명되었습니다.)
따라서 엄밀히 말하면 열린 파일 설명자 수에 대한 제한은 아닙니다(열린 파일은 물론이고). 해당 제한이 있는 프로세스는 설정 시 해당 제한보다 높은 fd를 갖는 것이 더 나을 것이기 때문입니다. 생성됨), 더 많은 열린 파일을 가질 수 있습니다( clone()
/ fork()
)). 열린 fd가 거의 없더라도 제한을 초과하는 fd를 얻을 수 없습니다.
Linux에서는 /proc/<pid>/fd
프로세스에서 연 각 fd에 대한 매직 심볼릭 링크 파일이 포함된 특수 디렉터리입니다.
다음을 세어 번호를 얻을 수 있습니다.
() {print $#} /proc/$pid/fd/*(NoN)
예를 들어 zsh
(또는 ls "/proc/$pid/fd" | wc -l
Romeo가 보여준 것처럼).
가장 높은 pid 값을 얻고 첫 번째 값을 얻으려면 숫자를 역순으로 정렬하세요.
() {print $1} /proc/$pid/fd/*(NnOn:t)
또는 GNU를 사용하십시오 ls
:ls -rv "/proc/$pid/fd" | head -n1
모든 프로세스에 대해 열려 있는 fd 수에 대한 보고서를 얻으려면 다음을 수행할 수 있습니다.
(for p (/proc/<->) () {print -r $# $p:t $(<$p/comm) $p/exe(:P)} $p/fd/*(NoN)) | sort -n
더욱 편리하게 다음을 수행할 수 있습니다 lsof
.
lsof -ad0-2147483647 -Ff -p "$pid" | grep -c '^f'
열린 파일 설명자 수 및:
lsof -ad0-2147483647 -Ff -p "$pid" | sed -n '$s/^f//p'
가장 높습니다.