출처 : http://aqua707.cafe24.com/blog/index.php

<file descriptor에 대한 것>

(1) 언제 file descriptor를 변경해야 되는지?
      - 소켓을 사용하는 multi-threaded 프로그램 환경에서 서비스 요청이 동시에
        많이 발생하면, 서비스를 처리하는 accept() 함수가 에러를
        뿌려 주게 되지요. 아래처럼 말이죠.

        "errno=24, Too many open files"
       
          이런 경우 동시에 open() 할 수 있는 파일 갯수의 제한 때문에 변경을
          해 줄 필요가 있지요.

      - system resource를 제한할 수 있는 경우는 아래와 같습니다.
        (per-user 또는 per-process 를 기준으로 )

        1> 한 프로세스에 의해 만들어질 수 있는 core file size
        2> 한 프로세스의 Heap (process data segment)
        3> 한 프로세스에 의해 만들어질 수 있는 file size
        4> 한 프로세스가 생성할 수 있는 file descriptors
        5> 한 프로세스의 process stack segments
        6> 한 프로세스가 초당 사용할 수 있는 cpu time
        7> 한 프로세스의 Virtual memory (mapped address space)
        ** #man getrlimit 해 보면 resource definition 정보를 보실 수 있습니다.

(2) file descriptor에 대한 의미
    - 위의 7가지 경우중에서 4>번 file descriptors만이 kernel tunable 변수로서
      조정이 가능합니다. 즉 /etc/system 파일을 사용하는 경우입니다.

    - os별로 limit 값을 보면, 아래와 같습니다.
        ---------------------------------------------------------------------------------
        os ver  default(soft limit)  default(hard limit)    max(stdio)    max(select())
        ---------------------------------------------------------------------------------
        5.4~5.6          64        1024          256        1024
        5.7(32bit)      64        1024          256        65535
        5.7(64bit)      64        1024          256        65535
        5.8(32bit)      256        1024          256        65535
        5.8(64bit)      256        1024          256        65535
        5.9(32bit)      256      65535          256        65535
        5.9(64bit)      256        65535          256        65535
        ---------------------------------------------------------------------------------
        ** 위에서 32bit 인 경우 max(select())의 경우는 source code에
              아래의 line을 추가한 뒤에 recompile이 필요합니다.
              >  #define FD_SETSIZE 65535
                  #include <sys/select.h>
                  (설명)
                        - FD_SETSIZE : library file descriptor limit 입니다.
                        - library limit값이 조정이 된 후에는 system의 file descriptors
                            의 조정이 필요합니다. 이 값을 /etc/system에 아래처럼
                            추가하는 겁니다. 당연히 reboot 필요합니다.
                            set rlim_fd_cur=1024
                            set rlim_fd_max=65535

        - Berkeley stdio.h를 이용하는 경우(fopen/fclose/fread/fwrite) per-process
          당 open할 수 있는 maximum fd 갯수는 256 입니다.

          DB서버 나 웹서버가 아닌 대부분의 application에서는 256 보다 크게 변경할
          필요가 전혀 없습니다.  때때로 이 값이 1024보다 크게 설정했을 경우, select.h
          함수에 선언되어 있는 fd_set 같은 structure 경우는 maximum fd를 1023으로
          간주하기 때문에 이 범위를 벗어나는 경우 memory space의 문제가 야기 됩니다.
          위의 fd_set structure는 select() 함수에 의해서 사용이 됩니다.

          solaris 7,8 등의 경우 현재 돌고 있는 프로세스에 대한 hard/soft  limit 값을
          변경할 수 있습니다. 아래처럼 말입니다.

          #plimit <pid> (현재 설정된 값을 확인할 수 있습니다)
          #plimit -n <soft>,<hard> <pid> (단, soft limit은 hard limit값을 초과하면 안됨)

(3) file descriptor 변경하는 3가지 방법
    1) ulimit 을 이용하는 방법
      - 이 방법은 현재 쉘에서 soft limit 값만을 변경해 줍니다.
          > default 값 : 64 (SunOS 5.8 미만 버젼)
          > 변경 범위: hard limit 값 < 변경할 값 < default 값(soft limit값)
      - #ulimit -n <변경할 값>
         
    2) setrlimit 함수를 사용하는 방법
        - 이 방법은 hard and soft limit 모두 변경을 합니다.
          단, hard limit 변경을 위해서 root 권한이 필요합니다.
       
    3) /etc/system 파일에 넣어 주는 방법
        - 이 방법은 hard and soft limit 모두 변경을 합니다.
        - set rlim_fd_cur=4096
          set rlim_fd_max=4096
          이런식으로 설정하는 방법입니다.
          (의미)
                > rlim_fd_max : 한 프로세스가 open할 수 있는 파일의 갯수
                                        Hard Limit 임.
                > rlim_fd_cur : 모든 쉘에서 사용하는 기본값

+ Recent posts