오픈소스 라이센스 검색사이트

라이센스를 검색해보다가 발견한 사이트.

아마 프로그래머들이라면 특정 오픈소스 라이브러리를 가져다가 쓸 일이 많을텐데 이놈의 오픈소스들은 규격화된 라이센스조차도 수십가지인지라 도무지 이게 뭔내용인지 기억할래야 할수가 없다.

Boost 라이브러리를 쓰다가 Boost 라이센스라는게 있길래 이 라이센스는 도대체 내용이 뭐인지 찾다가 발견했다.

부스트 라이센스는 다음과 같았다,

https://olis.or.kr/license/Detailselect.do?lId=1070

각종 오픈소스 라이브러리를 사용할 때마다 한번씩 참고해봐야겠다.

CentOS 7에 plexpy 설치

plex 서버를 잘 사용 중인데 plexpy라는게 있다고 한다. 대강 보니 모니터툴 같은데 일단 리눅스에서 plexpy 를 설치해본다. 인터넷에 있는 몇몇 문서들은 도커를 이용한 설치를 예시로 하고 있는데 내 서버들은 아직 도커를 쓰지 않으므로 그냥 설치하는 것으로.

리눅스는 CentOS 7. plexpy 홈페이지에 들어가 InstallGuide 문서를 읽어본다.

https://github.com/JonnyWong16/plexpy/wiki/Installation

GIT을 이용하여 소스 코드를 다운 받는다.

git clone https://github.com/JonnyWong16/plexpy.git

[root@localhost source]# git clone https://github.com/JonnyWong16/plexpy.git
 Cloning into 'plexpy'...
 remote: Counting objects: 15652, done.
 remote: Total 15652 (delta 0), reused 0 (delta 0), pack-reused 15652
 Receiving objects: 100% (15652/15652), 77.18 MiB | 2.67 MiB/s, done.
 Resolving deltas: 100% (8905/8905), done.
 [root@localhost source]#

설치문서에는 /opt 에 설치하는 것을 예로 들고 있지만 이 경로를 난 좋아하지 않으므로 /usr/local/plexpy 에 설치할 예정.

다운 받은 내용을 /usr/local/plexpy 로 이동한다.

[root@localhost source]# mv plexpy /usr/local/
 [root@localhost source]# cd /usr/local/plexpy
 [root@localhost plexpy]#

plexpy.py를 실행하면 StandAlone 으로 실행하는 것 같지만 난 데몬서비스가 더 좋으므로 관련 문서를 읽어본다.

https://github.com/JonnyWong16/plexpy/wiki/Install-as-a-daemon

리눅스인 경우 다음의 문서를 읽어보라고 한다.

https://github.com/JonnyWong16/plexpy/blob/master/init-scripts/init.systemd

보여지는 스크립트 파일 내용을 vi 를 이용해 plexpy.service 파일로 입력한다.

파일 안에 있는 /opt 로 시작하는 경로들을 나에게 맞도록 /usr/local q로 시작하도록 수정한 다음 저장한다. 실행 유저과 그룹도 plexpy 로 변경.

.service 파일은 보통 /lib/systemd/system 에 저장한다고 하니 그곳으로 옮겨주고 스크립트를 재로딩한 다음, 제대로 읽혀지는지 테스트해본다.

[root@localhost plexpy]# mv plexpy.service /lib/systemd/system
 [root@localhost plexpy]# systemctl daemon-reload
 [root@localhost plexpy]# systemctl status plexpy.service
 ● plexpy.service - PlexPy - Stats for Plex Media Server usage
 Loaded: loaded (/usr/lib/systemd/system/plexpy.service; disabled; vendor preset: disabled)
 Active: inactive (dead)
 [root@localhost plexpy]#

서비스를 시작한다.

[root@localhost plexpy]# systemctl start plexpy.service
 Job for plexpy.service failed because the control process exited with error code. See "systemctl status plexpy.service" and "journalctl -xe" for details.
 [root@localhost plexpy]#

 

에러가 난다. 에러메시지대로 status 명령을 입력해본다.

[root@localhost plexpy]# systemctl status plexpy.service
 ● plexpy.service - PlexPy - Stats for Plex Media Server usage
 Loaded: loaded (/usr/lib/systemd/system/plexpy.service; disabled; vendor preset: disabled)
 Active: failed (Result: exit-code) since 화 2017-09-12 14:24:11 KST; 1min 10s ago
 Process: 23144 ExecStart=/usr/local/plexpy/PlexPy.py --quiet --daemon --nolaunch --config /usr/local/plexpy/config.ini --datadir /usr/local/plexpy (code=exited, status=217/USER)

