정상적인 파일 디스크립터 최대치는 활성 연결이나 열린 작업과 함께 증가하고 작업이 끝나면 감소합니다. 디스크립터 누수는 애플리케이션이 더 이상 필요하지 않은 리소스를 열어 두어 카운트가 점점 상승하는 기준선을 형성하며 결국 프로세스, 서비스, 컨테이너 또는 시스템 한도에 도달합니다.
이 구분은 중요합니다. 두 조건 모두 같은 최종 오류를 발생시킬 수 있기 때문입니다. 디스크립터 한도를 올리는 것은 바쁜 리버스 프록시의 적절한 용량 계획일 수 있지만, 소켓, 파일, 파이프, 감시자가 절대 해제되지 않는 경우 실패를 단지 지연시킬 뿐입니다.
정상적인 디스크립터 최대치를 정의하는 패턴은 무엇인가요?
정상적인 최대치는 작업 동시성에 따라 나타납니다. 정상적인 최대치는 활성 작업량을 따라가며, 요청이 끝나고 소켓이 닫히고 작업자가 종료되며 임시 파일이 해제되면서 감소합니다.
이벤트 전후의 기준선은 비슷하게 유지됩니다. 백업 창, 미디어 스트림 폭주, 또는 많은 동시 웹 클라이언트가 높은 카운트를 만들 수 있지만, 이는 리소스 처리 오류를 나타내지 않습니다.
최대치는 완료된 작업과도 연관되어야 합니다. 클라이언트 수가 두 배로 늘어나면 대략 두 배의 활성 소켓이 생성되고 카운트가 이후에 다시 돌아온다면, 시스템은 지속적인 손실이 아닌 유한한 용량 수요를 보여주는 것입니다.
디스크립터 누수를 나타내는 패턴은 무엇인가요?
누수는 최대값뿐 아니라 기준선도 변경합니다. 누수는 작업 종료 후에도 디스크립터를 열어 둡니다, 그래서 모든 요청 주기, 재연결, 재로드 또는 실패한 작업이 일부 리소스를 남깁니다.
카운트가 너무 천천히 증가하면 짧은 테스트 동안 숨겨질 수 있습니다. 서비스는 남은 디스크립터 여유가 다음 연결이나 파일 열기에 너무 작아질 때까지 몇 시간 또는 며칠 동안 정상처럼 보일 수 있습니다.
프로세스를 재시작하면 커널이 디스크립터를 닫기 때문에 카운트가 초기화되지만, 이 복구가 근본적인 문제가 해결되었음을 증명하지는 않습니다. 서비스가 다시 작업을 처리하기 시작하면 같은 기울기가 다시 나타납니다.
소켓, 파일, 감시자가 왜 서로 다른 곡선을 나타내나요?
리눅스는 여러 I/O 리소스 유형에 디스크립터를 사용하며, 다른 리소스 유형은 서로 다른 성장 패턴을 만듭니다. 따라서 각 유형은 다른 작업 부하 설명이 필요합니다.
클라이언트 소켓은 동시 세션을 따라야 합니다. 로그나 미디어 파일은 활성 핸들을 따라야 합니다. 파이프는 자식 프로세스를 따를 수 있으며, 감시자 관련 디스크립터는 감시 경로 수가 별도의 커널 한도를 통해 증가하더라도 안정적으로 유지될 수 있습니다.
디스크립터를 대상별로 분류하는 것이 총합을 읽는 것보다 더 유용합니다. 트래픽 급증 시 예상되는 수백 개의 소켓은 꾸준히 증가하는 삭제된 로그 파일이나 하나의 사용 불가능한 의존성에 반복적으로 연결되는 것과 다릅니다.
왜 한도 상향이 누수를 수정하지 않고 지연시키는 걸까요?
`Too many open files` 오류는 성장 한계에 도달했을 때만 발생합니다. 더 높은 한도는 누수 고갈을 단지 지연시킬 뿐입니다.
더 높은 한도는 재시작과 실패 사이의 시간을 늘립니다. 이는 짧은 관찰 기간 동안 서비스가 복구된 것처럼 보이게 하지만 누수가 더 많은 커널 메모리와 더 많은 네트워크 또는 저장 상태를 소비하도록 허용할 수 있습니다.
따라서 용량 변화는 디스크립터가 정상적으로 해제된다는 증거를 따라야 합니다. 그렇지 않으면 새로운 한계는 안정성 향상이 아니라 더 큰 실패 범위가 됩니다.
어떤 측정값이 용량과 수명 주기 실패를 구분합니까?
총 카운트는 첫 번째 신호일 뿐입니다. 디스크립터의 나이와 유형이 근본 원인을 드러냅니다. 동일한 타임라인에서 카운트, 대상 유형, 열린 지속 시간, 생성 속도, 종료 속도, 트래픽, 완료된 요청을 추적하세요.
최고점의 경우, 디스크립터 카운트는 동시성과 함께 움직여야 하며 결국 다시 돌아와야 합니다. 누수의 경우, 열린 지속 시간과 기준선이 상승하는 반면, 활성 유용 작업량은 비례하여 증가하지 않습니다.
한 번의 스냅샷 대신 여러 사이클을 비교하세요. 단일 높은 카운트만으로는 프로세스가 정상적인 파동의 최고점에 가까운지 아니면 지속적인 상승 추세의 중간인지 알 수 없습니다.
더 높은 디스크립터 한계가 실제로 정당화되는 경우는 언제인가요?
연결 재사용은 합법적인 디스크립터 수요를 줄입니다. 한계를 높이기 전에 피할 수 있는 연결 변동을 제거하고, 풀을 제한하며, 작업 완료 시 리소스가 닫히는지 확인하세요.
테스트된 합법적인 동시성이 현재 유효 서비스 한계에 근접하고, 디스크립터 수가 기준선으로 돌아가며, 메모리, 소켓 버퍼, 백엔드 풀 및 복구 동작이 더 높은 수요를 지원할 수 있을 때 더 큰 한계가 정당화됩니다.
하드 실패 지점 아래에 알림을 설정하고 관리 여유 공간을 유지하세요. 목표는 한계를 도달 불가능하게 만드는 것이 아니라 정상 피크를 측정된 운영 범위 내에 유지하고 비정상적인 성장을 조기에 감지하는 것입니다.
| 관찰된 패턴 | 가능한 의미 | 다음 점검 |
|---|---|---|
| 수치가 트래픽에 따라 오르내림 | 합법적인 동시성 피크 | 서비스 한계 용량 테스트 |
| 매 사이클 후 기준선 상승 | 디스크립터 누수 | 닫히지 않은 리소스를 유형과 수명으로 분류 |
| 재시작 시 수치가 초기화되고 기울기가 다시 돌아옴 | 수명 주기 결함이 남아 있음 | 열기 및 닫기 경로 추적 |
| 셸 한계가 서비스 실패 지점과 다름 | systemd 또는 컨테이너 한계 불일치 | 실행 중인 프로세스 한계를 검사하세요 |
자주 묻는 질문
낮은 CPU 사용량으로 파일 디스크립터 누수가 발생할 수 있나요?
네. 프로세스는 대기 중에 소켓이나 파일을 유지할 수 있으며, 새 할당이 실패할 때까지 거의 CPU를 사용하지 않습니다.
TIME_WAIT가 디스크립터 누수를 증명하나요?
아니요. TIME_WAIT는 소켓이 닫힌 후 TCP 커널 상태입니다. 디스크립터 누수는 애플리케이션이 여전히 열린 디스크립터를 보유하고 있음을 의미합니다.
서비스를 재시작하면 왜 문제가 해결되는 것처럼 보이나요?
프로세스 종료는 디스크립터를 닫고 여유 공간을 복원합니다. 애플리케이션 수명 주기가 여전히 깨져 있으면 수치가 다시 증가하기 시작합니다.
알림은 고정된 디스크립터 수를 사용해야 하나요?
유효 한계의 백분율과 성장 동작을 모두 사용하세요. 안정적인 높은 수치는 정상일 수 있지만, 낮지만 꾸준히 증가하는 수치는 위험할 수 있습니다.
최종 요점
합법적인 디스크립터 피크는 작업 중에 발생하고 안정적인 기준선으로 돌아갑니다. 누수는 작업이 끝난 후에도 리소스를 유지하여 결국 유한한 한계를 넘는 상승하는 바닥을 만듭니다. 한계를 높이기 전에 곡선, 리소스 유형 및 디스크립터 수명을 진단하세요. 추가 여유 공간은 수명 주기가 이미 올바를 때만 실제 용량을 지원합니다.
기술 및 AI 허브
더 읽어보기

홈 어시스턴트의 런타임 상태와 영구 상태: 재시작 후에도 무엇이 유지되어야 할까요?
Home Assistant는 모든 실시간 값을 영구 저장하지 않습니다. 구성, 레지스트리, 선택적으로 복원되는 상태, 기록, 배포 데이터는 재시작 시 서로 다른 역할을 합니다.

Home Assistant는 로컬 및 원격 세션을 어떻게 인증하나요?
로컬 및 원격 Home Assistant 세션은 동일한 서버 측 ID 모델을 사용합니다. 원격 액세스는 경로와 TLS 경계를 변경할 뿐, 핵심 토큰 흐름은 변경하지 않습니다.

Recorder 데이터가 늘어날수록 Home Assistant 기록 쿼리가 느려지는 이유는 무엇인가요?
요청한 범위가 더 많은 행에 걸쳐 있거나 캐시 미스가 증가하거나 스토리지 및 인덱스 작업이 느려지면 레코더의 증가로 인해 기록 조회 비용이 상승할 수 있습니다.

