Contents
➡️ File Descriptor란?
Unix 계열의 OS에서 파일을 액세스 할 때 사용되는 추상적인 표현이다.
- 일반적으로 0이 아닌 정수값을 갖는다.
Unix 파일 시스템에서는 모든 것을 파일로 관리하는데 (일반파일, 디렉터리, 소켓, 파이프 등) 프로세스가 파일들을 접근할 때 File Descriptor라는 개념을 이용하는 것이다.
✅ File Descriptor 할당 흐름
- 프로세스가 파일을 Open한다.
- 커널은 해당 프로세스의 File Descriptor 숫자 중 사용하지 않는 가장 작은 값을 할당해 준다.
- 프로세스가 File Descriptor를 통해 파일에 System Call을 이용하여 접근한다.
✅ File Descriptor의 고정값
File Descriptor의 값 중 0,1,2는 목적이 고정되어 있다. 각각 표준 입력, 표준 출력, 표준 에러를 뜻한다.
- 즉, 0,1,2를 제외한 FD 값이 할당이 된다.
File Descriptor 정수값 | FD 대신 사용하는 이름 | 목적 |
0 | stdin | 표준 입력 |
1 | stdout | 표준 출력 |
2 | stderr | 표준 에러 |
✅ File Descriptor Table
File Descriptor가 단순 숫자인 이유는 File Descriptor는 프로세스가 Open 중인 File Descriptor Table의 인덱스 값이기 때문이다.
File Descriptor = File Descriptor Table의 Index 값
File Descriptor Table의 각 항목은 File Descriptor의 Flag와 File Table의 포인터를 갖고 있다.
File Table의 포인터는 또 I-node Table을 참조하고 있어서 File Descirptor를 통해 파일에 최종적으로는 파일에 접근할 수 있는 것이다.
➡️ File Descriptor 확인하기
백문이 불여일견이다.
- 확인하려는 프로세스의 PID 확인
- File Descirptor 확인
> ls -trn /proc/19066/fd
total 0
lr-x------ 1 1003 502 64 Jul 12 20:44 19 -> /usr/local/java/jdk1.8.0_321/jre/lib/ext/localedata.jar
lrwx------ 1 1003 502 64 Jul 12 20:44 18 -> socket:[1284785193]
lrwx------ 1 1003 502 64 Jul 12 20:44 17 -> socket:[1284785192]
lrwx------ 1 1003 502 64 Jul 12 20:44 16 -> socket:[1284785190]
# (중략...)
l-wx------ 1 1003 502 64 Jul 12 20:44 2 -> /var/log/java/catalina.out
l-wx------ 1 1003 502 64 Jul 12 20:44 1 -> /var/log/java/catalina.out
lr-x------ 1 1003 502 64 Jul 12 20:44 0 -> /dev/null
명령어의 결과를 보면 0,1,2는 입력, 출력, 에러로 목적이 고정되어 있다.
그 외의 정수값을 가지는 File Descirptor는 특정 파일을 가리키고 있다. 프로세스는 해당 정수값을 통해 파일에 접근할 수 있다.
위에서도 설명했듯이 File Descriptor는 파일 시스템이 프로세스가 파일에 쉽게 접근하기 위해 제공해 주는 숫자 (인덱스 값)에 지나지 않는다.
➡️ File Descriptor 최댓값 수정
기본적으로 프로세스는 사용할 수 있는 File Descirptor의 최대 수가 정해져 있다. 최댓값은 아래의 시스템 명령어로 변경할 수 있다.
✅ OS
1. OS의 전체 Limit 확인
> cat /proc/sys/fs/file-max 20000
2. 수정 (영구 반영)
- 적용을 하기 위해선 프로세스의 재기동이 필요하다.
> vi /etc/sysctl.conf
fs.file-max = 65535
✅ 프로세스
1. 프로세스 Limit 확인
# Soft Limits
> ulimit -Sn
1024
# Hard Limits
> ulimit -Hn
4096
2. 현재 실행 중인 프로세스의 File Descriptor 개수 확인
- 프로세스의 Owner가 payment인 총 File Descriptor 수 확인
> lsof -u payment |wc -l
3020
3. Maximum File Descriptor 수정 (즉시 반영)
- 즉시 반영은 되나 프로세스 재기동 시 다시 설정을 해줘야 한다.
> prlimit --nofile=40000 --pid=<PID_입력>
4. Maximum File Descriptor 수정 (영구 반영)
- 프로세스의 재기동이 필요하다.
> vi /etc/security/limits.conf
payment soft nofile 40000
payment hard nofile 40000
Reference
'Computer Science > OS' 카테고리의 다른 글
[CPU] Hyper Threading (하이퍼 쓰레딩) (0) | 2023.05.03 |
---|