Attempt at performance improvement
Try to add some extra jitter in to the process of L0 writes, and also make L0 writes delayed to help with bufferring
This commit is contained in:
parent
349d194a7c
commit
82cb49638a
4 changed files with 32 additions and 8 deletions
|
@ -64,7 +64,8 @@
|
||||||
{root_path :: string(),
|
{root_path :: string(),
|
||||||
max_inmemory_tablesize :: integer(),
|
max_inmemory_tablesize :: integer(),
|
||||||
start_snapshot = false :: boolean(),
|
start_snapshot = false :: boolean(),
|
||||||
source_penciller :: pid()}).
|
source_penciller :: pid(),
|
||||||
|
levelzero_cointoss = false :: boolean}).
|
||||||
|
|
||||||
-record(iclerk_options,
|
-record(iclerk_options,
|
||||||
{inker :: pid(),
|
{inker :: pid(),
|
||||||
|
|
|
@ -146,7 +146,7 @@
|
||||||
-define(SNAPSHOT_TIMEOUT, 300000).
|
-define(SNAPSHOT_TIMEOUT, 300000).
|
||||||
-define(CHECKJOURNAL_PROB, 0.2).
|
-define(CHECKJOURNAL_PROB, 0.2).
|
||||||
-define(CACHE_SIZE_JITTER, 25).
|
-define(CACHE_SIZE_JITTER, 25).
|
||||||
-define(JOURNAL_SIZE_JITTER, 10).
|
-define(JOURNAL_SIZE_JITTER, 20).
|
||||||
|
|
||||||
-record(state, {inker :: pid(),
|
-record(state, {inker :: pid(),
|
||||||
penciller :: pid(),
|
penciller :: pid(),
|
||||||
|
@ -692,7 +692,8 @@ set_options(Opts) ->
|
||||||
binary_mode=true,
|
binary_mode=true,
|
||||||
sync_strategy=SyncStrat}},
|
sync_strategy=SyncStrat}},
|
||||||
#penciller_options{root_path = LedgerFP,
|
#penciller_options{root_path = LedgerFP,
|
||||||
max_inmemory_tablesize = PCLL0CacheSize}}.
|
max_inmemory_tablesize = PCLL0CacheSize,
|
||||||
|
levelzero_cointoss = true}}.
|
||||||
|
|
||||||
startup(InkerOpts, PencillerOpts) ->
|
startup(InkerOpts, PencillerOpts) ->
|
||||||
{ok, Inker} = leveled_inker:ink_start(InkerOpts),
|
{ok, Inker} = leveled_inker:ink_start(InkerOpts),
|
||||||
|
|
|
@ -198,7 +198,7 @@
|
||||||
-define(MAX_TABLESIZE, 32000).
|
-define(MAX_TABLESIZE, 32000).
|
||||||
-define(PROMPT_WAIT_ONL0, 5).
|
-define(PROMPT_WAIT_ONL0, 5).
|
||||||
-define(WORKQUEUE_BACKLOG_TOLERANCE, 4).
|
-define(WORKQUEUE_BACKLOG_TOLERANCE, 4).
|
||||||
|
-define(COIN_SIDECOUNT, 4).
|
||||||
|
|
||||||
-record(state, {manifest = [] :: list(),
|
-record(state, {manifest = [] :: list(),
|
||||||
manifest_sqn = 0 :: integer(),
|
manifest_sqn = 0 :: integer(),
|
||||||
|
@ -217,6 +217,7 @@
|
||||||
% is an array - but cannot specif due to OTP compatability
|
% is an array - but cannot specif due to OTP compatability
|
||||||
levelzero_size = 0 :: integer(),
|
levelzero_size = 0 :: integer(),
|
||||||
levelzero_maxcachesize :: integer(),
|
levelzero_maxcachesize :: integer(),
|
||||||
|
levelzero_cointoss = false :: boolean(),
|
||||||
|
|
||||||
is_snapshot = false :: boolean(),
|
is_snapshot = false :: boolean(),
|
||||||
snapshot_fully_loaded = false :: boolean(),
|
snapshot_fully_loaded = false :: boolean(),
|
||||||
|
@ -537,10 +538,17 @@ start_from_file(PCLopts) ->
|
||||||
end,
|
end,
|
||||||
|
|
||||||
{ok, MergeClerk} = leveled_pclerk:clerk_new(self()),
|
{ok, MergeClerk} = leveled_pclerk:clerk_new(self()),
|
||||||
|
|
||||||
|
CoinToss = PCLopts#penciller_options.levelzero_cointoss,
|
||||||
|
% Used to randomly defer the writing of L0 file. Intended to help with
|
||||||
|
% vnode syncronisation issues (e.g. stop them all by default merging to
|
||||||
|
% level zero concurrently)
|
||||||
|
|
||||||
InitState = #state{clerk=MergeClerk,
|
InitState = #state{clerk=MergeClerk,
|
||||||
root_path=RootPath,
|
root_path=RootPath,
|
||||||
levelzero_index = leveled_pmem:new_index(),
|
levelzero_index = leveled_pmem:new_index(),
|
||||||
levelzero_maxcachesize=MaxTableSize},
|
levelzero_maxcachesize=MaxTableSize,
|
||||||
|
levelzero_cointoss=CoinToss},
|
||||||
|
|
||||||
%% Open manifest
|
%% Open manifest
|
||||||
ManifestPath = InitState#state.root_path ++ "/" ++ ?MANIFEST_FP ++ "/",
|
ManifestPath = InitState#state.root_path ++ "/" ++ ?MANIFEST_FP ++ "/",
|
||||||
|
@ -629,8 +637,20 @@ update_levelzero(L0Index, L0Size, PushedTree, LedgerSQN, L0Cache, State) ->
|
||||||
ledger_sqn=MaxSQN},
|
ledger_sqn=MaxSQN},
|
||||||
CacheTooBig = NewL0Size > State#state.levelzero_maxcachesize,
|
CacheTooBig = NewL0Size > State#state.levelzero_maxcachesize,
|
||||||
Level0Free = length(get_item(0, State#state.manifest, [])) == 0,
|
Level0Free = length(get_item(0, State#state.manifest, [])) == 0,
|
||||||
case {CacheTooBig, Level0Free} of
|
RandomFactor =
|
||||||
{true, true} ->
|
case State#state.levelzero_cointoss of
|
||||||
|
true ->
|
||||||
|
case random:uniform(?COIN_SIDECOUNT) of
|
||||||
|
1 ->
|
||||||
|
true;
|
||||||
|
_ ->
|
||||||
|
false
|
||||||
|
end;
|
||||||
|
false ->
|
||||||
|
true
|
||||||
|
end,
|
||||||
|
case {CacheTooBig, Level0Free, RandomFactor} of
|
||||||
|
{true, true, true} ->
|
||||||
L0Constructor = roll_memory(UpdState, false),
|
L0Constructor = roll_memory(UpdState, false),
|
||||||
UpdState#state{levelzero_pending=true,
|
UpdState#state{levelzero_pending=true,
|
||||||
levelzero_constructor=L0Constructor};
|
levelzero_constructor=L0Constructor};
|
||||||
|
|
|
@ -192,6 +192,8 @@
|
||||||
-define(DELETE_TIMEOUT, 10000).
|
-define(DELETE_TIMEOUT, 10000).
|
||||||
-define(MAX_KEYS, ?SLOT_COUNT * ?BLOCK_COUNT * ?BLOCK_SIZE).
|
-define(MAX_KEYS, ?SLOT_COUNT * ?BLOCK_COUNT * ?BLOCK_SIZE).
|
||||||
-define(DISCARD_EXT, ".discarded").
|
-define(DISCARD_EXT, ".discarded").
|
||||||
|
-define(WRITE_OPS, [binary, raw, read, write, delayed_write]).
|
||||||
|
-define(READ_OPS, [binary, raw, read]).
|
||||||
|
|
||||||
-record(state, {version = ?CURRENT_VERSION :: tuple(),
|
-record(state, {version = ?CURRENT_VERSION :: tuple(),
|
||||||
slot_index :: list(),
|
slot_index :: list(),
|
||||||
|
@ -469,7 +471,7 @@ generate_filenames(RootFilename) ->
|
||||||
create_file(FileName) when is_list(FileName) ->
|
create_file(FileName) when is_list(FileName) ->
|
||||||
leveled_log:log("SFT01", [FileName]),
|
leveled_log:log("SFT01", [FileName]),
|
||||||
ok = filelib:ensure_dir(FileName),
|
ok = filelib:ensure_dir(FileName),
|
||||||
{ok, Handle} = file:open(FileName, [binary, raw, read, write]),
|
{ok, Handle} = file:open(FileName, ?WRITE_OPS),
|
||||||
Header = create_header(initial),
|
Header = create_header(initial),
|
||||||
{ok, _} = file:position(Handle, bof),
|
{ok, _} = file:position(Handle, bof),
|
||||||
ok = file:write(Handle, Header),
|
ok = file:write(Handle, Header),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue