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.getrlimit
getrlimit
C 프로그램 의 호출에 해당합니다 . 결과는 요청 된 리소스의 현재 및 최대 값을 나타냅니다. 위의 예에서 현재 (소프트) 제한은 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
'program story' 카테고리의 다른 글
Content-Language 및 Accept-Language는 무엇입니까? (0) | 2020.12.04 |
---|---|
현재 지점, 거리 및 방위각에 따라 위도 / 경도를 가져옵니다. (0) | 2020.12.04 |
부트 스트랩 글 리피 콘 (0) | 2020.12.03 |
파이썬에서 코드 줄 사이에 걸리는 시간을 측정하는 방법은 무엇입니까? (0) | 2020.12.03 |
Xcode 6 프로젝트 이름 변경 후 오류 : "종료 코드 1로 링커 명령이 실패했습니다 (호출을 보려면 -v 사용)" (0) | 2020.12.03 |