6. [최적화3] ulimit와 PAM 설정을 통한 테스트 환경 최적화
2025. 1. 24. 23:29ㆍTest/Artillery
728x90
ulimit와 파일 디스크립터 (File Descriptor)란?
1. 파일 디스크립터(File Descriptor)란?
- 파일 디스크립터는 운영체제에서 프로세스가 파일, 소켓, 파이프 등과 같은 자원을 참조하기 위해 사용하는 추상적인 핸들
- 운영체제에서 열려 있는 파일, 소켓, 파이프 등을 나타내는 참조 번호
- 서버가 클라이언트 요청을 처리할 때, 각 연결은 파일 디스크립터를 사용하여 관리
- 예: WebSocket 연결, 데이터베이스 연결, HTTP 요청 등은 각각 파일 디스크립터를 점유
- 문제점: 기본 제한이 낮을 경우 연결 끊김, 오류 발생(
EMFILE: Too many open files
) 등이 발생가능
역할
- 연결 관리 : 클라이언트와의 각 연결은 고유한 파일 디스크립터를 사용하여 관리
- 효율적인 자원 접근 : 운영체제는 파일 디스크립터를 통해 I/O 작업(읽기, 쓰기 등)을 추적
- 제한된 리소스 관리 : 파일 디스크립터 수는 시스템 리소스에 의해 제한되므로, 서버의 처리 능력을 설정할 때 중요한 요소로 작용
2. ulimit란?
- ulimit은 Unix/Linux 운영체제에서 특정 사용자 또는 프로세스에 대한 자원 사용 한도를 설정하는 도구
- 파일 디스크립터 수 제한은
ulimit -n
옵션을 사용하여 설정
ulimit와 파일 디스크립터의 관계
- 시스템이 허용하는 최대 파일 디스크립터 수는 ulimit 값에 따라 결정
- 낮은 ulimit 값은 동시 연결 제한을 유발할 수 있으며, WebSocket, HTTP 서버에서 병목 현상 발생 가능
ulimit (파일 디스크립터 제한) 최적화
1. nofile 값 설정
설명:
nofile
은 한 프로세스가 열 수 있는 최대 파일 수를 나타내며, 각 WebSocket 연결은 파일 디스크립터(열린 파일, 소켓 포함) 사용추천 이유
- 기본 설정(1,024 또는 4,096)은 많은 WebSocket 연결 처리에 부족
- 64,535는 충분한 연결을 처리하면서 리소스를 초과하지 않는 적정 값
설정
현재 값 확인
ulimit -n
/etc/security/limits.conf
파일에 추가www-data soft nofile 65535 www-data hard nofile 65535
- 서버가 재부팅되어도 파일 디스크립터 수 제한이 유지되도록 설정
변경 사항 적용
ulimit -n 65535
재부팅 후 확인
ulimit -n
2.ulimit -n
의 최적값
- WebSocket 서버와 같은 다중 연결 환경에서는 최소 65535로 설정 권장
- 이유: 연결당 파일 디스크립터를 하나씩 사용하며, 제한이 너무 낮으면 서버가 더 이상 연결 수락 불가
실제 사용 예시
Nginx나 WebSocket 서버에서 파일 디스크립터 제한을 최적화한 사례
- Nginx 최적화와 결합:
worker_connections
값을 1024로 설정한 경우, 단일 워커 프로세스는 1024개의 동시 연결 처리- 만약 워커 프로세스가 4개라면, 총 4096개의 연결을 지원하기 위해 최소 4096 이상의 파일 디스크립터가 필요
- 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
를 추가
설정 파일 위치
- 인터랙티브 세션:
/etc/pam.d/common-session
- 비인터랙티브 세션 (cron 작업 등):
/etc/pam.d/common-session-noninteractive
설정 방법
아래 명령어로 설정 파일을 열어 수정
sudo nano /etc/pam.d/common-session sudo nano /etc/pam.d/common-session-noninteractive
다음 줄을 파일 끝에 추가
session required pam_limits.so
파일 저장 후 종료
적용 예시
/etc/security/limits.conf
설정
# 파일 디스크립터 제한
* soft nofile 65535
* hard nofile 65535
# 프로세스 제한
* soft nproc 8192
* hard nproc 8192
- : 모든 사용자에게 적용.
soft
: 사용자가 임시로 증가시킬 수 있는 제한hard
: 절대 초과할 수 없는 제한
적용 결과 확인
PAM 설정 반영을 위해 로그아웃 후 다시 로그인
현재 세션의 제한 확인
ulimit -n # 열 수 있는 파일 수 확인 ulimit -u # 실행 가능한 프로세스 수 확인
PAM 세션 로그 확인:
sudo tail -f /var/log/auth.log
왜 필요한가?
- PAM 설정이 제대로 적용되지 않으면
/etc/security/limits.conf
에 정의된 제한이 무시될 수 있음 - 발생 가능한 문제들
- 과도한 파일 또는 소켓 연결로 인한 성능 저하
- 무제한 프로세스 생성으로 인한 시스템 불안정
pam_limits.so
를 추가하면 이러한 문제를 방지하고 시스템의 안정성을 유지할 수 있음
ulimit 및 PAM 설정 최적화의 효과
테스트 환경에서 다음과 같은 효과를 얻을 수 있음
- 연결 안정성 향상 : 파일 디스크립터 수를 늘림으로써 다수의 WebSocket 연결을 처리 가능
- 오류 감소 : "Too many open files"와 같은 오류 발생률 감소
- 시스템 성능 최적화 : 클라이언트 요청 처리 능력 증가 및 서버 다운타임 방지
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% 단축 |
분석 및 개선 효과
- WebSocket 오류 감소
- WebSocket 오류가 162명 → 111명으로 약 31.5% 감소
ulimit
으로 파일 디스크립터 제한을 늘려 더 많은 동시 연결을 안정적으로 처리
- 응답 시간 안정화
- P95 응답 시간이 감소하여 대부분의 요청이 빠르게 처리
- 응답 시간: P95 응답 시간이 소폭 증가했으나, 전반적인 응답 시간은 안정적으로 유지
- 세션 지속 시간 단축
- 평균 세션 지속 시간이 약 20% 감소. 이는 시스템의 효율성 향상
- 자원 활용 최적화
- 파일 디스크립터 제한과 PAM 설정을 통해 자원 활용도가 개선됨
4. 최적화 설정 요약
- ulimit:
/etc/security/limits.conf
파일에nofile
값을 65535로 설정.
- PAM:
/etc/pam.d/common-session
와/etc/pam.d/common-session-noninteractive
에session required pam_limits.so
추가.
5. 결론
ulimit
와PAM
설정은 WebSocket 서버의 성능을 안정적으로 향상- 이번 테스트를 통해 성능 개선 효과가 명확하게 드러났으며, 이는 실제 운영 환경에서도 큰 도움이 될 수 있음
요약
- WebSocket 오류 약 31.5% 감소
- 평균 세션 지속 시간 20% 단축
- 오류 횟수는 다소 증가했지만, 실패한 VU 수가 크게 줄어듦으로써 전반적인 성능 안정성 개선
'Test > Artillery' 카테고리의 다른 글
7. [최적화4] 불필요한 서비스 비활성화 및 최적화 결과 (0) | 2025.01.25 |
---|---|
5. [최적화2] Nginx 및 WebSocket 서버 설정 최적화 (0) | 2025.01.24 |
4. [최적화 1] Node.js 프로세스 최적화 (0) | 2025.01.24 |
3. AWS EC2 t2.micro 환경에서 WebSocket 타임아웃 문제 (0) | 2025.01.16 |
2. Artillery를 활용한 Socket.IO 기반 채팅 서비스 부하 테스트: Local vs EC2 환경 성능 비교 및 분석 (0) | 2025.01.14 |