리눅스에서 쓰레드 프로그래밍 성능 문의

우연이의 이미지

안녕하세요. 아래와 같은 환경에서 성능 테스트를 하고있습니다.
저 정도의 처리를 하는데, 무리가 없는 것인지 궁금합니다. 프로그램이 버벅되서...

OS : Linux 레드헷 2.6.11-.1369_FC4
CPU : Pentium 4 CPU 3.20GHz
RAM : 1GB RAM

프로그램은 TCP/IP통신으로 1초에 2번 데이타를 수신하는 쓰레드가 75개
(각 쓰레드의 상태체크를 위한 쓰레드가 1한개씩 있음). --> 150개 쓰레드 동작
이때, 데이터는 75개 다 다른곳에서 수신함.

수신한 데이타는 1개의 메모리 큐로 모아지고 이 큐에서 데이터를 읽는 쓰레드가 1개 있음.

위 쓰레드에 읽혀진 데이터는 종류에 따라 분류되고, 다른 서버로 TCP/IP 통신으로 1초 주기로 데이터를 보냅니다. 이때 수신 서버가 300개일 경우 300개의 쓰레드가 생성되어 동작하는 구조입니다.

즉, 여기서 쓰이는 쓰레드는 451개입니다.

큐에서 데이터를 읽어서 분류하는 쓰레드가 1초에 150건 이상의 데이터를 처리해야하는데, 테스트 결과 처음엔 처리하는것 같다가 5초정도 지난후 50개 이하로 처리 속도가 떨어집니다.
CPU 점유율도 90% 이상이고요.

제가 궁금한 것은 이 정도의 데이터 처리에 저 PC사양이 충분한 것인지 입니다.
아무래도 로직쪽에 문제가 있는것 같긴하지만, 450개의 쓰레드가 동작하는 데 사양이 문제가 없는지 궁금합니다.

여러분들의 답변 부탁드립니다.

colus의 이미지

처리하는 데이터 내용을 몰라 확실히 알 수는 없으나 단순히 데이터를 모아서 다시 다른 곳으로 전달해주는 것이라면 굳이 쓰레드를 많이 생성할 필요가 없을 것 같습니다. 쓰레드가 450개씩되면 문제가 있죠. 일하는 시간보다 쓰레드 관리하는 시간이 더 많을 수도 있습니다.

no-blocking async 통신을 할 수 없나요? 비동기 통신을 하면 꼭 연결 하나마다 쓰레드가 하나씩 있어야할 필요가 없겠지요.

데이터 수신 쓰레드가 75개인데 꼭 상태 점검하는 쓰레드가 각기 하나씩 있을 필요가 있을까요? 하나가 여러 쓰레드 상태를 점검할 수도 있지 않을까요?

네트웍 대역폭은 충분한가요? 데이터를 받는 쪽은 잘 받고 있나요? 처음에는 되다가 얼마지난 후에 안된다고 하시는 것을 보니 이문제일 수도 있을 것 같습니다. 보내는 데이터가 초당 300*150=45000개. 100바이트면 4.5Mbytes네요.

nomoreid의 이미지

Context Switching에 대해선 여길 보시고 (http://en.wikipedia.org/wiki/Context_switch)

CPU가 하나면 한번에 CPU에서 실행할 수 있는 Thread는 하나입니다. 쓰레드 갯수가 많아지면 많아질수록 Thread 전환의 부하가 커지게 됩니다. 결국 원래 하려는 작업을 못할정도로 부하가 커지게 될 수도 있습니다.

Thread갯수는 적절하게 조종해야 합니다.

Never Ending 삽질.

Never Ending 삽질.

풀풀의 이미지

메시지가 크거나 디스크 IO를 많이 해야 된다거나 하지 않으면
충분한 성능이네요.

atdda의 이미지

제 생각에도 충분한 성능 같습니다.
(쓰레드 '수'만 보면. 다른 요인은 빼고)

절반도 안되는 메모리에 1G 쯤의 CPU가 장착된 박스에서 2000개도 넘게 돌려본적 있습니다. :)

May The Force Be With You.

May The Force Be With You.

lovian의 이미지

리눅스는 스레드를 생성해도 프로세스를 만드는 것으로 알고 있는데,
451개의 프로세스면 컨텍스트 스위칭 시간이 엄청난 오버헤드가 될 것 같습니다.

혹시, 제가 잘못 알고 있는 겁니까? 아니라면..
-----------------
한글을 사랑합니다.

-----------------
한글을 사랑합니다.

saxboy의 이미지

프로세스를 생성해도 스레드를 만든다는 것이 좀 더 정확한 표현일 것 같군요. ;-)

우연이의 이미지

관심을 가지고, 답변 주셔서 감사합니다.
쓰레드 개수가 너무 많다는 의견을 듣고, 그부분을 수정해서 테스트 해봤는데, 큰 차이가 없었습니다.
계속 디버깅 해 본결과 큐에서 데이터를 읽고, 분류하는 과정에서 문제가 있었습니다.
그 부분을 수정하니, 잘 됩니다.

감사합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.