cdecl/asb 개발 중..
1. wg/wrk (Modern HTTP benchmarking tool)
- wrk는 커맨드 라인의 옵션으로, 간단한게 Http 서비스의 성능 평가를 할 수 있는 툴.
- 윈도우 환경에서도 쓸 수 있지 않을까 했지만, Linux의 aio(Asynchronous I/O)으로 구현 되어 있어 포팅 불가.
- 비슷한 툴로 Apache ab, JoeDog/siege 등이 있으며, github에 "benchmark" 등의 단어로 검색하면 더 많은 언어로 작성되어 있는 오픈소스를 찾아 볼 수 있음.
2. Boost Asio
- 윈도우 환경이라면 IOCP로 작성 가능 하겠지만, 기본적으로 작성해야 할 내용이 많고 크로스 플랫폼을 지원하고 성능적인 부분에서 검증이 되어 있는 Asio로 작성
- boost 라이브러리는 소스 및 필요한 바이너리만 컴파일 하여 사용. (system, regex, date-time, thread)
- regex나 thread의 경우 이미 C++11에 포함 되어 있지만 Asio 구현체가 Boost 것을 사용 함.
3. Visual C++ 2013
- 가장 C++11이 적합한 VC++ 컴파일러.
- boost 및 openssl 의 경우 NuGet 으로 편하게 라이브러리를 추가해서 사용 할 수 있음.
- boost는 NuGet의 버전이 낮고, 위에 언급한 이유로 별도로 빌드 하여 사용 함. 그리고 x64 staitc 빌드에서 crt 관련 링크 에러가 발생?
4. g++ 4.9.1
- ubuntu 환경에서 g++로 컴파일.
- hyper-v 환경에서 ubuntu 14.04로 개발 테스트를 하다, 이후 14.10으로 변경.
- g++가 문법적으로는 C++11을 VC++에 비해 더 잘 지원하는것 같으나, 기본 라이브러리가 아직 C++11에 미흡한 것들이 있음.
- std::regex 는 아직 지원을 하지 않아 boost::regex를 사용. 찾아보니 버전 5. 이상에서 지원할 것이라 추측.
- std::stringstream 의 swap 및 move ctor를 지원하지 않음.
- OpenSSL의 경우 apt-get 패키지로 설치.
5. Git
- 윈도우 버전의 경우 Git과 같이 배포되는 *nix 의 커맨드라인 툴이 유용함.
- tortoies-git 을 사용하는데, 몇가지 명령어는 svn 식으로 표현 된것 같음.
6. SSL (OpenSSL)
- asio에서 지원하는 ssl 코드를 사용해서 ssl 내부적인 내용까지는 구현이 필요 없었음. (다행히도..)
7. 성능
- 환경 Laptop Intel i5(4세대), 4 Core, 8G RAM, Windows 8.1 64bit (Ubuntu 14.04 on hyper-v , 4 core, 1G RAM)
- 윈도우 환경에서는, 최적의 옵션의 경우, IIS(local, static html) 초당 40,000 이상 호출 결과.
- 윈도우 환경 최대 연결 개수는 약 26,000 클라이언트 개수까지 테스트
- Ubuntu (on hyper-v) 환경에서는, Nginx(local, static html) 호출, 초당 35,000 이상 호출 결과.
- Ubuntu 환경 최대 연결 개수를 약 30,000 클라이언트 개수까지 테스트
- wrk 에 비해 성능이 10~20% 정도 떨어지는 것 같음. (상황에 따라 좀 다른 결과)
8. 전략
- 기본적인 Thread 생성 개수는, 메인 + io_service 개수 + 사용자 Thread 개수가 생성이 됨
- io_service를 Thread 별로 생성을 한다면, -t 4 옵션의 경우 9개가 생성됨
- io_service는 한개만 생성하고 io_service::run() 를 사용자 Thread 에서 실행한다면, -t 4 옵션의 경우 5개 생성
- 테스트 결과 io_service per thread VS io_service::run() per thread 성능상 별 차이 없어 보여서 적게 생성되는 방향 정리.
* 기타
- 개발 중, Http Client 모듈 수정하여 http_client 라이브러리 만듬
'Dev > C++' 카테고리의 다른 글
멀티쓰레드 최적화 힙 메모리 할당기 - tcmalloc. jemalloc (1) | 2015.04.06 |
---|---|
cdecl/asb - Http benchmarking and load test tool for windows, posix (0) | 2015.03.18 |
Catch (A modern, C++-native, header-only, framework for unit-tests, TDD and BDD) (0) | 2015.02.26 |
C++ REST SDK (casablanca) 간단 샘플 (0) | 2015.02.17 |
[C++11] Variadic template (0) | 2014.11.02 |