program story

Linux에서 주어진 프로세스에 대한 개방 FD 제한 확인

inputbox 2020. 12. 3. 07:51
반응형

Linux에서 주어진 프로세스에 대한 개방 FD 제한 확인


최근에 파일 디스크립터를 "유출"하는 Linux 프로세스가있었습니다. 파일 디스크립터를 열고 일부를 제대로 닫지 못했습니다.

이것을 모니터링했다면 프로세스가 한계에 도달했음을 미리 알 수있었습니다.

Ubuntu Linux 시스템에서 주어진 프로세스에 대한 FD 사용 비율을 확인하는 멋진 Bash \ Python 방법이 있습니까?

편집하다:

이제 열린 파일 설명자가 몇 개 있는지 확인하는 방법을 알고 있습니다. 프로세스에 허용되는 파일 설명자 수만 알면 됩니다 . Amazon EC2와 같은 일부 시스템에는 /proc/pid/limits파일 이 없습니다 .

감사,

Udi


의 항목을 계산합니다 /proc/<pid>/fd/. 프로세스에 적용되는 하드 및 소프트 제한은에서 찾을 수 있습니다 /proc/<pid>/limits.


리소스 제한을 얻기 위해 Linux 커널에서 제공하는 유일한 인터페이스는 getrlimit()/proc/pid/limits 입니다. getrlimit()호출 프로세스의 리소스 제한 만 가져올 수 있습니다. /proc/pid를/limits 사용하면 동일한 사용자 ID를 가진 모든 프로세스의 리소스 제한을 가져올 수 있으며 RHEL 5.2, RHEL 4.7, Ubuntu 9.04 및 2.6.24 이상의 커널이있는 모든 배포에서 사용할 수 있습니다.

이전 Linux 시스템을 지원해야하는 경우 프로세스 자체에서를 호출해야합니다 getrlimit(). 물론 가장 쉬운 방법은 프로그램이나 프로그램이 사용하는 라이브러리를 수정하는 것입니다. 프로그램을 실행하는 경우 프로그램에 LD_PRELOAD자신의 코드를로드 하는 사용할 수 있습니다 . 이들 중 어느 것도 가능하지 않으면 gdb로 프로세스에 연결하고 프로세스 내에서 호출을 실행하도록 할 수 있습니다. ptrace()프로세스에 연결하고 메모리에 호출을 삽입하는 데 사용하는 것과 동일한 작업을 직접 수행 할 수도 있습니다 . 그러나 이것은 올바르게 가져 오기가 매우 복잡하고 권장되지 않습니다.

적절한 권한이 있으면이를 수행하는 다른 방법은 커널 메모리를 살펴보고, 커널 모듈을로드하거나, 그렇지 않으면 커널을 수정하는 것입니다. 그러나 나는 이것들이 문제가되지 않는다고 가정합니다.


프로세스를 사용하는 상위 20 개 파일 핸들을 보려면 다음을 수행하십시오.

for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

출력은 프로세스의 파일 핸들 수, pid, cmndline 형식입니다.

예제 출력

701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle

lsof -p {PID}주어진 pid 를 주기적으로 호출 하는 스크립트를 작성할 수 있습니다 .


bash / python 메소드를 요청했습니다. ulimit는 최고의 bash 접근 방식이 될 것입니다 ( /proc/$pid/fd손으로 처리하는 것 등의 부족 ). 파이썬의 경우 리소스 모듈을 사용할 수 있습니다.

import resource

print(resource.getrlimit(resource.RLIMIT_NOFILE))
$ python test.py

(1024, 65536)

resource.getrlimitgetrlimitC 프로그램 호출에 해당합니다 . 결과는 요청 된 리소스의 현재 및 최대 값을 나타냅니다. 위의 예에서 현재 (소프트) 제한은 1024입니다. 값은 요즘 Linux 시스템에서 일반적인 기본값입니다.


CentOS 6 이하 (GCC 3을 사용하는 모든 것)에서는 커널 제한을 조정해도 문제가 해결되지 않을 수 있습니다. GCC에서 사용중인 컴파일 타임에 설정된 FD_SETSIZE이 있기 때문입니다 . 이를 위해 값을 늘린 다음 프로세스를 다시 컴파일해야합니다.

또한 해당 라이브러리를 사용하는 경우 libpthread의 알려진 문제 로 인해 파일 설명자가 유출 되고 있음을 알 수 있습니다. 이 호출은 GCC 4 / CentOS7 / RHEL 7의 GCC에 통합되었으며 스레딩 문제를 해결 한 것으로 보입니다.


우수한 psutil 패키지를 사용하는 Python 래퍼 :

import psutil

for p in psutil.process_iter(attrs=['pid', 'name', 'username', 'num_fds']):
    try:
        soft, hard = p.rlimit(psutil.RLIMIT_NOFILE)
        cur = p.info['num_fds']
        usage = int(cur / soft * 100)
        print('{:>2d}% {}/{}/{}'.format(
            usage,
            p.info['pid'],
            p.info['username'],
            p.info['name'],
            ))
    except psutil.NoSuchProcess:
        pass

참고 URL : https://stackoverflow.com/questions/1356675/check-the-open-fd-limit-for-a-given-process-in-linux

반응형