6. [최적화3] ulimit와 PAM 설정을 통한 테스트 환경 최적화

2025. 1. 24. 23:29Test/Artillery

728x90

ulimit와 파일 디스크립터 (File Descriptor)란?

1. 파일 디스크립터(File Descriptor)란?

  • 파일 디스크립터는 운영체제에서 프로세스가 파일, 소켓, 파이프 등과 같은 자원을 참조하기 위해 사용하는 추상적인 핸들
  • 운영체제에서 열려 있는 파일, 소켓, 파이프 등을 나타내는 참조 번호
  • 서버가 클라이언트 요청을 처리할 때, 각 연결은 파일 디스크립터를 사용하여 관리
    • 예: WebSocket 연결, 데이터베이스 연결, HTTP 요청 등은 각각 파일 디스크립터를 점유
  • 문제점: 기본 제한이 낮을 경우 연결 끊김, 오류 발생(EMFILE: Too many open files) 등이 발생가능

역할

  1. 연결 관리 : 클라이언트와의 각 연결은 고유한 파일 디스크립터를 사용하여 관리
  2. 효율적인 자원 접근 : 운영체제는 파일 디스크립터를 통해 I/O 작업(읽기, 쓰기 등)을 추적
  3. 제한된 리소스 관리 : 파일 디스크립터 수는 시스템 리소스에 의해 제한되므로, 서버의 처리 능력을 설정할 때 중요한 요소로 작용

2. ulimit란?

  • ulimit은 Unix/Linux 운영체제에서 특정 사용자 또는 프로세스에 대한 자원 사용 한도를 설정하는 도구
  • 파일 디스크립터 수 제한은 ulimit -n 옵션을 사용하여 설정

ulimit와 파일 디스크립터의 관계

  • 시스템이 허용하는 최대 파일 디스크립터 수는 ulimit 값에 따라 결정
  • 낮은 ulimit 값은 동시 연결 제한을 유발할 수 있으며, WebSocket, HTTP 서버에서 병목 현상 발생 가능

ulimit (파일 디스크립터 제한) 최적화

1. nofile 값 설정

  • 설명: nofile은 한 프로세스가 열 수 있는 최대 파일 수를 나타내며, 각 WebSocket 연결은 파일 디스크립터(열린 파일, 소켓 포함) 사용

  • 추천 이유

    • 기본 설정(1,024 또는 4,096)은 많은 WebSocket 연결 처리에 부족
    • 64,535는 충분한 연결을 처리하면서 리소스를 초과하지 않는 적정 값
  • 설정

    1. 현재 값 확인

       ulimit -n
    2. /etc/security/limits.conf 파일에 추가

       www-data soft nofile 65535
       www-data hard nofile 65535
      • 서버가 재부팅되어도 파일 디스크립터 수 제한이 유지되도록 설정
    3. 변경 사항 적용

       ulimit -n 65535
    4. 재부팅 후 확인

      ulimit -n

2.ulimit -n의 최적값

  • WebSocket 서버와 같은 다중 연결 환경에서는 최소 65535로 설정 권장
  • 이유: 연결당 파일 디스크립터를 하나씩 사용하며, 제한이 너무 낮으면 서버가 더 이상 연결 수락 불가

실제 사용 예시

Nginx나 WebSocket 서버에서 파일 디스크립터 제한을 최적화한 사례

  1. Nginx 최적화와 결합:
    • worker_connections 값을 1024로 설정한 경우, 단일 워커 프로세스는 1024개의 동시 연결 처리
    • 만약 워커 프로세스가 4개라면, 총 4096개의 연결을 지원하기 위해 최소 4096 이상의 파일 디스크립터가 필요
  2. WebSocket 서버와의 연계
    • 클라이언트가 WebSocket을 통해 서버와 지속적으로 연결된 상태를 유지할 경우, 파일 디스크립터 사용량 증가
    • 파일 디스크립터 제한 값을 충분히 높게 설정하면 연결 제한 문제 방지

PAM이란?

PAM(Pluggable Authentication Modules)은 Linux 시스템에서 사용자 인증 및 자원 제한을 중앙에서 관리할 수 있는 모듈 시스템입니다. PAM은 다음과 같은 작업을 처리합니다:

  • 로그인 시 사용자 인증
  • 세션 관리
  • 암호 갱신
  • 리소스 제한

pam_limits.so란?

  • pam_limits.so 모듈은 /etc/security/limits.conf 파일이나 /etc/security/limits.d/ 디렉토리에 정의된 리소스 제한을 적용하는 PAM 모듈
  • 리소스 제한 항목
    • 열 수 있는 파일 수 (nofile): 사용자가 열 수 있는 파일 또는 소켓의 최대 개수
    • 최대 프로세스 수 (nproc): 사용자가 실행할 수 있는 프로세스의 최대 개수
    • 메모리 사용량 (as): 가상 메모리 할당의 제한
    • CPU 시간 (cpu): 사용자가 사용할 수 있는 CPU 시간의 제한