9월 12 14:24:11 localhost.localdomain systemd[1]: Starting PlexPy - Stats for Plex Media Server usage...
 9월 12 14:24:11 localhost.localdomain systemd[1]: plexpy.service: control process exited, code=exited status=217
 9월 12 14:24:11 localhost.localdomain systemd[1]: Failed to start PlexPy - Stats for Plex Media Server usage.
 9월 12 14:24:11 localhost.localdomain systemd[1]: Unit plexpy.service entered failed state.
 9월 12 14:24:11 localhost.localdomain systemd[1]: plexpy.service failed.
 [root@localhost plexpy]#

 

설치 문서를 읽어보니 환경설정에 대한 내용을 하나도 실행 안한 것이었다.

유저를 추가하고 권한을 준다.

[root@localhost plexpy]# adduser --system --no-create-home plexpy
 [root@localhost plexpy]# chown plexpy:plexpy -R /usr/local/plexpy
 [root@localhost plexpy]#

 

이제 다시 시작해보면 에러가 나지 않는다.

[root@localhost plexpy]# systemctl start plexpy.service
 [root@localhost plexpy]#

 

서비스를 자동실행으로 등록한다.

[root@localhost plexpy]# systemctl enable plexpy.service
 Created symlink from /etc/systemd/system/multi-user.target.wants/plexpy.service to /usr/lib/systemd/system/plexpy.service.
 [root@localhost plexpy]#

 

웹브라우저로 서버의 8181 포트를 열어보면 다음과 같은 화면이 나온다. 이제부터는 웹에서 설정!

그런데 막상 설치해서 보니까 이게 뭐… 딱히 모니터링이라 하기도 애매하고… 어디다 써야할지는 잘 모르겠다. 아파치에 같이 물릴려고 했는데 귀찮아서 그냥 쓰는 것으로.

리눅스에서 스왑 메모리 관리하기

가상서버로 이사한 이후 메모리가 너무 적은지 계속 메모리 관련 에러가 난다.

passenger 모듈 설치에도 메모리에러 때문에 잘 안되었었는데 redmine + git을 사용하려고 하니 또 메모리가 너무 적다고 안된다고 한다. 아무래도 스왑메모리를 2기가 정도 지정해놓고 계속 써야할 모양.

dd if=/dev/zero of=/swap bs=1024 count=2048000

명령으로 2기가짜리 빈 파일을 만든다.

mkswap /swap

명령으로 스왑 생성

swapon /swap

명령으로 스왑 활성화

/etc/fstabs 에 추가

/swap swap swap defaults 0 0

redmine 설치 + passenger 모듈 설치시 에러

새로 설치된 서버에서 레드마인을 설치하다가 알게 된 사실.

레드마인에 Passenger 모듈을 이용해 아파치와 연동하려고 했다.

패신저 모듈을 설치하고 명령을 내렸는데…

