본문 바로가기

리눅스

[draft] 리눅스에서 파일 디스크립터를 확인하고 설정하는 방법

728x90

리눅스에서 파일 디스크립터를 확인하고 설정하는 방법

파일 디스크립터(File Descriptor, FD)는 유닉스 및 유닉스 계열 운영 체제에서 파일, 소켓, 파이프 등의 입출력 자원을 나타내는 정수값입니다.

파일 디스크립터에 대한 주요 개념

  1. 파일 디스크립터의 정의
    • 시스템으로부터 할당받은 파일을 대표하는 음수가 아닌 정수 값 (0과 양수).
    • 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스.
  2. 유닉스 시스템의 모든 것
    • 유닉스 시스템에서는 모든 것을 파일로 취급합니다.
    • 파일 디스크립터는 정규 파일(Regular File), 디렉토리(Directory), 소켓(Socket), 파이프(PIPE), 블록 디바이스(Block Device), 캐릭터 디바이스(Character Device) 등을 포함한 모든 객체를 관리합니다.
  3. 파일 디스크립터의 역할
    • 프로세스가 파일에 접근할 때, 파일 디스크립터를 사용합니다.
    • 파일 디스크립터는 음수가 아닌 정수 값입니다 (unsigned int 값).
  4. 파일 디스크립터 할당 과정
    • 프로세스가 실행 중에 파일을 열면 (open 시스템 콜을 호출하면), 커널은 해당 프로세스의 파일 디스크립터 목록 중 사용하지 않는 가장 작은 값을 할당합니다.
    • 이후, 프로세스가 열린 파일에 접근할 때 이 파일 디스크립터를 사용하여 시스템 콜을 통해 접근합니다.
  5. 예시
    • 표준 입력 (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

각 파일 디스크립터는 해당 파일의 심볼릭 링크로 나타납니다.

fd

2. lsof 명령어 사용

  • lsof 명령어를 사용하여 특정 프로세스나 시스템 전체에서 열린 파일 디스크립터를 확인할 수 있습니다.

예시) 특정 프로세스 (PID 1234)의 열린 파일 디스크립터 확인

lsof -p 2395055

lsof

예시) 시스템 전체에서 열린 파일 디스크립터 확인

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
728x90

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

 

 

728x90