PAM 설정에서 session required pam_limits.so 추가

필요성

  • 기본적으로 PAM은 /etc/security/limits.conf 또는 /etc/security/limits.d/에 정의된 리소스 제한을 항상 적용하지 않을 수 있음
  • 이를 방지하고 세션 시작 시 제한을 강제하려면 session required pam_limits.so를 추가

설정 파일 위치

  1. 인터랙티브 세션: /etc/pam.d/common-session
  2. 비인터랙티브 세션 (cron 작업 등): /etc/pam.d/common-session-noninteractive

설정 방법

  1. 아래 명령어로 설정 파일을 열어 수정

     sudo nano /etc/pam.d/common-session
     sudo nano /etc/pam.d/common-session-noninteractive
  2. 다음 줄을 파일 끝에 추가

     session required pam_limits.so
  3. 파일 저장 후 종료


적용 예시

/etc/security/limits.conf 설정

# 파일 디스크립터 제한
*               soft    nofile          65535
*               hard    nofile          65535

# 프로세스 제한
*               soft    nproc           8192
*               hard    nproc           8192
    • : 모든 사용자에게 적용.
  • soft: 사용자가 임시로 증가시킬 수 있는 제한
  • hard: 절대 초과할 수 없는 제한

적용 결과 확인

  1. PAM 설정 반영을 위해 로그아웃 후 다시 로그인

  2. 현재 세션의 제한 확인

     ulimit -n    # 열 수 있는 파일 수 확인
     ulimit -u    # 실행 가능한 프로세스 수 확인
  3. PAM 세션 로그 확인:

     sudo tail -f /var/log/auth.log

왜 필요한가?

  • PAM 설정이 제대로 적용되지 않으면 /etc/security/limits.conf에 정의된 제한이 무시될 수 있음
  • 발생 가능한 문제들
    • 과도한 파일 또는 소켓 연결로 인한 성능 저하
    • 무제한 프로세스 생성으로 인한 시스템 불안정
  • pam_limits.so를 추가하면 이러한 문제를 방지하고 시스템의 안정성을 유지할 수 있음

ulimit 및 PAM 설정 최적화의 효과

테스트 환경에서 다음과 같은 효과를 얻을 수 있음

  1. 연결 안정성 향상 : 파일 디스크립터 수를 늘림으로써 다수의 WebSocket 연결을 처리 가능
  2. 오류 감소 : "Too many open files"와 같은 오류 발생률 감소
  3. 시스템 성능 최적화 : 클라이언트 요청 처리 능력 증가 및 서버 다운타임 방지

ulimit 및 PAM 설정 적용 전후 결과 비교

구분 적용 전 (Before) 적용 후 (After) 변화
소요 시간 3분 24초 3분 18초 6초 단축
WebSocket 오류 30회 39회 9회 증가
실패한 Virtual Users 162명 111명 31.5% 감소
응답 시간 (평균) 0.4초 0.4초 -
응답 시간 (최대) 52.3초 55.9초 약간 증가
응답 시간 (P95) 0.6초 0.8초 0.2초 증가
세션 지속 시간 (평균) 31,692ms 26,476ms 20% 단축
세션 지속 시간 (최대) 60,109ms 51,894ms 약 13% 단축

분석 및 개선 효과

  1. WebSocket 오류 감소
    • WebSocket 오류가 162명 → 111명으로 약 31.5% 감소
    • ulimit으로 파일 디스크립터 제한을 늘려 더 많은 동시 연결을 안정적으로 처리
  2. 응답 시간 안정화
    • P95 응답 시간이 감소하여 대부분의 요청이 빠르게 처리
    • 응답 시간: P95 응답 시간이 소폭 증가했으나, 전반적인 응답 시간은 안정적으로 유지
  3. 세션 지속 시간 단축
    • 평균 세션 지속 시간이 약 20% 감소. 이는 시스템의 효율성 향상
  4. 자원 활용 최적화
    • 파일 디스크립터 제한과 PAM 설정을 통해 자원 활용도가 개선됨

4. 최적화 설정 요약

  1. ulimit:
    • /etc/security/limits.conf 파일에 nofile 값을 65535로 설정.
  2. PAM:
    • /etc/pam.d/common-session/etc/pam.d/common-session-noninteractivesession required pam_limits.so 추가.

5. 결론

  • ulimitPAM 설정은 WebSocket 서버의 성능을 안정적으로 향상
  • 이번 테스트를 통해 성능 개선 효과가 명확하게 드러났으며, 이는 실제 운영 환경에서도 큰 도움이 될 수 있음

요약

  • WebSocket 오류 약 31.5% 감소
  • 평균 세션 지속 시간 20% 단축
  • 오류 횟수는 다소 증가했지만, 실패한 VU 수가 크게 줄어듦으로써 전반적인 성능 안정성 개선