해결된 질문
작성
·
77
·
수정됨
1
루키스님 안녕하세요?
C# 서버에서 넘어와서 CPP 서버 공부하고 있습니다.
스트레스 관련해서 이해가 안되는 부분이 있어 질문 드리게 되었습니다.
제가 스트레스 테스트를 한 방법은 recvCount, sendCount 변수에 ++하여 1초에 1번 출력하는 방식으로, '개략적으로' 카운트가 되는지 테스트하고 있습니다.
C# 서버에선 C_Move패킷을 각 클라이언트가 0.25초마다 서버로 보내서 100명의 더미클라이언트로 치면 서버에서 400번 Recv, 40000 Send(브로드캐스트이므로) 정도로,
300명 정도까지 Move 패킷을 처리할 수 있는 수준으로 부하테스트가 되었습니다.
근데 CPP IOCP 서버에서 워커 스레드는 컴퓨터 스레드 개수에 맞게 하는게 적당하다고 하셨고, 실제 배포하신 자료에도 워커스레드는 5개를 정해주셨습니다 (저는 핵사 코어 컴퓨터를 사용 중입니다)
C#과 마찬가지로 더미 클라이언트.가 C_Move 패킷을 보내고 count 변수에 ++하면서 보고 있는데, 워커 스레드가 오히려 1개일 때 월등히 작업이 빠릅니다. 스레드 1개는 300명 내외까지 가능하지만, 2개 이상부터는 100명도 버거운 수준이었습니다.
룸이 하나인 상황이어서 컨텍스트 스위칭 때문에 오히려 워커 스레드 2개부터 느릴 수 있는걸까요? 고민해봤는데 명확한 답이 안나와 질문 드립니다.
답변 2
1
네 물론 단순한 일이라면 분담하는이 한 쓰레드가 몰빵하는게 더 빠를 수도 있습니다.
현실적으로 CPU들이 바쁘게 움직이게 일감을 분담한다는 측면에서 멀티쓰레드를 사용하는 것이지,
작은구멍가게에 직원을 100명 배치한다고
무조건 좋은 것은 또 아닌 것과 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다. mhyim님, 질문해주신 내용을 바탕으로 적절한 답변을 찾아 보았습니다.
C++ IOCP 서버에서 워커 스레드의 수가 성능에 미치는 영향은 여러 가지 요인에 의해 결정될 수 있습니다. 기본적으로 워커 스레드는 CPU 코어 수에 맞추어 설정하는 것이 일반적인 권장 사항인데요. 이는 보통 컨텍스트 스위칭을 최소화하고 효율성을 높이기 위함입니다. 그러나 특정 조건에서는 워커 스레드가 많은 것이 오히려 성능을 제한할 수 있습니다. 특히 하나의 큰 작업을 처리하는 경우, 다수의 워커 스레드가 오히려 컨텍스트 스위칭 비용을 높여 성능 저하를 초래할 수 있습니다.
관련된 기존 질문에서 비슷한 내용을 다루고 있는 게시물을 찾았습니다. 아래 URL을 참고하셔서 더 깊이 있는 내용을 확인해보실 수 있습니다:
질문하신 C++ IOCP 서버에서 워커 스레드 영향에 대한 이해를 돕기 위한 간단한 설명은 다음과 같습니다:
컨텍스트 스위칭 문제: 워커 스레드가 많아지면 서로 다른 스레드 사이에서 CPU가 작업을 전환해야 하는데, 이 과정에서 발생하는 컨텍스트 스위칭 비용 때문에 오히려 성능이 저하될 수 있습니다.
워크 로드 관리: 워커 스레드가 처리해야 하는 업무량(워크 로드)이 각 스레드에 효율적으로 배분되지 않으면 오히려 병목 현상을 초래할 수 있습니다. 한 스레드가 과부하 상태에 빠지는 문제가 발생할 수 있고, 전체적인 성능 저하로 이어질 수 있습니다.
이러한 설명들이 실제 문제 해결에 도움을 줄 수 있기를 바랍니다. 추가적으로 궁금한 점이 있으시면 질문을 주시면 좋겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
시간내서 답변해주셔서 감사합니다!