Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Cache sizing is critical for performance. This change guesses at a

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...
commit 1d6dfee19245ce1d02162b8f2889c16cac057b37 1 parent efdeb70
@gburd gburd authored
Showing with 44 additions and 4 deletions.
  1. +41 −3 src/riak_kv_wterl_backend.erl
  2. +3 −1 src/temp_riak_kv_backend.erl
View
44 src/riak_kv_wterl_backend.erl
@@ -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,
@@ -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",
@@ -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 ->
@@ -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
%% ===================================================================
View
4 src/temp_riak_kv_backend.erl
@@ -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}.
Please sign in to comment.
Something went wrong with that request. Please try again.