2012년 9월 28일 금요일

erlang web server experience


결과적으로 일반적인 웹 작성(text/html)에는 mochiweb을 쓰고,
json/application을 위해서는 cowboy를 쓰고 있다.

webmachine을 처음에 쓰다가, 성능 테스트 후 실망하고, mochiweb의 예전 버젼에 dependency가 있음으로 인해서, 버그가 수정안 된 것을 알고, cowboy로 급히 전환했었다.
cowboy는 binary기반으로 mochiweb은 list기반으로 처리하기 때문에, 많은 코드를 수정해야 했다.

erlang web쪽의 발전이 가히 눈씻고 봐야 할 정도라고 봐야 한다.
아직, 뚜렷한 1인자는 없다.
mochiweb,cowboy가 경쟁할 듯 보이고, 다소 무거워 보이는 ChicagoBoss는 어찌 될지 모르겠다. 다른 웹 서버들도 생겨나고 있다...
아직은 erlang web 서버 시장의 1인자를 위해서 경쟁을 시작할 가치는 있어보인다.
아직 erlang을 잘 다루는 프로그래머가 별로 많지 않기 때문에,
철저한 테스트를 통한 경험을 기반으로 한 솔루션이 3년내에 나올 것이라 본다.

그런데, 앞으로, erlang을 기반으로 한 서버 솔루션이 대세가 될 것으로 내다본다.
왜냐하면, 실제로 해보면, php만큼 쉽다. 결코 어렵지 않다. 게다가 경험자가 손봐주면, 놀라울 정도의 성능과 확장성을 확보할 수 있기 때문이고, 이와 연동하는 DB들도 성숙할 것이기 때문이다.

haskell쪽도 기대를 내심 하고 있는데... haskell의 wai를 지켜봐야 한다.
haskell로 서버/클라이언트 모두 하나의 코드로 만들 수 있는 시대가 올 것으로 기대한다.




2012년 9월 3일 월요일

2i in riak leveldb

qrtest_driver_riakclient_leveldb.erl
다음과 같이 index를 줘서 put을 하고,

run(put2, KeyGen, ValueGen, State) ->
    DeviceQRBin = list_to_binary(get_random_string(2,"0123456789ABCDEF")),
    BucketBin = << <<"qr_log">>/binary , DeviceQRBin/binary >>,
    NowKey=term_to_binary(now()), %% for distionction

    ProviderID = random:uniform(10),
    ActionBin = list_to_binary(get_random_string(2,"ABCDEF")),
    ResultBin = list_to_binary(get_random_string(2,"123456")),

    T = util_time:epoch(), %% time in second
    It=#qr_log{ device_qr = DeviceQRBin , provider_id = ProviderID, action= ActionBin, result=ResultBin , time=T },

    MetaData = dict:store(<<"index">>, [ {"time_int", T}, {"action_bin", ActionBin} ], dict:new()),
    Robj = riak_object:new(BucketBin,NowKey, term_to_binary(It),MetaData),      

    case (State#state.client):put(Robj, State#state.replies) of
        ok ->
            io:format("."),
            {ok, State};
        {error, Reason} ->
            %%io:format("?~p~n",[Reason]),
            io:format("?"),
            {error, Reason, State};
        _ ->
            io:format("-")
    end;

다음과 같이 get을 하면 된다.






  
    qrtest_driver_riakclient_leveldb.erl
    
  
  
    
run(get_index1, KeyGen, _ValueGen, State) ->
    DeviceQRBin = list_to_binary(get_random_string(2,"0123456789ABCDEF")),
    BucketBin = << <<"qr_log">>/binary , DeviceQRBin/binary >>,
    ActionBin = list_to_binary(get_random_string(2,"ABCDEF")),
    Query = { eq , <<"action_bin">> , ActionBin  }, %%=> not to crash

    case (State#state.client):get_index(BucketBin, Query , 10000) of %% 10000 is timeout value
        {ok, R} ->
            io:format("!~p",[R]),
            {ok, State};
        {error, notfound} ->
            io:format("_"),
            {ok, State};
        {error, Reason} ->
            {error, Reason, State};
        {error, timeout , _ } ->
            io:format("T"),
            {ok, State};
        _ ->
            io:format("="),
            {ok, State}     
    end;

best way to install erlang and riak in macosx

maxosx에서 여러가지 시도를 해보았는데, 가장 쉽고 좋은 방법은,...

이전 erlang과 riak을 모두 지우고,

https://github.com/spawngrid/kerl
에서 다운받아 설치하고,

kerl로 설치하는 것.

$ kerl list releases


$ kerl build R15B01 r15b01


$ kerl install r15b01 /usr/local/erlang


riak install page에서 나오듯이 binary로 설치하는 것.

http://wiki.basho.com/Installing-on-Mac-OS-X.html


curl -O http://downloads.basho.com.s3-website-us-east-1.amazonaws.com/riak/CURRENT/osx/10.4/riak-1.2.0-osx-x86_64.tar.gz
tar xzvf riak-1.2.0-osx-x86_64.tar.gz


linux server 환경에서도 마찬가지이다.

2012년 9월 2일 일요일

riak performance in KT ucloud

debian squeeze 64bit
Riak 1.2.0
4Core 16GB
Bitcask backend default setting
basho_bench 10 concurrent workers, get:put:delete=1:1:1

일 때,

처리량은 4000~5000 tps 정도를 기록하고,
latency는 95%가 5ms 이하로 나온다.

만족스럽긴 하지만, cloud환경에서는 machine setting이 불가능 하니,
bitcask setting이나 os setting등을 통해서 향상이 가능할 듯 하다.
KT측과 disk 성능에 대해서 상의해 보아야 할 듯 하다.

riak_pb(protocol buffers) client를 사용하면 10~20% 성능 저하를 가져온다.
riak_raw_http client를 사용하면 50%  정도 성능 저하가 생긴다.

자세한 사항이 궁금하다면, 문의하세요~