fd를 모르고선 리눅스 '잘알'이라고 할 수 없다.
물론 나는 리눅스'잘알'이 아니기 때문에 fd에 대해서 설명해보라 하면.... 명확하게 설명할 수 없다.
저번주에 팀장님이 fd에 대해서 설명을 기깔나게 하시는 것을 보고 감명을 받아 나름대로 서칭 후 블로그에 기록해본다. (보고 있나요?)
개념 훑기용 포스팅으로 생각해주길 바란다. 😊
1. FD(File Descriptor) 란?
리눅스 시스템에서는 모든 것이 파일이다. 모든 객체와 행동은 파일로 관리된다.
리눅스에서는 프로세스가 이 파일에 접근할 때 File Descriptor 라는 개념을 이용하여 접근한다.
FD는 포인터의 개념이다.
아래는 프로세스 아이디 21294번의 fd 목록이다.
[root@localhost fd]# ls -al /proc/21294/fd
total 0
dr-x------ 2 root root 0 Feb 21 10:45 .
dr-xr-xr-x 9 root root 0 Feb 21 10:45 ..
lr-x------ 1 root root 64 Feb 21 10:45 0 -> /dev/null
lrwx------ 1 root root 64 Feb 21 10:45 1 -> /dev/null
lrwx------ 1 root root 64 Feb 21 10:45 2 -> /dev/null
lrwx------ 1 root root 64 Feb 21 10:45 3 -> socket:[11500347]
lrwx------ 1 root root 64 Feb 21 10:45 4 -> socket:[11503850]
lrwx------ 1 root root 64 Feb 21 10:45 5 -> /dev/ptmx
l-wx------ 1 root root 64 Feb 21 19:27 6 -> /run/systemd/sessions/100710.ref
lrwx------ 1 root root 64 Feb 21 19:27 7 -> socket:[11503144]
FD 5번은 /dev/ptmx라는 것을 가리키고 있다.
FD 6번은 /run/systemd/sessions/100710.ref 라는 것을 가리키고 있다.
FD 3,4,7번은 네트워크 통신을 하기 위한 socket 파일을 가리키고 있다.
그럼 여기서 0,1,2 번은 무엇인가?
fd 0 : 표준 입력 (stdin)
fd 1 : 표준 출력 (stdout)
fd 2 : 표준 에러 (stderr)
/* 시간 관계상 다음주에 포스팅을 재정비 하여 내용 추가 할 것. */
2. 리눅스 FD(File Descriptor) 확인하기
1) FD를 확인 할 프로세스의 PID를 확인한다.
> ps -ef | grep {조건}
(예시)
> ps -ef | grep java
2) 해당 PID의 fd를 확인한다.
> ls -al /proc/{PID}/fd
(예시)
> ls -al /proc/21294/fd
3. FD(File Descriptor) 의 활용
- fd leak 확인하기
일반적으로 fd의 제한은 0에서 1023라서 1023까지 할당된다면 더이상 file open이 되지 않는다. 프로세스가 fd를 제대로 정리하지 않는다면 fd leak이 발생하여 memory leak과 비슷한 현상을
file 입출력이 잦은 프로그램이라면 fd leak을 확인해보는 것도 좋다.
시스템 전체 file descriptor 개수 확인하는 방법은 아래와 같다.
> cat /proc/sys/fs/file-nr
2336 0 1569632
출력값 의미 : 오픈된 파일 수 / 오픈되지 않은 파일 수 / 최대 오픈 파일 수
오픈된 파일 수가 계속 증가만 한다면 fd leak을 의심해보아야 한다.
한 프로세스가 사용 가능한 최대 file descriptor 개수를 확인하는 방법은 아래와 같다. 사용 가능한 값을 늘릴 수 있는데 이 포스팅에서는 skip 하겠다.
> ulimit -a
(앞뒤 생략)
open files (-n) 1024
- socket fd 를 통해 네트워크 이슈 확인
/* 시간 관계상 다음주에 포스팅을 재정비 하여 내용 추가 할 것. */
참고 사이트
- http://webs.co.kr/index.php?mid=linux_1&document_srl=3319992
- https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC_%EC%84%9C%EC%88%A0%EC%9E%90
'리눅스' 카테고리의 다른 글
CentOS host에서는 docker container 내 netstat ESTABLISHED 정보를 출력하지 않음 (0) | 2022.03.27 |
---|---|
Unix Socket과 TCP Socket의 차이 (0) | 2022.03.20 |
리눅스 디스크 사용량 확인하기 ( df, du 명령어 사용) / du --max-depth 사용 시 사이즈 정렬하기 (0) | 2021.12.28 |
리눅스 grep 명령어 다양한 옵션 사용하기 (0) | 2021.12.05 |
CentOS7에 python3.7 설치하고 Virtualenv, VirtualenvWrapper 사용하기 (0) | 2021.11.06 |