리눅스에서 쓰레드 프로그래밍 성능 문의
안녕하세요. 아래와 같은 환경에서 성능 테스트를 하고있습니다.
저 정도의 처리를 하는데, 무리가 없는 것인지 궁금합니다. 프로그램이 버벅되서...
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개의 쓰레드가 동작하는 데 사양이 문제가 없는지 궁금합니다.
여러분들의 답변 부탁드립니다.
쓰레드 갯수를 줄이셔야할 것 같습니다.
처리하는 데이터 내용을 몰라 확실히 알 수는 없으나 단순히 데이터를 모아서 다시 다른 곳으로 전달해주는 것이라면 굳이 쓰레드를 많이 생성할 필요가 없을 것 같습니다. 쓰레드가 450개씩되면 문제가 있죠. 일하는 시간보다 쓰레드 관리하는 시간이 더 많을 수도 있습니다.
no-blocking async 통신을 할 수 없나요? 비동기 통신을 하면 꼭 연결 하나마다 쓰레드가 하나씩 있어야할 필요가 없겠지요.
데이터 수신 쓰레드가 75개인데 꼭 상태 점검하는 쓰레드가 각기 하나씩 있을 필요가 있을까요? 하나가 여러 쓰레드 상태를 점검할 수도 있지 않을까요?
네트웍 대역폭은 충분한가요? 데이터를 받는 쪽은 잘 받고 있나요? 처음에는 되다가 얼마지난 후에 안된다고 하시는 것을 보니 이문제일 수도 있을 것 같습니다. 보내는 데이터가 초당 300*150=45000개. 100바이트면 4.5Mbytes네요.
Thread가 많아지면 많아질수록 Context Switching 이 많아집니다.
Context Switching에 대해선 여길 보시고 (http://en.wikipedia.org/wiki/Context_switch)
CPU가 하나면 한번에 CPU에서 실행할 수 있는 Thread는 하나입니다. 쓰레드 갯수가 많아지면 많아질수록 Thread 전환의 부하가 커지게 됩니다. 결국 원래 하려는 작업을 못할정도로 부하가 커지게 될 수도 있습니다.
Thread갯수는 적절하게 조종해야 합니다.
Never Ending 삽질.
Never Ending 삽질.
메시지가 크거나
메시지가 크거나 디스크 IO를 많이 해야 된다거나 하지 않으면
충분한 성능이네요.
제 생각에도 충분한
제 생각에도 충분한 성능 같습니다.
(쓰레드 '수'만 보면. 다른 요인은 빼고)
절반도 안되는 메모리에 1G 쯤의 CPU가 장착된 박스에서 2000개도 넘게 돌려본적 있습니다. :)
May The Force Be With You.
May The Force Be With You.
리눅스는 스레드를
리눅스는 스레드를 생성해도 프로세스를 만드는 것으로 알고 있는데,
451개의 프로세스면 컨텍스트 스위칭 시간이 엄청난 오버헤드가 될 것 같습니다.
혹시, 제가 잘못 알고 있는 겁니까? 아니라면..
-----------------
한글을 사랑합니다.
-----------------
한글을 사랑합니다.
프로세스를 생성해도
프로세스를 생성해도 스레드를 만든다는 것이 좀 더 정확한 표현일 것 같군요. ;-)
쓰레드 문제가 아니었습니다
관심을 가지고, 답변 주셔서 감사합니다.
쓰레드 개수가 너무 많다는 의견을 듣고, 그부분을 수정해서 테스트 해봤는데, 큰 차이가 없었습니다.
계속 디버깅 해 본결과 큐에서 데이터를 읽고, 분류하는 과정에서 문제가 있었습니다.
그 부분을 수정하니, 잘 됩니다.
감사합니다.
댓글 달기