연결(큐)마다 상한을 두고, 그 상한에 이르면 상류 프로세서를 스케줄하지 않는 방식으로 흐름을 눌러 주는 장치다. 데이터를 버리지 않고 생산을 잠시 멈추는 것이므로, 소비가 다시 진행되면 저절로 풀린다.
연결 하나에 두 가지 임계값이 있다.
| 임계값 | 기본값 | 의미 |
|---|---|---|
| Back Pressure Object Threshold | 10000 | 큐에 담긴 FlowFile 건수 |
| Back Pressure Data Size Threshold | 1 GB | 큐에 담긴 내용의 합계 크기 |
둘 중 하나라도 넘으면 걸린다. 연결을 우클릭해 Configure → Settings 에서 바꾼다.
새로 만드는 연결의 기본값은 nifi.properties 에서 정한다. 이미 만들어진 연결에는 소급 적용되지 않는다.
nifi.queue.backpressure.count=10000
nifi.queue.backpressure.size=1 GB
백프레셔는 처리 순서 에는 영향을 주지 않는다. 큐 안의 순서는 우선순위 설정이 정하고, 백프레셔는 새로 들어오는 것을 막을 뿐이다. 임계값을 크게 잡으면 큐가 길어져 지연이 늘고 메모리와 디스크 사용이 커진다. 작게 잡으면 상류가 자주 멈춰 처리량이 떨어진다. 대체로 기본값을 두고, 특정 구간의 처리 속도가 느린 것이 확인되면 그 구간만 조정한다.
임계값에 걸린 연결은 화면에서 붉게 표시되고, 상류 프로세서의 활성 스레드가 0 이 된다. 정체 지점을 찾을 때 이 표시가 출발점이다.
화면 상단 요약의 Queued 값은 모든 연결에 대기 중인 FlowFile 건수와 그 내용의 합계 크기 다. 클러스터에서는 전체 노드의 합이며, 노드별 값은 Summary 화면의 Node 탭에서 본다.
여기 나오는 크기는 큐에 있는 FlowFile 이 참조하는 내용의 크기이므로, 콘텐츠 저장소의 디스크 사용량과 같지 않다. 저장소에는 이미 처리됐지만 아직 정리되지 않은 내용과 아카이브가 함께 들어 있어 대개 더 크다.
전역 스레드 수는 Controller Settings 에서 정한다.
| 설정 | 의미 |
|---|---|
| Maximum Timer Driven Thread Count | 타이머 기반 프로세서가 쓸 수 있는 스레드 수 |
| Maximum Event Driven Thread Count | 이벤트 기반 스케줄링용. 최신 버전에서는 사용하지 않는다 |
이 값은 노드마다 적용된다. 3 노드 클러스터에서 25 로 두면 클러스터 전체로는 75 개다. 화면의 활성 스레드 표시가 설정값보다 커 보이는 이유도 여기에 있다. 클러스터 합계를 보고 있거나, 스레드 풀 밖에서 도는 작업(프로비넌스 유지보수, 저장소 정리, 리포팅 태스크, 사이트 투 사이트 전송)이 함께 잡히기 때문이다. 정지 요청을 받았지만 아직 끝나지 않은 스레드도 계속 세어진다.
권장 출발점은 코어 수의 2 배에서 4 배 사이다. 더 올리기 전에 병목이 CPU 인지 디스크인지 외부 시스템인지 먼저 본다. 스레드만 늘리면 저장소 I/O 경합이 심해져 오히려 느려지는 경우가 흔하다.
grep -c processor /proc/cpuinfo
iostat -xz 5 3
Maximum Timer Driven Thread Count 를 올리면 함께 커지는 것이 있다. 동시 실행되는 프로세서가 늘어 힙 사용량과 FlowFile·콘텐츠 저장소 쓰기가 증가하고, 외부 DB·Kafka 로 향하는 동시 접속 수가 늘어난다. 커넥션 풀 크기와 외부 시스템의 허용치도 같이 조정해야 한다.