Skip to content

Commit

Permalink
Cache sizing is critical for performance. This change guesses at a
Browse files Browse the repository at this point in the history
reasonable setting for the WiredTiger cache size at runtime.  This cache
is shared across all vnodes regarless of how many are active at any
given time.  The algorithm is: max(1GB, 1/3 (RAM - Beam RSS size)). We don't
enable direct_io on purpose and data will be double buffered in WiredTiger's
cache and the filesystem buffer cache.  This turns out to be faster than
direct I/O despite wasting a bit of RAM.
  • Loading branch information
Gregory Burd committed Mar 14, 2013
1 parent efdeb70 commit 1d6dfee
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 4 deletions.
44 changes: 41 additions & 3 deletions src/riak_kv_wterl_backend.erl
Expand Up @@ -24,6 +24,8 @@
-behavior(temp_riak_kv_backend).
-author('Steve Vinoski <steve@basho.com>').

-compile([{parse_transform, lager_transform}]).

%% KV Backend API
-export([api_version/0,
capabilities/1,
Expand Down Expand Up @@ -111,7 +113,7 @@ start(Partition, Config) ->
{logging, true},
{transactional, true},
{session_max, SessionMax},
{cache_size, "2GB"},
{cache_size, size_cache(Config)},
{sync, false}
%% {verbose,
%% ["block", "shared_cache", "ckpt", "evict",
Expand All @@ -135,8 +137,7 @@ start(Partition, Config) ->
session=SRef,
partition=Partition}};
{error, ConnReason}=ConnError ->
lager:error("Failed to start wterl backend: ~p\n",
[ConnReason]),
lager:error("Failed to start wterl backend: ~p\n", [ConnReason]),
ConnError
end;
Error ->
Expand Down Expand Up @@ -476,6 +477,43 @@ fetch_status(Cursor, {ok, Stat}, Acc) ->
[What,Val|_] = [binary_to_list(B) || B <- binary:split(Stat, [<<0>>], [global])],
fetch_status(Cursor, wterl:cursor_next_value(Cursor), [{What,Val}|Acc]).

size_cache(Config) ->
Size =
case app_helper:get_prop_or_env(cache_size, Config, wterl) of
{ok, Value} ->
Value;
undefined ->
RunningApps = application:which_applications(),
FinalGuess =
case proplists:is_defined(sasl, RunningApps) andalso
proplists:is_defined(os_mon, RunningApps) of
true ->
Memory = memsup:get_system_memory_data(),
TotalRAM = proplists:get_value(system_total_memory, Memory),
FreeRAM = proplists:get_value(free_memory, Memory),
UsedByBeam = proplists:get_value(total, erlang:memory()),
Target = ((TotalRAM - UsedByBeam) div 3),
FirstGuess = (Target - (Target rem (1024 * 1024))),
SecondGuess =
case FirstGuess > FreeRAM of
true -> FreeRAM - (FreeRAM rem (1024 * 1024));
_ -> FirstGuess
end,
case SecondGuess < 1073741824 of %% < 1GB?
true -> "1GB";
false ->
ThirdGuess = SecondGuess div (1024 * 1024),
integer_to_list(ThirdGuess) ++ "MB"
end;
false ->
"1GB"
end,
application:set_env(wt, cache_size, FinalGuess),
lager:warning("Using best-guess cache size of ~p for WiredTiger storage backend.", [FinalGuess]),
FinalGuess
end,
Size.

%% ===================================================================
%% EUnit tests
%% ===================================================================
Expand Down
4 changes: 3 additions & 1 deletion src/temp_riak_kv_backend.erl
Expand Up @@ -272,7 +272,9 @@ empty_check({Backend, State}) ->
}.

setup({BackendMod, Config}) ->
%% Start the backend
lager:start(),
application:start(sasl),
application:start(os_mon),
{ok, S} = BackendMod:start(42, Config),
{BackendMod, S}.

Expand Down

0 comments on commit 1d6dfee

Please sign in to comment.