10년후연봉1억
128
2017-11-20 12:08:05
4
3670

웹 서버 환경에서 스레드 개수 지정


웹 서버 환경에서 스레드 풀을 사용하려하는데 스레드 개수를 어느정도로 잡아야하는지 몰라서 질문드립니다!!!

우선, 찾아보니 작업의 개수만큼 만드는 것과 가용 CPU 코어 개수만큼 만든다는 말이 있던데요.

어떤게 효율적인지 잘모르겠습니다...

만약 CPU 코어가 4개고 작업의 개수가 N개(100~1000개)이면 스레드 풀의 개수를 4로 지정하는게 효율적인건가요? N개로 지정하는게 효율적인건가요?

0
  • 답변 4

  • theFluker
    222
    2017-11-20 12:22:42

    CPU 코어가 4개고 작업의 갯수가 N개일 때 1개당 처리속도 가 a, 스레드를 하나 생성속도가 b라고 했을 때 

    그 둘을 비교해보는게 맞는것 같습니다. 그리고 스레드 생성비용(Memory)까지 생각해보면 스레드를 많이 늘리는건 그다지 좋은 선택이 아닌것 같아요. 일단 저는 응용프로그램에서 I/O blocking이 일어나는 작업이 있고 동시에 다른 작업을 처리해야할 때만 스레드를 사용합니다.

  • 톰소여
    1k
    2017-11-20 12:29:50

    자바가 스레드 풀 생성할 때 CPU하고 RAM 많이 씁니다.

    그래서 스레드 풀 만들어 놓고 정해진 한계치 안에서 씁니다.


    주의할 점은

    웹 요청도 스레드로 처리됩니다.

    그래서 최대 요청수 X 스레드 풀 한계치 하면 스레드가 최대 얼마나 생길지 예측이 가능합니다.


    문제는 스레드 100여개 정도 돌아가면 메모리하고 CPU를 얼마나 많이 쓸까요?

    케바케인데 성능체크하면서 원하는 비지니스 로직이 메모리를 얼마나 쓰는데 이를 스레드로 분기하면 얼마나 쓰는지 요청 개수를 늘려가면서 체크해서 프로퍼티에 설정해놓고 쓰는 것이 좋습니다.


  • 꾸아앙
    2017-11-20 12:42:58

    특별한 상황이 아니라면 일반적으로 적정 스레드 수는

    (프로세스 * 2) + 1

    (프로세스 * 2) + 2

    정도라고 많이들 말하죠

    최대의 성능보다는 성능+안정성 면에서 보통 말하는 스레드수 입니다

  • shin7688
    131
    2017-11-20 12:44:37

    ThreadPool에서 Min은 CPU와 Memory를 10~20% 정도 사용하는 시점에 맞추어 Thread 개수를 잡아줍니다. 그리고 Max는 Thread가 너무 많아 Thread 경합이 일어나서 성능이 악화되지 안도록 해야 합니다.

    CPU 관점에서 볼 때 thread 하나를 만들 때 CPU 200,000 cycles이 필요하며 thread 하나를 죽일 때 100,000 cycles이 필요합니다. 그리고 Thread 경합하는데 2,000~8,000 cycle이 필요합니다. 그래서 thread의 적정 시점의 thread 숫자를 잡아야 합니다.

    보통 CPU core 하나당 100개 이하를 할당합니다.

    - CPU 2.4GHz : 2,400,000,000Hz

  • 로그인을 하시면 답변을 등록할 수 있습니다.