개발

ulimit 명령어와 Select, Poll 함수

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