ulimit는 프로세스의 자원 한도를 설정하는 명령어로 Soft와 hard 두 가지로 분류됩니다.
Soft 한도 - 새로운 프로그램을 생성하면 기본적으로 적용되는 한도
Hard 한도 - soft 한도에서 최대로 늘릴 수 있는 한도
Soft, Hard 한도를 조회하는 명령어는 다음과 같습니다.
ulimit -Sa
ulimit -Ha
여기서 open files와 max user processes를 보도록 하겠습니다.
open files는 프로세스가 가질 수 있는 파일 수를 의미합니다. (소켓 포함)
max user processes는 사용자가 사용 가능한 파일의 프로세스의 개수를 의미합니다.
다음과 같은 명령어로 파일과 프로세스 한도를 조정할 수 있습니다.
ulimit -u 8192 -n 65536
이 명령어는 재부팅 시 초기화됩니다.
이를 영구 설정하기 위한 방법으로 /etc/security/limits.conf 파일을 수정합니다.
[user id] soft nofile 2048-> 65536
[user id] hard nofile 2048 -> 65536
이제 오픈할 수 있는 파일 수가 65536으로 증가했습니다.
이때 주의해야 할 부분이 있습니다.
소켓 통신으로 Select 함수를 사용한다면 __FD_SETSIZE도 함께 수정해 주어야 합니다.
예를 들어, 10000번째 파일로 소켓을 생성하면 Select 함수가 오류를 반환합니다.
다음은 오류의 일부입니다.
#5 0x00007ffff6db4bc0 in __GI___chk_fail () at chk_fail.c:28
#6 0x00007ffff6db6dba in __fdelt_chk (d=<optimized out>) at fdelt_chk.c:25
#7 0x00007fffe7957552 in Socket_Connect () from /home/Test/
__fdl_chk는 glibc/debug/fdelt_chk.c에서 확인할 수 있습니다. code.woboq.org/userspace/glibc/debug/fdelt_chk.c.html
unsigned long int
__fdelt_chk (unsigned long int d)
{
if (d < 0 || d >= FD_SETSIZE)
__chk_fail ();
return d / __NFDBITS;
}
strong_alias (__fdelt_chk, __fdelt_warn)
FD_SETSIZE 조건에 의해서 __chk_fail() 함수가 동작한 것을 확인할 수 있습니다.
__chk_fail (void)
{
__fortify_fail ("buffer overflow detected");
}
소켓 관련 함수 중 Select 함수는 __FD_SETSIZE를 기준으로 동작합니다. 이 값을 변경하지 않으면 고정된 1024로 동작합니다.
오류를 해결하기 위해 /usr/include/bits/typesizes.h 내에 __FD_SETSIZE를 수정합니다.
리눅스 커널을 건드리는 부분이기에 다소 꺼림칙할 수 있습니다.
다른 방법으로 Select 함수와 동일한 Poll 함수를 사용합니다. Poll 함수는 __FD_SETSIZE에 관계없이 동작합니다.
int poll(struct poolfd *ufds, unsigned int nfds, int timeout);
- ufds - 결과값을 저장하는 구조체
- nfds - 설정된 struct pollfd 구조체의 개수
- timeout - milliseconds(1/1000초), 0을 설정하면 바로 return 됩니다. -로 설정하면 이벤트 발생 시까지 기다립니다.
return 값
- Non-negative number : I/O가 준비된 디스크립터 수
- -1 : 오류, 오류 정보는 errno에서 확인할 수 있습니다.
- 0 : timeout
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};
open files를 증가하는 경우 Select 함수에서 발생하는 오류를 알아보았습니다. __FD_SETSIZE를 수정하거나 Poll 함수로 변경하여 문제를 해결하였습니다.
혹시 잘못된 사항이나 궁금하신 점은 댓글 부탁드립니다. 감사합니다.
'개발' 카테고리의 다른 글
linux kernel, vscode 연동 (0) | 2020.12.03 |
---|---|
Wrapper 함수 생성 (0) | 2020.10.23 |
The file couldn’t be opened because you don’t have permission to view it. (0) | 2020.10.07 |
호출 규약 (0) | 2020.09.22 |
PFX 인증서 생성 (0) | 2020.06.19 |