각 프로세스에서 열린 파일 수를 찾는 방법

각 프로세스에서 열린 파일 수를 찾는 방법

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의 지시문은 (참조)에서 설정한 리소스 제한에 해당합니다. 일부 쉘에서 사용하거나 설정할 수 있습니다.systemdman systemd.execRLIMIT_NOFILEsetrlimit()man setrlimitulimit -nlimit 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 -lRomeo가 보여준 것처럼).

가장 높은 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'

가장 높습니다.

관련 정보