본문 바로가기

Engineering/__00. Linux

maximum file count

(출처) http://meetup.toast.com/posts/54, http://board.theko.co.kr/bbs/board.php?bo_table=B11&wr_id=140


  • 시스템에서 현재 Open 되어 있는 파일 개수 확인 과 관련하여, limits.conf 와 sysctl.conf 의 차이점이 있다. sysctl.conf 는 시스템에서 전체 File Open 개수를 설정하고, limits.conf 는 계정별로 File Open 을 설정한다.

  • 시스템의 전체 File Open 개수 확인 하기
    (fs.nr_open 파라미터는 하나의 프로세스가 열 수 있는 최대 파일 개수)

    •  cat /proc/sys/fs/file-nr 
      3328   0   97764

      3328 - 현재 오픈 가능한 최대 파일 개수 
      0 - 커널에서 현재 사용중인 파일 수 
      97764 - 커널에서 최대로 오픈할 수 있는 파일 수 

    • # lsof | wc -l // 현재 시스템에서 오픈되어 있는 파일의 개수 
      1813  

  • 리눅스 시스템에서 최대 File Open 개수 확인 및 적용 하기 
    (fs.file-max 파라미터는 시스템 전체에서 최대로 열 수 있는 파일 개수)

    • #sysctl -a | grep fs.file-max  // 설정된 값 확인하기
      fs.file-max = 97175

    • #vim /etc/sysctl.conf // 파일 수정
      fs.file-max = 98175

    • #sysctl -p // 설정 값 적용

    • # sysctl -a | grep fs.file-max // 적용된 값 확인하기
      fs.file-max = 98175

    • #cat /proc/sys/fs/file-max // 해당 파일에서도 직접 확인할 수 있다.
      98175

  • 리눅스 계정 별 최대 File Open 개수 확인 및 제한 하기 

    • # ulimit -a | grep open  // 설정된 값 확인하기
      open files                      (-n) 8192

      또는 

      # ulimit -n 
      8192

    • # vim /etc/security/limits.conf // user1 의 File Open 개수 제한 설정 하기 
      user1            soft    nofile          2048
      user1            hard    nofile          2048

    • # su - user1 // user1 로 스위칭하여 적용된 값 확인하기
      $ ulimit -a | grep open
      open files                      (-n) 2048

    • $ ulimit -n // 적용된 값 확인하기
      2048

    • $ lsof -u UID(user1) | wc -l // user1 의 UID 로 열려 있는 파일 개수 확인하기
      51

  • 각각의 파라미터의 연관 관계
    fs.file-max >= fs.nr_open >= ulimit -n 

  • RHEL 버전별 fs.nr_open 과 fs.file_max 의 기본 값
    • RHEL4 (fs.nr_open / fs.file_max)
      1048576 / 203450

    • RHEL5 (fs.nr_open / fs.file_max)
      1048576 / 102249

    • RHEL6 (fs.nr_open / fs.file_max)
      1048576 / 98852


4. 네트워크 capacity 관련 파라미터

4.1 maximum file count

리눅스를 비롯한 일반적인 유닉스에서 소켓은 마치 파일과 같은 취급을 받습니다.
전체 시스템에서 가질 수 있는 파일 개수가 제한이 있다면, 당연히 소켓의 전체 개수에 영향 미칠 것 입니다.

리눅스에서 전체 시스템이 가질 수 있는 최대 파일 개수 제한은 'fs.file-max' 커널 파라미터에서 설정 됩니다.

현재 설정값을 확인하려면, 아래와 같은 명령어를 사용합니다.

$ sysctl fs.file-max
fs.file-max = 775052

이 값은 일반적으로 적당히 큰 값이 설정되어 있으므로, 웬만하면 손 볼 일이 없을 것입니다.
다만, 시스템이 굉장히 많은 파일과 소켓을 사용하는 경우, 이 값에 의해 시스템이 오동작 할 수 있으니 참고바랍니다.
(이 값을 넘어가면 open() 시스템 콜에서 'Too many open files'와 같은 에러가 발생 될 것 입니다.)

다시 말하자면, 시스템 전체에 대한 허용 소켓 개수는 'fs-file-max' 커널 파라미터 설정값이 적당히 높게 설정되어 있으므로 큰 문제가 안됩니다.
사실, 어떤 프로세스가 가질 수 있는 소켓 개수 제약은 그보다는 프로세스별 제한 설정인 user limit 값을 살펴봐야 할 것 입니다.
다음과 같은 명령어로 이를 확인할 수 있습니다.

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30473
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 30473
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

여기서 open files가 프로세스가 가질 수 있는 소켓 포함 파일 개수입니다.
적당량 증가시키기 위해서는 다음과 같은 명령어를 사용합니다.

$ ulimit -SHn 65535

많은 개수의 소켓을 사용하는 서버 프로그램은 구동하기 전, ulimit 명령어로 프로세스 당 최대 파일 개수를 증가시켜주어야 할 것 입니다.
(혹은, 해당 애플리케이션 로직내에서 setrlimit() 시스템 콜로 이를 증가시키는 방법도 있습니다.)

'fs.file-max'와 유사한 이름의 'fs.file-nr'이라는 커널 파라미터가 있는데, 사실 이 파라미터는 일반적인 파라미터가 아니라 현재 열려 있는 파일 현황을 나타냅니다.
아래와 같은 명령어로 현재 현황을 알 수 있습니다.

$ sysctl fs.file-nr
fs.file-nr = 5024    0    775052 

세 값은 각각 현재 열려 있는 파일의 수, 현재 열려 있으나 사용되지 않는 파일의 수, 열 수 있는 파일의 최대 개수를 뜻합니다. 물론 시스템 전체에 대한 수치입니다.


'Engineering > __00. Linux' 카테고리의 다른 글

AES-NI  (0) 2018.06.27
uuid , fstab, ntfs ntfs-3g mount  (0) 2018.03.24
[Ubuntu] system boot problem  (0) 2017.04.24
[NFS RPC]  (0) 2017.02.22
[SSH] alive  (0) 2016.11.08