개요
|Fess|에는 CPU 사용률에 기반하여 시스템 안정성을 보호하는 두 가지 유형의 부하 제어 기능이 있습니다.
HTTP 요청 부하 제어 (web.load.control / api.load.control):
OpenSearch 클러스터의 CPU 사용률을 실시간으로 모니터링
웹 요청과 API 요청에 대해 독립적인 임계값 설정 가능
임계값을 초과하면 HTTP 429 (Too Many Requests)를 반환
관리 화면, 로그인, 정적 리소스는 제어 대상 제외
기본적으로 비활성화 (임계값=100)
적응형 부하 제어 (adaptive.load.control):
Fess 서버 자체의 시스템 CPU 사용률을 모니터링
크롤링, 인덱싱, 서제스트 업데이트, 썸네일 생성 등의 백그라운드 작업을 자동으로 스로틀링
CPU 사용률이 임계값 이상일 때 처리 스레드가 일시 대기하며, 임계값 아래로 떨어지면 재개
기본적으로 활성화 (임계값=50)
HTTP 요청 부하 제어 설정
``fess_config.properties``에 다음 속성을 설정합니다:
# 웹 요청의 CPU 사용률 임계값(%)
# CPU 사용률이 이 값 이상일 때 요청을 거부
# 100으로 설정하면 비활성화 (기본값: 100)
web.load.control=100
# API 요청의 CPU 사용률 임계값(%)
# CPU 사용률이 이 값 이상일 때 요청을 거부
# 100으로 설정하면 비활성화 (기본값: 100)
api.load.control=100
# CPU 사용률 모니터링 간격(초)
# OpenSearch 클러스터의 CPU 사용률을 가져오는 간격
# 기본값: 1
load.control.monitor.interval=1
참고
web.load.control``과 ``api.load.control 모두 100(기본값)인 경우, 부하 제어 기능은 완전히 비활성화되며 모니터링도 시작되지 않습니다.
동작 원리
모니터링 메커니즘
부하 제어가 활성화된 경우(임계값 중 하나가 100 미만), LoadControlMonitorTarget이 주기적으로 OpenSearch 클러스터의 CPU 사용률을 모니터링합니다.
OpenSearch 클러스터의 모든 노드에서 OS 통계 정보를 가져옴
모든 노드 중 가장 높은 CPU 사용률을 기록
``load.control.monitor.interval``에서 지정한 간격(기본값 1초)마다 모니터링
모니터링은 지연 초기화로 첫 번째 요청 시 시작
참고
모니터링 정보 가져오기에 실패하면 CPU 사용률은 0으로 리셋됩니다. 연속 3회 실패하면 로그 레벨이 WARNING에서 DEBUG로 변경됩니다.
요청 제어
요청이 도착하면 LoadControlFilter가 다음 순서로 처리합니다:
대상 제외 경로인지 확인 (제외 대상이면 그대로 통과)
요청 종류 (웹 / API) 판정
해당 임계값 가져오기
임계값이 100 이상이면 제어하지 않음 (그대로 통과)
현재 CPU 사용률과 임계값 비교
CPU 사용률 >= 임계값인 경우 HTTP 429 반환
제어 대상 제외 요청:
``/admin``으로 시작하는 경로 (관리 화면)
``/error``로 시작하는 경로 (오류 페이지)
``/login``으로 시작하는 경로 (로그인 페이지)
정적 리소스 (
.css,.js,.png,.jpg,.gif,.ico,.svg,.woff,.woff2,.ttf,.eot)
웹 요청의 경우:
HTTP 429 상태 코드를 반환
오류 페이지 (
busy.jsp)를 표시
API 요청의 경우:
HTTP 429 상태 코드를 반환
JSON 응답을 반환:
{
"response": {
"status": 9,
"message": "Server is busy. Please retry after 60 seconds.",
"retry_after": 60
}
}
설정 예시
웹 요청만 제한하기
웹 검색 요청만 제한하고 API는 제한하지 않는 설정:
# 웹: CPU 사용률 80% 이상에서 요청 거부
web.load.control=80
# API: 제한 없음
api.load.control=100
# 모니터링 간격: 1초
load.control.monitor.interval=1
웹과 API 모두 제한하기
웹과 API에 다른 임계값을 설정하는 예:
# 웹: CPU 사용률 70% 이상에서 요청 거부
web.load.control=70
# API: CPU 사용률 80% 이상에서 요청 거부
api.load.control=80
# 모니터링 간격: 2초
load.control.monitor.interval=2
참고
API 임계값을 웹보다 높게 설정하면, 고부하 시 먼저 웹 요청을 제한하고, 부하가 더 높아지면 API 요청도 제한하는 단계적 제어가 가능합니다.
속도 제한과의 차이
|Fess|에는 부하 제어와 별도로 속도 제한 설정 기능이 있습니다. 이 두 기능은 서로 다른 접근 방식으로 시스템을 보호합니다.
| 항목 | 속도 제한 | 부하 제어 |
|---|---|---|
| 제어 기준 | 요청 수 (단위 시간당) | OpenSearch CPU 사용률 |
| 목적 | 과도한 요청 방지 | 검색 엔진의 고부하 보호 |
| 제한 단위 | IP 주소별 | 시스템 전체 |
| 응답 | HTTP 429 | HTTP 429 |
| 적용 대상 | 전체 HTTP 요청 | 웹 요청 / API 요청 (관리 화면 등 제외) |
두 기능을 함께 사용하면 더 견고한 시스템 보호가 가능합니다.
적응형 부하 제어
적응형 부하 제어는 Fess 서버 자체의 시스템 CPU 사용률에 기반하여 백그라운드 작업의 처리 속도를 자동으로 조정하는 기능입니다.
설정
fess_config.properties:
# 적응형 부하 제어의 CPU 사용률 임계값(%)
# 시스템 CPU 사용률이 이 값 이상이면 백그라운드 작업을 일시 대기
# 0 이하로 설정하면 비활성화 (기본값: 50)
adaptive.load.control=50
동작
Fess가 동작하는 서버의 시스템 CPU 사용률을 모니터링합니다
CPU 사용률이 임계값 이상인 경우, 대상 처리 스레드는 CPU 사용률이 임계값 아래로 떨어질 때까지 대기합니다
CPU 사용률이 임계값 아래로 떨어지면 처리가 자동으로 재개됩니다
대상 백그라운드 작업:
크롤링 (웹 / 파일 시스템)
인덱싱 (문서 등록)
데이터 스토어 처리
서제스트 업데이트
썸네일 생성
백업 및 복원
참고
적응형 부하 제어는 기본적으로 활성화되어 있습니다 (임계값=50). HTTP 요청 부하 제어 (web.load.control / api.load.control)와는 독립적으로 동작합니다.
| 항목 | HTTP 요청 부하 제어 | 적응형 부하 제어 |
|---|---|---|
| 모니터링 대상 | OpenSearch CPU 사용률 | Fess 서버의 시스템 CPU 사용률 |
| 제어 대상 | HTTP 요청 (웹 / API) | 백그라운드 작업 |
| 제어 방법 | HTTP 429를 반환하여 요청 거부 | 처리 스레드를 일시 대기 |
| 기본값 | 비활성화 (임계값=100) | 활성화 (임계값=50) |
문제 해결
부하 제어가 활성화되지 않음
원인: 설정이 올바르게 반영되지 않음
확인 사항:
정상적인 요청이 거부됨
원인: 임계값이 너무 낮음
해결 방법:
web.load.control``이나 ``api.load.control값을 올리기``load.control.monitor.interval``을 조정하여 모니터링 빈도 변경
OpenSearch 클러스터의 리소스 증강
경고
임계값을 너무 낮게 설정하면 정상적인 부하에서도 요청이 거부될 수 있습니다. OpenSearch 클러스터의 평소 CPU 사용률을 확인한 후 적절한 임계값을 설정하세요.
크롤링이 느림
원인: 적응형 부하 제어에 의해 스레드가 대기 상태
확인 사항:
로그에 ``Cpu Load XX% is greater than YY%``가 출력되고 있는지
adaptive.load.control임계값이 너무 낮지 않은지
해결 방법:
adaptive.load.control값을 올리기 (예: 70)Fess 서버의 CPU 리소스 증강
0으로 설정하여 적응형 부하 제어를 비활성화 (권장하지 않음)
참고 정보
속도 제한 설정 - 속도 제한 설정