Linux file descriptor 제한 늘리기
로빈아빠
본문
Linux 프로그램은 기본적으로 stdin, stdout, stderr 3개의 파일 디스크립터를 사용한다. 여기에 다가 file을 오픈하거나 Socket을 오픈하는 것도 파일 디스크립터를 하나씩 점유하게 된다. 다수의 요청을 처리하는 소켓 프로그램의 경우 너무 많은 요청이 들어 올 경우 파일 디스크립터의 수가 제한 되어 'too many open file'과 같은 에러가 발생하게 된다.
쉘에서 ulimit -a 명령어를 사용하면 현재 커널에 할당되어 있는 정보를 볼 수 있다.
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
max nice (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 8064
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
max rt priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 8064
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
file locks (-x) unlimited
data seg size (kbytes, -d) unlimited
max nice (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 8064
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
max rt priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 8064
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
file locks (-x) unlimited
위 항목중 open files 항목이 하나의 프로세스에서 열 수 있는 파일 디스크립터의 수 이다. ulimit -n 명령어를 사용하여 설정 할 수도 있으나 여기에서는 C 언어에서 할당하는 방법을 알아보자
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
int getrlimit (int resource, struct rlimit *rlim);
int setrlimit (int resource, const struct rlimit *rlim);
struct rlimit
{
rlim_t rlim_cur; //soft
rlim_t rlim_max; //hard
};
#include <sys/resource.h>
#include <unistd.h>
int getrlimit (int resource, struct rlimit *rlim);
int setrlimit (int resource, const struct rlimit *rlim);
struct rlimit
{
rlim_t rlim_cur; //soft
rlim_t rlim_max; //hard
};
사용법은 아래와 같다.
void print_rlim()
{
struct rlimit limit;
getrlimit(RLIMIT_NOFILE, &limit);
printf("cur=%lu max=%lu\n", limit.rlim_cur, limit.rlim_max);
}
void set_rlim()
{
struct rlimit limit;
limit.rlim_cur = 20480lu;
limit.rlim_max = 20480lu;
setrlimit(RLIMIT_NOFILE, &limit);
}
{
struct rlimit limit;
getrlimit(RLIMIT_NOFILE, &limit);
printf("cur=%lu max=%lu\n", limit.rlim_cur, limit.rlim_max);
}
void set_rlim()
{
struct rlimit limit;
limit.rlim_cur = 20480lu;
limit.rlim_max = 20480lu;
setrlimit(RLIMIT_NOFILE, &limit);
}
관련링크
- http://www.onurmark.co.kr 1200회 연결
댓글목록
등록된 댓글이 없습니다.