accept operation은 cost가 큰 operation이다.
그래서 accept만 따로 하는 listening thread를 만들곤 한다.
(Win32에서는 AcceptEx를 사용하여 더욱 더 성능 향상을 한다.)
더우기 accept에 이어서, 새로운 유저에 대한 메모리 생성 및 DB query(login관련)가 이루어지므로, 그 이후에는 더 비싼 operation들이 기다린다.
그래서, 다른 싼 operation과 합쳐서 thread pooling을 하면, 대기하는 operation들이 많아질 수 있게 된다.
그래서, listening thread를 만든다.
그러나, 그 차이가 크지 않다면, 안 만들어도 될 것 같다. 쓰레드 생성은 신중히 선택해야 할 문제이다.
"빨리 받아주고, 빨리 처리 하자"는 맞다.
하지만, "빨리 받지만, 빨리 처리 못하면?" 서비스는 악순환 일로로 가게 된다.
DDoS공격에 매우 취약한 서비스가 될 것이다.
따라서, 빨리 처리할 수 없으면 빨리 받지 않도록 설계에 고려가 되어야 한다.
처리 속도와 accept속도(?)를 측정하여 dynamic하게 조절되어야 할 것이다.
사실 그렇게까지 하는 경우는 별로 없다.
이왕 listening thread를 만들었다고 하면, 다음과 같이 하면 좋겠다.
accpeted user와 관련된 메모리들의 생성과 소멸을 모두 listening thread 한개에서 처리한다면? 다른 thread들에서는 소멸전까지 안전하게 쓸 수 있게 보장만 된다면? lock을 쓰지 않아도 thread safe하게 될 수 있다. ( 쓰더라도, 제한적일 것이고, contention이 적게 일어날 것이다. )또한, 특정 부분에서 multi thread를 위한 memory manager를 따로 만들지 않아도 될 것이다.
생성은 그렇다치고, 소멸까지 처리하려면, destroy stack(소멸처리용 데이터구조)과 같은 것을 통해서 listening thread에서 처리하는 것이 맞을 것 같다. 소멸을 위해서 destroy stack으로 post하고, listening thread에서 delete를 하게 되면, thread safe가 보장된다.
God bless me and you. ^^
도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^
2011년 3월 29일 화요일
2011년 3월 28일 월요일
using skip list, mulithreaded heap , event polling in tinyNetworkLib
tinyNetworkLib를 코딩중입니다.
몇가지 중요한 결정을 하였습니다.
skip list를 사용하여, dispatched packet에 대한 circular buffer의 index를 보관하고, socket으로부터 recv시 overwrite하지 않도록 보호하는데 쓰기로 했습니다.
(좀 어려운 말인데요;;)
recv시, circular buffer에서 안전한 영역, 즉, 아직 처리 되지 않은 packet이 있지 않은 영역을 확보하기 위해서, circular buffer의 next buffer pointer보다 크고, dispatched packet index중에서 가장 작은 수를 알아내기 위해서 skip list를 사용합니다. logN time이죠.
이의 용도에 맞게 최적화 된 Skip List 를 구현할 수도 있지만,
잘 구현된 것을 일단 사용하기로 했습니다. ( http://bit.ly/gGtzuO )
또한, multi thread 환경에서는, 여러개의 thread가 heap을 경쟁합니다. 하나의 thread에서 alloc한 것을 다른 thread에서 free해야 하는 상황이 자주 생깁니다. 그럴 경우, 어쩔 수 없이 lock을 써야 하는데, thread가 많아질 수록 scalability 가 떨어지는 문제가 생깁니다.
이 문제를 해결하기 위해서, 역시 직접 구현하는 것이 맞겠지만...;; Intel TBB의 scalable allocator를 사용하기로 결정하였습니다.
또한, epoll이나 kqueue의 경우, IOCP의 그 역할(? ^^)이 없습니다만,
network thread에서 poll을 해오고, 처리는 event마다 thread pool로 던지는 역할을 위해서, 역시 intel TBB의 task를 쓰기로 했습니다. ^^
God bless me and you. ^^
도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^
몇가지 중요한 결정을 하였습니다.
skip list를 사용하여, dispatched packet에 대한 circular buffer의 index를 보관하고, socket으로부터 recv시 overwrite하지 않도록 보호하는데 쓰기로 했습니다.
(좀 어려운 말인데요;;)
recv시, circular buffer에서 안전한 영역, 즉, 아직 처리 되지 않은 packet이 있지 않은 영역을 확보하기 위해서, circular buffer의 next buffer pointer보다 크고, dispatched packet index중에서 가장 작은 수를 알아내기 위해서 skip list를 사용합니다. logN time이죠.
이의 용도에 맞게 최적화 된 Skip List 를 구현할 수도 있지만,
잘 구현된 것을 일단 사용하기로 했습니다. ( http://bit.ly/gGtzuO )
또한, multi thread 환경에서는, 여러개의 thread가 heap을 경쟁합니다. 하나의 thread에서 alloc한 것을 다른 thread에서 free해야 하는 상황이 자주 생깁니다. 그럴 경우, 어쩔 수 없이 lock을 써야 하는데, thread가 많아질 수록 scalability 가 떨어지는 문제가 생깁니다.
이 문제를 해결하기 위해서, 역시 직접 구현하는 것이 맞겠지만...;; Intel TBB의 scalable allocator를 사용하기로 결정하였습니다.
또한, epoll이나 kqueue의 경우, IOCP의 그 역할(? ^^)이 없습니다만,
network thread에서 poll을 해오고, 처리는 event마다 thread pool로 던지는 역할을 위해서, 역시 intel TBB의 task를 쓰기로 했습니다. ^^
God bless me and you. ^^
도움이 되셨다면, 광고 클릭을 ㅎㅎ ^^
Labels:
intel tbb,
skip list,
tinyNetworkLib
2011년 3월 23일 수요일
tinyNetworkLib
0. basic system API, templates
1. socket 과 관련된 cross-platform wrapper API ( listen, accept, send, recv, set_opt 등 )
2. thread,mutex,semaphore 와 관련된 것들( 또는 Intel TBB 사용)
3. socket event handler ( poll,epoll,kqueue,IOCP )
4. circular buffer for zero-copy
5. packet slicer
6. some example packet designs and parsers
7. some network threads
8. packet dispatcher
9. packet serializer/handler
10. packet serialize using google protobuf
11. some example encryper/decryptor
12. some memory managers
13. some send threads
14. some DB threads
15. some log threads
16. some system admin threads
17. some logic worker threads
18. user manager
19. service(daemon) controller/configurator
20. some actor-based logic worker threads
21. ipc using thrift
22. some interfaces to Erlang or Haskell module and script languages(lua,python,ruby)
23. client examples ( c, c++ , lua, objective-c(iphone,MacOSX) , java, java(android), python )
24. benchmark tests
이것들을 포함하는 최소화되어 간단한 network library를 만들고, 이름을 tinyNetworkLib로 짓기로 했다.
목표는 가장 일반화된 서버 머쉰 사양에서 가장 최적화되어 잘 돌아가는 것이다.
업무 외 시간에 함께 하실 분은 연락주세요. ^^
온라인 서비스 개발에 사용하실 분도 연락주세요. ^^
1. socket 과 관련된 cross-platform wrapper API ( listen, accept, send, recv, set_opt 등 )
2. thread,mutex,semaphore 와 관련된 것들( 또는 Intel TBB 사용)
3. socket event handler ( poll,epoll,kqueue,IOCP )
4. circular buffer for zero-copy
5. packet slicer
6. some example packet designs and parsers
7. some network threads
8. packet dispatcher
9. packet serializer/handler
10. packet serialize using google protobuf
11. some example encryper/decryptor
12. some memory managers
13. some send threads
14. some DB threads
15. some log threads
16. some system admin threads
17. some logic worker threads
18. user manager
19. service(daemon) controller/configurator
20. some actor-based logic worker threads
21. ipc using thrift
22. some interfaces to Erlang or Haskell module and script languages(lua,python,ruby)
23. client examples ( c, c++ , lua, objective-c(iphone,MacOSX) , java, java(android), python )
24. benchmark tests
이것들을 포함하는 최소화되어 간단한 network library를 만들고, 이름을 tinyNetworkLib로 짓기로 했다.
목표는 가장 일반화된 서버 머쉰 사양에서 가장 최적화되어 잘 돌아가는 것이다.
업무 외 시간에 함께 하실 분은 연락주세요. ^^
온라인 서비스 개발에 사용하실 분도 연락주세요. ^^
Labels:
socket,
tinyNetworkLib
피드 구독하기:
글 (Atom)