ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NiFi 성능 최적화 테스트_스레드 개수와 Concurrent Tasks 상관관계
    NiFi 2024. 12. 6. 21:18

    오늘은 NiFi 테스트를 해보며 얻었던 인사이트들을 여러분들께 공유하려고 합니다.

    (조회수는 적지만)

     

    스레드 생성 개수와 Concurrent Tasks 상관관계 찾기

    이번 테스트는 Java 스레드 풀을 통한 스레드 생성 개수와 NiFi에서 관리하는 스레드 개수(Concurrent Tasks)를 조정하여 최적의 관계를 찾아볼 예정입니다.

     

    최적화 대상

    ExecuteStreamCommand 프로세서 : Elasticsearch에 색인하는 Jar 파일

    env.

    - 3 node cluster
    - core : 40/40/32

    알아두기

    전체 메뉴인 (우상단의 햄버거 아이콘)을 클릭하여 노드 당 할당할 수 있는 Concurrent Tasks의 최대 개수를 설정해야합니다.
    개수를 늘릴 때는 클러스터를 재시작할 필요가 없지만, 이를 줄이게 된다면 클러스터를 재시작할 필요가 있습니다!

     

    Test

    1. 스레드 생성 개수 (10) : Concurrent Tasks (10)
    2. 스레드 생성 개수 (10) : Concurrent Tasks (20)
    3. 스레드 생성 개수 (20) : Concurrent Tasks (20)
    4. 스레드 생성 개수 (30) : Concurrent Tasks (30)

    ExecuteStreamCommand Status History (차례대로 1, 2, 3, 4번 테스트)

    Bytes Read (5 mins)


    CPU 사용률

    CPU 사용률 From Prometheus

    첫번째와 두번째 그래프의 cpu사용량이 같은것으로 보아 Java에서 발생된 스레드의 수는 concurrent tasks 설정에 의해 제한을 받는다는것을 알 수 있습니다.

     

    Number of time driven Threads

     

    파란색 그래프는 NiFi를 통해 돌아가는 모든 스레드의 개수를 나타낸다. -> 노랑, 빨강, 초록을 합친값의 + 1(NiFi 스레드)

    스레드 증가율을 확인해보면 그래프는 CPU 사용량과 비례하여 증가하는 형태를 띄우는걸 확인할 수 있습니다.

     

    정리

    이번 테스트를 통해 알게된 점은 이와 같습니다.

    스레드 생성 개수는 Concurrent tasks 설정값을 넘지 못합니다. -> CPU 점유율이 비슷함

    또한 가용한 모든 스레드가 올라가고 일정시간이 지난 후 (빠른 비교를 위해 searchElasticsearch 프로세서의 Schedule Duration을 1 sec로 하였습니다.) Queue에 남아있는 FlowFile을 탐색해 봤을 시 스레드를 코어 수 이상 늘린다고 더 좋은 효율을 내진 않습니다 (큐에 남아있는 FlowFile 수를 비교) 

     

    해당 결과를 통해 추측해 볼 수 있는 결과는 스레드 수 : Concurrent tasks 수가 1대1일 때 적합하다고 예상하지만...

    저의 경우 긴 시간 측정해보지 않았기에 정확한 값은 아니라고 생각합니다. 

    좀 더 지켜봐야할 점이 있다고 생각합니다. 두가지 관점으로 생각해보자면 코드, 스레드 생애주기 관점입니다. 

     

    코드 관점

    실행시킬 코드를 확인해보면 ForkJoinPool을 통해 스레드간 간섭을 허용하여 테스크를 처리하고 있지만 이는 길이가 100인 JSONArray를 처리하고 있으므로 오히려 컨택스트 스위칭이 빈번해져 부하가 더 클 수 있다고 생각합니다. (어떤 데이터를 처리하고 있는지에 따라 다름) 따라서 인입 데이터의 유형에 맞춘 병렬 처리를 좀 더 고려해보는것이 좋을 것 같다고 생각합니다.

     

    스레드 생애주기

    Concurrent Threads 개수가 사용 가능한 스레드 수의 배수가 되는것이 1:1 관계보다 더 최적화된 설정일 가능성이 있습니다.
    위의 측정한 그래프 중 Number of time driven Threads의 Status History를 보면 스레드 개수보다 ConcurrentTasks가 조금 더 높은것을 확인할 수 있는데 조금 더 오래 돌려본다면 1:1 관계보다 좋은 결과가 나올 가능성이 있습니다. 

     

     

    특이사항

    테스트 진행 후 아래와 같은 작업을 진행했었습니다.

    더보기

    - 불필요한 프로세서 정리 (실행대상이 아닌 프로세서 포함)

    - 클러스터 재시작

    이후 동일조건 하 CPU 점유율이 상당히 줄은 경험이 있습니다.

    혹 NiFi를 통해 작업을 하실 경우 불필요한 프로세서는 정리하는 것을 추천드립니다..!

     

    'NiFi' 카테고리의 다른 글

    NiFi Index to Index Data Pipeline  (1) 2024.11.20
Designed by Tistory.