리눅스에서 파일 디스크립터를 확인하고 설정하는 방법
파일 디스크립터(File Descriptor, FD)는 유닉스 및 유닉스 계열 운영 체제에서 파일, 소켓, 파이프 등의 입출력 자원을 나타내는 정수값입니다.
파일 디스크립터에 대한 주요 개념
- 파일 디스크립터의 정의
- 시스템으로부터 할당받은 파일을 대표하는 음수가 아닌 정수 값 (0과 양수).
- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스.
- 유닉스 시스템의 모든 것
- 유닉스 시스템에서는 모든 것을 파일로 취급합니다.
- 파일 디스크립터는 정규 파일(Regular File), 디렉토리(Directory), 소켓(Socket), 파이프(PIPE), 블록 디바이스(Block Device), 캐릭터 디바이스(Character Device) 등을 포함한 모든 객체를 관리합니다.
- 파일 디스크립터의 역할
- 프로세스가 파일에 접근할 때, 파일 디스크립터를 사용합니다.
- 파일 디스크립터는 음수가 아닌 정수 값입니다 (unsigned int 값).
- 파일 디스크립터 할당 과정
- 프로세스가 실행 중에 파일을 열면 (open 시스템 콜을 호출하면), 커널은 해당 프로세스의 파일 디스크립터 목록 중 사용하지 않는 가장 작은 값을 할당합니다.
- 이후, 프로세스가 열린 파일에 접근할 때 이 파일 디스크립터를 사용하여 시스템 콜을 통해 접근합니다.
- 예시
- 표준 입력 (stdin): 파일 디스크립터 0
- 표준 출력 (stdout): 파일 디스크립터 1
- 표준 오류 (stderr): 파일 디스크립터 2
** 그룹 및 와일드카드 제한은 루트에 적용되지 않습니다.
# - NOTE: group and wildcard limits are not applied to root.
# To apply a limit to the root user, <domain> must be the literal username root.
현재 파일 디스크립터 확인
1. 특정 프로세스의 파일 디스크립터 확인
- 특정 프로세스가 사용하는 파일 디스크립터는 /proc 파일 시스템을 통해 확인할 수 있습니다.
ps -ef | grep -v grep | grep named
$ ps -ef | grep -v grep | grep named
named 2395055 1 0 May13 ? 00:01:37 /usr/local/named/sbin/named -u named
예시) 프로세스 ID가 2395055인 프로세스의 파일 디스크립터 확인
ls -l /proc/2395055/fd
각 파일 디스크립터는 해당 파일의 심볼릭 링크로 나타납니다.
2. lsof 명령어 사용
- lsof 명령어를 사용하여 특정 프로세스나 시스템 전체에서 열린 파일 디스크립터를 확인할 수 있습니다.
예시) 특정 프로세스 (PID 1234)의 열린 파일 디스크립터 확인
lsof -p 2395055
예시) 시스템 전체에서 열린 파일 디스크립터 확인
lsof
3. /proc 파일 시스템 사용
- 시스템 전체의 파일 디스크립터 제한은 /proc/sys/fs/file-nr 파일을 통해 확인할 수 있습니다.
cat /proc/sys/fs/file-nr
$ cat /proc/sys/fs/file-nr
4160 0 394313
- 첫 번째(4160) 값 : 현재 오픈된 파일 디스크립터 수
- 두 번째(0) 값 : 사용 가능한 파일 디스크립터 수
- 세 번째(394313) 값 : 시스템 전체에서 허용하는 최대 파일 디스크립터 수
4. sysctl 명령어 사용
- 현재 시스템에서 사용 중인 파일 디스크립터 수, 사용 가능한 파일 디스크립터 수, 시스템에서 허용하는 최대 파일 디스크립터 수가 포함되어 있습니다.
sysctl -n fs.file-nr
$ sysctl -n fs.file-nr
4192 0 394313
- 첫 번째(4192) 값 : 현재 오픈된 파일 디스크립터 수.
- 두 번째(0) 값 : 사용 가능한 파일 디스크립터 수
- 세 번째(394313) 값 : 시스템에서 허용하는 최대 파일 디스크립터 수
최대 파일 디스크립터 수 확인
1. /proc/sys/fs/file-max 파일 확인
/proc/sys/fs/file-max 파일에는 시스템이 허용하는 최대 파일 디스크립터 수가 저장되어 있습니다.
cat /proc/sys/fs/file-max
$ cat /proc/sys/fs/file-max
394313
2. sysctl 명령어 사용
sysctl 명령어를 사용하여 시스템 설정을 확인할 수 있습니다. fs.file-max 매개변수를 사용하여 최대 Open File 개수를 확인할 수 있습니다.
sysctl fs.file-max
fs.file-max = 1048576
또는 -n 옵션을 사용하여 값만 출력할 수 있습니다.
sysctl -n fs.file-max
$ sysctl -n fs.file-max
394313
sysctl -a | grep fs.file-max
$ sysctl -a | grep fs.file-max
fs.file-max = 394313
ulimit 명령어를 사용하여 열린 파일 디스크립터 수와 최대 프로세스 수를 설정하는 방법
열린 파일 디스크립터 수 설정 (nofile)
열린 파일 디스크립터 수는 프로세스가 동시에 열 수 있는 파일이나 소켓 등의 자원의 수를 결정합니다.
1. 현재 설정 확인
현재 설정된 파일 디스크립터 제한을 확인할 수 있습니다.
ulimit -n
2. 파일 디스크립터 제한 설정
파일 디스크립터 제한을 설정하려면 다음 명령어를 사용합니다.
ulimit -n <최대 열린 파일 디스크립터 수>
최대 열린 파일 디스크립터 수를 4096으로 설정하려면 다음과 같이 입력합니다.
ulimit -n 4096
이 설정은 현재 셸 세션에서만 유효합니다. 새로운 터미널 세션을 열 때마다 이 설정은 초기화됩니다.
3. 영구적인 설정
영구적인 설정을 위해서는 /etc/security/limits.conf 파일을 편집합니다.
sudo vim /etc/security/limits.conf
파일의 끝에 다음과 같이 추가합니다.
* soft nofile 4096
* hard nofile 8192
이렇게 하면 모든 사용자에게 소프트 제한이 4096이 되고, 하드 제한이 8192가 됩니다. 변경 사항을 적용하려면 로그아웃한 후 다시 로그인해야 합니다.
최대 프로세스 수 설정 (nproc)
최대 프로세스 수는 시스템 전체에서 실행 가능한 프로세스의 최대 수를 결정합니다.
1. 현재 설정 확인
ulimit -u
2. 최대 프로세스 수 설정
ulimit -u <최대 프로세스 수>
최대 프로세스 수를 5000으로 설정하려면 다음과 같이 입력합니다.
ulimit -u 5000
3. 영구적인 설정
영구적인 설정을 위해서는 /etc/security/limits.conf 파일을 편집합니다.
sudo vim /etc/security/limits.conf
파일의 끝에 다음과 같이 추가합니다.
* soft nproc 5000
* hard nproc 10000
이렇게 하면 모든 사용자에게 소프트 제한이 5000이 되고, 하드 제한이 10000이 됩니다. 변경 사항을 적용하려면 로그아웃한 후 다시 로그인해야 합니다.
이제 ulimit 명령어를 사용하여 파일 디스크립터 수와 최대 프로세스 수를 설정하는 방법을 알게 되었습니다.
참고URL
- lsof(list open file) 명령어 : https://scbyun.com/447
- How to set ulimit values : https://access.redhat.com/solutions/61334
'리눅스' 카테고리의 다른 글
[draft] 우분투에 Consul을 설치하고 설정하는 방법 (0) | 2023.01.26 |
---|---|
[draft] Vault를 사용하여 SSH 인증을 관리하는 방법 (0) | 2023.01.26 |
docker nettools (0) | 2023.01.25 |
[리눅스] centos에 hashicorp vault를 설치하는 방법(installing vault) (0) | 2023.01.25 |
[draft] SSH 인증을 위한 SSH 인증서를 구성하고 설정하는 방법 (0) | 2023.01.25 |