대용량 UDP서버 개발시 성능 이슈

360 views
Skip to first unread message

Gun Song

unread,
Jan 23, 2014, 6:02:54 AM1/23/14
to golang...@googlegroups.com
여기에 질문을 올려도 되는지 모르겠지만, 구글링을 해봐다 Network 및 Performance에 대한 자료는 무척 빈약하더군요.
그래서 답답한 마음에 질문드립니다.

현재 대용량 UDP 서버를 개발하고 있습니다. 테스트 서버 HW사양은 24core, 16GB, SSD 사용 중인데, erlang보다 성능이 너무 안나오던군요. 심지어 Node.js로 만든 UDP 서버보다도 떨어집니다.

그래서 일단 단순하게 echo서버 형태로 처리하여서 테스트 중인데, CPU 사용률은 굉장히 적습니다. 그런데 수신 패킷 수가 특정 수 (초당 8000) 이상이 되면 급격히 수신과 송신 패킷 처리가 벌어지게 됩니다. 적절히 channel, go routine도 써봤지만 문제가 되는 패턴은 동일합니다.

Network 및 Performance에 대한 자료 추천이나 개선 사항등이 알려주시길 부탁드립니다.

Seong-hwan Jeong

unread,
Jan 23, 2014, 7:58:37 PM1/23/14
to golang...@googlegroups.com
GOMAXPROCS는 올바르게 설정해 두셨죠?
GC와 memory allocation 때문에 그럴수도 있을 것 같은데, slice와 같은 구조체를 재사용하거나 할당을 받지 않게 우회할 필요도 있어 보입니다.

아래 문서 참고하시고, 코드도 살펴보시는게 좋을 것 같아요..



2014년 1월 23일 목요일 오후 8시 2분 54초 UTC+9, Gun Song 님의 말:

Gun Song

unread,
Jan 23, 2014, 9:45:36 PM1/23/14
to golang...@googlegroups.com
좋은 답변 감사드립니다. 일단, GOMAXPROCS는 제대로 설정되어있습니다.

말씀하신대로 저도 GC, Memory Allocation, Slice 처리가 문제가 될만하다고 생각합니다. 하지만 GO보다 Slice나 Byte처리가 빈약한 Node.js보다 성능이 안나온다는게 조금 안타까운 것 같습니다. (erlang과 node.js와 거의 동일한 아키텍처와 모듈 구성을 통해 개발했는데 셋 중 성능이 꼴지라 ㅠㅠ)

그리고, 아래 URL처럼 channel형태로 Request Message Type별로 처리한다든지, 조금 복잡한 연산의 경우 go routine를 처리되어있습니다. 일단, 보내주신 URL을 참조하여 좀 더 최적화된 구조로 변경하여 테스트해 봐야겠습니다.

정말 도움 감사드리며, 더 많은 정보있으면 보내주세요~~

2014년 1월 24일 금요일 오전 9시 58분 37초 UTC+9, Seong-hwan Jeong 님의 말:

Brian Hong

unread,
Mar 25, 2015, 12:46:30 AM3/25/15
to golang...@googlegroups.com
안녕하세요.

Go 로 UDP 서버 몇 개 작성했었는데요. node.js 등과 비교하면 성능이 월등했습니다.

성능이 나오지 않는 샘플 코드 공유 가능하시면 도움 드릴 수 있을것 같은데요.

몇 가지 일반적인 팁을 드리자면, go routine 의 경우 패킷이 올 때마다 생성하면 굉장히 비효율적일 수 있습니다. 부하분산 전략을 마련하셔야됩니다.

만약에 producer-consumer 형태로 가신다면 부하분산 해주는 채널을 buffered channel 로 만드는 고려도 할 수 있습니다.
Reply all
Reply to author
Forward
0 new messages