시냅스

Spring 과 Ulimit, Socket 자원 관리에 대해 본문

Java, Spring

Spring 과 Ulimit, Socket 자원 관리에 대해

ted k 2023. 3. 5. 16:36

Spring 과 Ulimit

tomcat 에서는 별도의 설정이 없다면 max connection 은 10,000개 max thread는 200개로 설정됩니다.

네트워크 장애가 발생될 떄 was의 현황에 대해서 가장 먼저 살펴보며 connection pool 에 문제가 없고

computing power (CPU, Memory 등)에도 문제가 없다면 무엇을 가장 의심해야 할까요?

 

File Descriptor

https://liltdevs.tistory.com/70

 

C언어 fd : 파일 디스크립터 (File Descriptor)

파일 디스크립터 (File Descriptor) Unix OS에서 모든 것은 파일로 관리되는데 이러한 파일에 접근할 때 파일 디스크립터 라는 개념을 이용한다. 파일은 일반적인 정규 파일, 디렉토리, 소켓, 파이프,

liltdevs.tistory.com

 

Linux 에서 모든 것은 파일로 관리됩니다.

Network 통신 (혹은 Database connection)을 하며 주고 받는 Socket 또한 결국 File에 불과합니다.

실행되는 프로세스(spring application이라고 하겠습니다)는 각각 가질 수 있는 FD Table이 존재합니다.

프로세스는 FD Table로 하여금 파일에 접근할 수 있게 됩니다.

그러므로 우리가 실행하는 spring application은 FD Table에서 Socket을 사용하여 통신을 하게 되는 것입니다.

 

Ulimit

OPEN_MAX 는 <limits.h> 에 정의된 FD 를 open 할 수 있는 MAX 값 입니다.

다만 이 값은 특정 OS에서는 정의가 되어있지 않기도 하고, system의 상황에 따라서 바뀔 수 있습니다.

따라서 시스템 단위에서 설정할 수 있는 수단이 필요합니다.

 

Ulimit은 실행되는 프로세스가(우리의 spring application) 사용할 수 있는 자원의 양을 제한하는 명령어입니다.

한 프로세스에서 File을 Open할 수 있는 모든 자원을 독점한다면 문제가 될 수 있습니다.

하나의 machine에서 다수의 server 를 운용한다면 더욱 그럴 것입니다.

그러므로 Ulimit 을 사용하여 프로세스 마다 open 할 수 있는 fd 값을 정의해 자원을 관리할 수 있게합니다.

 

Soft vs Hard

  • Soft
    • 현재 적용되는 제한 값 → 사용 중인 자원의 양과 무관하게 변경 가능
  • Hard
    • 최대 제한 값 → 소프트 제한 값을 하드 제한 값으로 올릴 수 있음
  • 예를 들면, soft 1024, hard 2048 인 경우 1024개를 초과하면 file open 을 거부하지만, soft 값을 동적으로 조정할 수 있다.
  • jdk 에서는 부족한 soft 값 만큼 hard 이하로 자동으로 설정하게 된다.

 

관련 설정

  • -a
    • 모든 리소스 한계값 출력
  • -c
    • core 파일의 최대 크기 설정
  • -d
    • 데이터 세그먼트의 최대 크기 설정
  • -f
    • 파일 크기의 최대값 설정
  • -i
    • 프로세스가 샐성할 수 있는 파일의 최대 개수 설정
  • -l
    • 프로세스가 사용할 수 있는 메모리 최대값 설정
  • -m
    • 프로세스가 사용할 수 있는 메모리 최대값 설정
  • -n
    • 프로세스가 열 수 있는 파일 디스크립터의 최대 개수 설정
  • -p
    • 프로세스의 최대 프로세스 ID 설정
  • -q
    • 프로세스가 대기열에 놓을 수 있는 시그널의 최대 개수 설정
  • -r
    • 프로세스가 실행할 수 있는 최대 우선순위 설정
  • -s
    • 프로세스가 생성할 수 있는 스택의 최대 크기 설정
  • -t
    • 프로세스가 사용할 수 있는 CPU 시간의 최대값 설정
  • -u
    • 프로세스가 생성할 수 있는 최대 사용자 프로세스 개수 설정
    • Linux 에서 프로세스와 스레드는 동일한 개념으로 보므로 thread 생성에도 영향을 미친다.
    • max user process 라는 설정명을 갖는다.
  • -v
    • 프로세스가 사용할 수 있는 가상 메모리의 최대 크기 설정

 

ulimit -n 10000

위와 같이 설정하면 파일 디스크립터의 최대 개수를 10000개로 설정하게 됩니다.

다만 이 값은 현재 세션에서만 유효하며 영구적인 설정을 하기 위해선

/etc/security/limits.conf 파일을 수정하여야 합니다.

 

https://techblog.woowahan.com/2569/

위와 같은 모습으로 사용자 별로 지정할 수 있고,

현재는 * 로 모든 사용자에게 지정되어 있는 모습입니다.

Comments