c++ -o buildout/support-binaries/UstRouterMain.o  -Isrc/agent -Isrc/cxx_supportlib -Isrc/cxx_supportlib/vendor-copy -Isrc/cxx_supportlib/vendor-modified -Isrc/cxx_supportlib/vendor-modified/libev -Isrc/cxx_supportlib/vendor-copy/libuv/include -D_REENTRANT -I/usr/local/include -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long -Wno-missing-field-initializers -feliminate-unused-debug-symbols -feliminate-unused-debug-types -fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED -Wno-attributes -ggdb -DHAS_ALLOCA_H -DHAVE_ACCEPT4 -DHAS_SFENCE -DHAS_LFENCE -DPASSENGER_DEBUG -DBOOST_DISABLE_ASSERTS -std=gnu++11 -Wno-unused-local-typedefs -DHASH_NAMESPACE="__gnu_cxx" -DHASH_MAP_HEADER="<hash_map>" -DHASH_MAP_CLASS="hash_map" -DHASH_FUN_H="<hash_fun.h>" -c src/agent/UstRouter/UstRouterMain.cpp
c++: internal compiler error: 죽었음 (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
rake aborted!
-----------------------------------------------
Your compiler failed with the exit status 4. This probably means that it ran out of memory. To solve this problem, try increasing your swap space: https://www.digitalocean.com/community/articles/how-to-add-swap-on-ubuntu-12-04
/usr/local/share/gems/gems/passenger-5.0.30/build/support/cplusplus.rb:41:in `run_compiler'
/usr/local/share/gems/gems/passenger-5.0.30/build/support/cplusplus.rb:102:in `compile_cxx'
/usr/local/share/gems/gems/passenger-5.0.30/build/support/cplusplus.rb:160:in `block in define_cxx_object_compilation_task'
Tasks: TOP => apache2 => buildout/support-binaries/PassengerAgent => buildout/support-binaries/UstRouterMain.o
(See full trace by running task with --trace)

--------------------------------------------

It looks like something went wrong

메시지와 함께 에러. 메모리가 부족하니 스왑메모리 용량을 늘리라는 메시지인데 스왑메모리 용량을 늘리는 작업을 하기에는 너무나 번거롭고… 어떻게 해야하나 고민중. Thin 서버를 쓰는 방향을 생각 중이다.

추가.

passenger-install-apache2-module 명령을 내려서 실행하다보면 다음과 같은 메시지가 있다.

Your system does not have a lot of virtual memory

Compiling Phusion Passenger works best when you have at least 1024 MB of virtual
memory. However your system only has 993 MB of total virtual memory (993 MB
RAM, 0 MB swap). It is recommended that you temporarily add more swap space
before proceeding. You can do it as follows:

  sudo dd if=/dev/zero of=/swap bs=1M count=1024
  sudo mkswap /swap
  sudo swapon /swap

See also https://wiki.archlinux.org/index.php/Swap for more information about
the swap file on Linux.

If you cannot activate a swap file (e.g. because you're on OpenVZ, or if you
don't have root privileges) then you should install Phusion Passenger through
DEB/RPM packages. For more information, please refer to our installation
documentation:

  https://www.phusionpassenger.com/library/install/apache/

Press Ctrl-C to abort this installer (recommended).
Press Enter if you want to continue with installation anyway.

읽어보면 메모리가 부족하다는 경고와 메모리 부족시 해결하는 방법과 작업실행 중단을 권고하는 메시지이다. 처음에는 이 메시지를 무시하고 계속 설치했기에 문제가 일어났었다.

구글에 검색해봐도 뾰족한 방법이 없기에 안내 메시지에 따라서 실행해봤다.

[root@localhost redmine-3.3.1]# free -h
              total        used        free      shared  buff/cache   available
Mem:           993M        566M         80M         56M        346M        233M
Swap:            0B          0B          0B
[root@localhost redmine-3.3.1]# ll /dev/zero
crw-rw-rw- 1 root root 1, 5 10월 18 15:42 /dev/zero
[root@localhost redmine-3.3.1]# dd if=/dev/zero of=/swap bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.11671 s, 507 MB/s
[root@localhost redmine-3.3.1]# mkswap /swap
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=0678c873-6899-4c19-b208-e2d69ed55bac
[root@localhost redmine-3.3.1]# swapon /swap
swapon: /swap: insecure permissions 0644, 0600 suggested.
[root@localhost redmine-3.3.1]# free -h
              total        used        free      shared  buff/cache   available
Mem:           993M        566M         66M         56M        359M        235M
Swap:          1.0G          0B        1.0G
[root@localhost redmine-3.3.1]#

실행하고 나니 0바이트였던 스왑메모리가 1기가로 지정되었다. 다시 passenger-install-apache2-module 명령을 내리면 아까와 같은 경고메시지는 없어지고 컴파일이 순조롭게 진행되었다.

Google Breakpad 설치 (1)

Google Breakpad를 사용하기 위한 방법에 대해 고생했던 것을 정리한다.

윈도우와 리눅스에서 동시에 사용할 수 있는 서버프로그램을 개발하고 있는데 윈도우에서야 미니덤프를 이용하여 덤프를 남기면 되지만 리눅스에서는 coredump라는 생소한 시스템을 이용해야해서 아예 크로스플랫폼 덤프 시스템을 찾다가 구글브레이크패드를 이용해봐야겠다는 생각에 시작했다.

https://chromium.googlesource.com/breakpad/breakpad 로 이동한다. 많은 블로그에서 http://google-breakpad.googlecode.com/svn/trunk 에서 체크아웃 받으라고 나와있지만 이것은 옛날 정보이다. 현재를 기준으로 사이트는 이동되었으며 SVN이 아니라 GIT을 이용해야 소스를 받을 수 있다.

GIT을 이용하면 되긴하나 귀찮으므로 master 브랜치를 선택하고 tgz로 압축된 파일을 받는다. 7zip을 이용하여 압축파일의 압축을 해제한다. 윈도우에서는 tgz 파일을 풀어서 tar 파일을 만들고 다시 또 한번 아카이빙을 풀어야한다. 물론 7zip 하나로 다 가능하다.

프로그램 설명서를 보기 위해 doc 폴더로 이동을 하면…. 아오… 마크다운 형식의 .md 파일만 잔뜩 들어있다. 브라우저로 볼 수가 없으므로 귀찮아서 그냥 구글 브레이크패드 홈페이지의 도큐먼트를 읽어보면 된다.

….근데 모르겠다.

대충 다른 블로그를 찾아보니 gyp 라는 시스템으로 비주얼스튜디오 솔루션 파일을 생성하면 되고…. gyp는 오픈소스이고… 구글 브레이크패드 소스를 받으면 포함되어 있단다. 근데 내가 보기에는 아무리 찾아도 gyp 라는 시스템이 포함되어 있진 않은 것 같다.

구글에 찾아보니 https://chromium.googlesource.com/external/gyp 에 가면 받을 수 있덴다.

가보니 또 git으로 받으라고 한다. 그냥 tgz 파일을 받고 압축을 푼다. 이 프로그램은 홈페이지에 도큐먼트도 없고 도움말도 없다. 뭐 어쩌라는건지…?

한참 애먹은 끝에… 일단 파이선을 설치하고(일단 최신버전인 3.5.2로 설치했다.), cmd 를 관리자권한으로 열고, python setup.py install 을 실행하면 된다는걸 알아냈다. 아오 짜증… 여튼 명령어를 입력하면 뭔가 텍스트가 촤르르륵 올라간다.

자 이제 다시 구글 브레이크패드를 다운 받은 폴더로 이동해서… src/build 에 있는 all.gyp를 실행하기 위해 gyp all.gyp 를 입력한다.

…..는 실패. 문법 오류가 있다고 한다.

그럼 다시 src/client/windows 의 breakpad_client.gyp 를 실행해본다.

…는 실패. 문법 오류가 있다고 한다.

파이선버전 문제인가 싶어서 3.5.2 버전을 다 지우고 2.7.12 버전으로 다시 설치하고 아까 all.gyp 명령을 다시 실행해본다.

안된다. 파이선을 재설치하는 과정에서 gyp가 다 삭제되었다. 다시 gyp를 설치한다.

다시 해봤는데 똑같다… 아오 힘들어.

http://yardbirds.tistory.com/107 를 보니

src\client\windows 폴더에서 ..\..\tools\gyp\gyp.bat breakpad_client.gyp 를 실행하면 솔루션 파일과 프로젝트 파일이 생성되는 것을 볼 수 있다.

라고 한다. 해봤다.

D:\Library\google-breakpad\src\client\windows>d:\Library\gyp-master\gyp.bat breakpad_client.gyp
gyp: Cycles in .gyp file dependency graph detected:
Cycle: breakpad_client.gyp -> sender\crash_report_sender.gyp -> breakpad_client.gyp
Cycle: unittests\client_tests.gyp -> breakpad_client.gyp -> unittests\client_tests.gyp
Cycle: unittests\client_tests.gyp -> crash_generation\crash_generation.gyp -> breakpad_client.gyp -> unittests\client_tests.gyp
Cycle: breakpad_client.gyp -> crash_generation\crash_generation.gyp -> breakpad_client.gyp
Cycle: unittests\client_tests.gyp -> handler\exception_handler.gyp -> crash_generation\crash_generation.gyp -> breakpad_client.gyp -> unittests\client_tests.gyp
Cycle: breakpad_client.gyp -> handler\exception_handler.gyp -> crash_generation\crash_generation.gyp -> breakpad_client.gyp
Cycle: breakpad_client.gyp -> tests\crash_generation_app\crash_generation_app.gyp -> handler\exception_handler.gyp -> crash_generation\crash_generation.gyp -> breakpad_client.gyp

갑자기 무슨 사이클을 돈다는 개소리를 하면서 안된다. 구글에서 Cycles in .gyp file dependency graph detected 라는 문장으로다시 검색.

http://stackoverflow.com/questions/2925094/how-to-build-google-breakpad 를 보니 –no-circular-check 옵션을 붙이면 된단다. 옵션을 붙였더니 그제서야 비주얼스튜디오 솔루션 파일이 생성되었다.

아이고 힘들다…

서버 성능 테스트 2차

서버를 만들며 다시 해본 테스트 결과이다.

저번 테스트와는 다르게 서버컴퓨터와 클라이언트컴퓨터를 분리해서 테스트했다. 서버는 운영체제는 CentOS 7, 인텔 i7 8코어, 16GB 메모리를 장착한 컴퓨터이다. 리눅스에서 gcc 4.8.2로 빌드되었다.

100개의 커넥션으로 100ms마다 5000개의 패킷을 전송한 결과는 다음과 같다.

K-006

송수신을 합쳐 거의 70만~90만개의 패킷을 처리했다. 서버가 받는 패킷보다 내보내는 성능이 현저히 좋지 않았으며 성능이 시간의 흐름에 따라 굉장히 떨어졌다가 굉장히 올라갔다가를 반복했다. 이 때 서버의 CPU는 8개 코어가 거의 95% 이상의 점유율을 보여줬다. 코어를 거의 다 사용하는데 이건 좀 과한게 아닌가 싶다.

그리고 테스트 경우에 따라 응답패킷이 거의 안 오는 경우도 발생했는데 이것은 시간을 두고 찾아봐야할 것 같다.

조금 더 개선하면 나아지지 않을까 생각이 든다.

 

2016년 6월 3일 추가.

Google tcmalloc을 적용했으며 테스트 환경은 위와 같다.

K-007

테스트하면서 가장 적절한 수치를 찾아보려고 했는데 대략 3000번 정도의 패킷은 무난히 처리할 수 있었다. 이 수치를 5000, 4000, 3000으로 낮춰가며 테스트했는데 5000, 4000에서는 시간이 지날수록 패킷 처리량이 감소하는 등의 문제가 생겼고 3000에서는 부담 없이 계속적으로 처리할 수 있었다. 이때 초당 처리한 메시지수는 60만 정도였다.

하나 알게된 사실은 메모리 누수를 발견했다. 시간이 지날수록 서버의 메모리 사용량이 계속적으로 증가했는데 아직 원인을 찾을 수 없다.

GCC 최적화 옵션

GCC로 컴파일하던 중 spdlog 라이브러리에서 컴파일시 -O3 옵션을 사용하는 것을 보고 궁금증이 생겨 찾아보았다.

GCC 최적화 옵션에 대해 자세하게 설명되어 있는 페이지.

http://jinynet9.tistory.com/113

* 커널 컴파일 시 최적화 옵션 -O2만 사용하는 이유
커널은 인라인 함수를 많이 사용하고 있다. -O3 최적화는 컴파일러가 판단해서 인라인을 인라인이 빠른 것은 인라인으로, 함수가 빠른 것은 함수로 바꿔버린다. 커널은 최적화된 수행 속도를 위해 의도적으로 인라인 함수를 사용하고 있어서 컴파일러에 의해서 자의적으로 함수로 바뀌는 것을 막기 위해 -O2 옵션을 사용한다.

커널 컴파일은 아니지만 최적화 옵션을 -O2 로 변경했다. 컴파일 옵션을 변경하고 -O3일 때와 파일 크기를 비교해보았는데 거의 차이가 나지 않았다. 앞으로도 -O2로 사용하면 될듯하다.

dependent-name is parsed as a non-type, but instantiation yields a type 에러 해결 방법

다음과 같은 코드를 작성했다.

template<typename T1, typename T2>
class ObjectMap
{
public:
    typedef boost::mutex                    Mutex;
    typedef boost::lock_guard<Mutex>      LockGuard;
    typedef std::map<T1, T2>              Map;

    bool InsertObject(T1& key, T2& object)
    {
        LockGuard lock(object_map_mutex_);
        auto result = object_map_.insert(Map::value_type(key, object));
        return result.second;
    }

대략 템플릿으로 std::map을 래핑해서 사용하려는 클래스인데 이 코드는 Visual Studio 2015 에서 아무 문제 없이 컴파일되며 실제로 작동상에도 아무 문제가 없는 코드이다.

하지만 이 코드를 gcc에서 컴파일 하려고 하면 다음과 같은 오류가 발생하며 컴파일 자체가 되질 않는다. 참 신기한 노릇… (컴파일러는 CentOS 7의 gcc 4.8.2 버전이다.)

/container/object_map.h:28:63: error: dependent-name ‘ObjectMap<T1, T2>::Map:: value_type’ is parsed as a non-type, but instantiation yields a type
   auto result = object_map_.insert(Map::value_type(key, object));
                                                               ^
/container/object_map.h:28:63: note: say ‘typename ObjectMap<T1, T2>::Map:: value_type’ if a type is meant

이 문제에 대해 한참을 찾아본 결과 다음의 주소에서 힌트를 얻을 수 있었다.

http://stackoverflow.com/questions/6021686/c-iterator-to-stdmap

원인은 해당하는 부분에 컴파일러가 타입을 알 수 없다는 얘기.

코드를 다음과 같이 바꾸어주었더니 gcc에서도 컴파일이 잘 된다.

auto result = object_map_.insert(typename Map::value_type(key, object));

예전에도 느꼈지만 리눅스에서 빌드하는거 참 귀찮고 어렵다는거 다시 한번 느낀다.

tbbmalloc을 적용했을 때 성능 변화

dserver의 성능의 문제가 메모리할당에 대한 이슈인가 싶어서 주말동안 tbbmalloc 을 적용했다.

tbbmalloc_proxy를 적용했고 적용하는데는 채 30분도 걸리지 않았다.

적용해서 테스트해본 결과는…..

별 차이 없다. 아마도 메모리할당에 대한 성능이슈는 아닌듯하다.

송수신시에 사용하는 락의 문제일 가능성이 커졌다.

CGCII 테스트 클라이언트를 이용한 dserver 성능 측정

CGCII의 조상현님께서 공개한 CGCII 테스트 클라이언트로 dserver의 echo 성능을 측정해보았다.

사실 게임서버에서 네트워크 라이브러리의 성능보다 비즈니스 로직에서 걸리는 부하가 훨씬 크며 에코로만 서버를 테스트하는게 얼마나 의미가 있을까…라는 생각이 들지만 어찌되었든 CGCII 홈페이지의 글들을 보고 궁금증이 피어오른건 사실이다.

지금 만든 서버는 지금 하고 있는 프로젝트를 위해 설계되었기 때문에 CGCII의 테스트에 맞추기 위해 헤더쪽 수정작업이 있어야했다. 사실 상당히 귀찮았다. 나중에 다시 또 쓸일이 있을까봐 아예 옵션 설정에서 켜고 끌 수 있게 수정했다.

빌드는 Visual Studio 2015 프로페셔널 버전으로 했으며 Release 로 빌드했으며 모든 로깅시스템은 off 되었다. 멀티스레드 기능은 최대한 사용할 수 있도록 설정했다. 테스트한 시스템 사양은 다음과 같다.

  • CPU : Intel i7-6700 3.4GHz
  • RAM : 16GB
  • OS : Windows 10 Pro

서버와 클라이언트는 같은 컴퓨터에서 실행되었다.

테스트 방법은 총 100개의 접속을 유지하고 테스트 클라이언트에서 8Byte의 패킷을 초당 1000개씩 쏘고 Echo 받는 형태이다.

성능테스트한 결과는 다음과 같다. 대략 열번 정도 반복했을 때에도 수치상 이 결과와 크게 차이나지 않았다.

dserver

결과는

  • 메시지처리량 : 초당 20~21만개 정도의 메시지를 처리할 수 있었다.
  • 데이터처리량 : 초당 1.54M ~ 1.6M 정도의 데이터를 처리했다
  • CPU 분산 이용 : 목표한대로 모든 CPU 코어가 모두 균등하게 사용되었다.

dserver

  • CPU 사용률 : 27.1%를 사용했다.
  • RAM 사용률 : 185.1MB를 사용했다.

dserver

cgcii 홈페이지에 있는 결과들과 비교해보면 한심한 수준이다. 싱글스레드로 작동하는 node.js 가 처리하는 수준과 거의 비슷한 정도이다.

그냥 생 ASIO로 만들어진 서버가 처리하는 양보다 거의 1/10 수준이니 뭐… 이정도면 아주 저성능 서버가 아닌가 싶다.

메모리풀을 전혀 사용하지 않았고, 데이터 전송시에 new / delete를 너무 많이 하는 점, 데이터 전송시에 락을 걸며 사용하는 점 등등 때문에 성능이 너무 낮게 나온게 아닌가 싶다.

tcmalloc 이라도 적용해보면 좀더 성능이 올라가지 않을까 싶다.

일단 여기까지 작업 완료.