(Sorry for breaking the thread, I just subscribed.)

I am experiencing very low performance as well. I'm attaching a small
benchmark script. Writing 32 KB chunks yields a much higher rate first,
then disk activity starts after about 4 seconds and throughput is
trashed to about 30-50 put/s. This is on a standard 60 MB/s 12ms
drive.

I've tested both innostore_riak and riak_kv_bitcask_backend. The
latter shows /slightly/ improved performance. What's odd is that there's
always a lot of data read, despite the script not reading data.

Are there any special Linux knobs or secret backend parameters?


Stephan
-module(riak_bench).

-export([run/1]).

-define(BUCKET, <<"benchmark">>).
-record(state, {last_print = make_timestamp(),
                i = 0,
                pending = 0,
                threshold = 1,
                done = 0, last_done = 0,
                client, 
                doc = gen_doc(32 * 1024)}).

run(Threshold) ->
    {ok, Client} = riak:client_connect('r...@127.0.0.1'),
    loop(#state{client = Client,
                threshold = Threshold}).

gen_doc(Size) ->
    list_to_binary([<<(I rem 256)>>
                        || I <- lists:seq(1, Size)]).

loop(#state{i = I,
            pending = Pending,
            threshold = Threshold,
            client = Client,
            doc = Doc} = State)
  when Pending < Threshold ->
    J = I + 1,
    Caller = self(),
    spawn_link(fun() ->
                       K = list_to_binary(io_lib:format("test-~B", [J])),
                       RObj = riak_object:new(?BUCKET, K, Doc),
                       ok = Client:put(RObj, 1, 1),
                       Caller ! done
               end),
    loop(State#state{i = J,
                     pending = Pending + 1});
loop(#state{pending = Pending, last_print = LastPrint,
            done = Done, last_done = LastDone} = State) ->
    receive
        done ->
            Now = make_timestamp(),
            NewDone = Done + 1,
            if
                Now >= LastPrint + 1.0 ->
                    io:format("~B done, ~.1f put/s~n", [NewDone, (NewDone - 
LastDone) / (Now - LastPrint)]),
                    loop(State#state{pending = Pending - 1,
                                     done = NewDone,
                                     last_print = Now,
                                     last_done = NewDone});
                true ->
                    loop(State#state{pending = Pending - 1,
                                     done = NewDone})
            end
    end.

make_timestamp() ->
    {MS, S, SS} = now(),
    MS * 1000000 + S + SS / 1000000.
_______________________________________________
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com

Reply via email to