thread pool 생성시 적절한 thread 갯수

moon8011의 이미지


클라이언트의 요청에 따라 streaming 해주는 daemon을 구현하려고 합니다.

client 요청마다 해당 처리를 해주는 thread를 생성시켜서 던져주려하는데

thread pool을 만들어 놓고 처리 하려고 합니다.

이때 적절한 thread의 개수가 궁금합니다.

처음에는 1000개정도의 서비스를 할 수 있게 1000개의 thread를 생성하려고 했으나

이리 저리 검색해본결과 thread pool을 만들때 적절한 갯수는 cpu갯수 * 2 +1 개가 최적화이고

더많이 만들게 되면 오히려 성능이 떨어진다고 하는데요.

위와같은 구조에서 위와같이 n = cpu개수*2 +1이라면 n개이상의 클라이언트에게 서비스 할 수 없으므로

그냥 1000개의 thread를 생성해 놓을 수 밖에 없는건가요?

아니면 n개만 생성해놓구도 동시에 1000개정도의 요청을 수행할 수 가 있는 방법이 있는건가요?

만약 1000개의 thread를 생성해서 처리를 해준다면 성능상에 있어서 서비스가 불가능한 수준인가요?

조언 부탁드립니다. 수고하세요.

ssif의 이미지

n = cpu개수*2 +1 의 개수로 thread pool을 처음에 만듭니다.
서비스 요청시 만들어둔 thread pool을 다 쓰고 있는 상황이라면
thread pool을 하나 더 생성하고 서비스를 받아들입니다.만약 어느쪽 thread pool에서든지 서비스 요청이 없다면 자원을 반납니다.(thread pool을 닫습니다.)

이런 구조로 설계를 하면 안될까요?

thread 하나당 사용 메모리가 128KB라면 1000 thread가 동시에 서비스를 하면 128MB가 되겠군요.

봄들판에서다

봄들판에서다

chadr의 이미지

스레드를 1000개를 만드는건 좀 많은 오버헤드가 들어갈 것 같군요.
스레드간 스위칭 시간도 스레드가 많아지면 무시못합니다.

어차피 컴퓨터가 한순간에 처리할 수 있는 명령어는 1개뿐입니다.
시피유가 2개라면 동일한 순간에 2개의 명령어를 처리 할 수 있죠..

이런 상황에서 스레드를 4개 돌린다고 해서 성능이 2배 늘어나진 않습니다.
결국에는 한 순간에 처리할수 있는 명령어는 2개 뿐이고 나머지 2개는 대기상태에 놓이게 되며 먼저번의 2개의 명령어 수행이 끝나야만
나머지 두개가 수행됩니다.

스레드는 최대한 줄이고 생성된 스레드 내에서 고루하게 요청된 정보를 처리 할 수 있도록 잘 배분 해야합니다.
물론 n개의 스레드에서 1000개의 요청을 처리 할 수 있습니다.

방법은 운영체제의 소켓 모델에 따라서 다들 다른 방법을 사용하므로 사용하고자 하는 소켓 모델에 대해서 조사를 해보시면 답이 나올겁니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

cleol의 이미지

streaming 이라니 각 클라이언트마다 쓰레드를 할당하는 것 말고 다른 방법을 찾기는 쉽지 않아보이는데... 보통 쓰레드풀을 만들 때에는 쓰레드 개수를 딱 정해놓지 않습니다. 정책을 정하기 나름이지만 보통 최소 쓰레드 수, 최대 쓰레드 수, 최대 놀고 있는(idle) 쓰레드 수 등을 정해 놓고 그 범위 안에서 필요에 따라 쓰레드를 생성하거나 없앱니다. 항상 거의 1000 클라이언트에게 동시에 서비스를 한다면 모를까, 동시 접속 클라이언트 수가 보통 그보다 적다면 미리 쓰레드를 그만큼 만들어 놓는 것은 대단한 낭비입니다. 그리고 최대 1000 클라이언트에게 동시에 streaming 하는 것은 .... 가능할까요? 최대 쓰레드 수를 줄이시는 것이 좋을 것 같다는 생각이 듭니다. 안정적으로 서비스할 수 있는 최대치를 찾아야합니다.

체스맨의 이미지

이런 경우를 위해 리눅스 RTS( Real Time Signal ) 나 epoll, Solaris /dev/poll, 윈도우즈 IOCP 같은 비동기 입출력 기법을 사용합니다.

비동기 입출력 쪽으로 방향을 잡으시고, 실 구현은 스레드 갯수를 임의로 조절할 수 있도록 하시면 될 것 같습니다.

Orion Project : http://orionids.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.