diff options
| author | Matthew Sackman <matthew@lshift.net> | 2009-08-19 12:15:49 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2009-08-19 12:15:49 +0100 |
| commit | 9d440e33f9c96964882b8edc0680c7ce0191d6fc (patch) | |
| tree | 8491f696c690b6d48ba1b0d7f91f0b5102352b8e | |
| parent | 9966edcaf16691ebf7b22b0e39f11bfa186cd676 (diff) | |
| parent | 0e42a1034669fb112f66d4e2a8d6198f39b3a100 (diff) | |
| download | rabbitmq-server-git-9d440e33f9c96964882b8edc0680c7ce0191d6fc.tar.gz | |
merging in bug20013
| -rw-r--r-- | src/rabbit_memsup.erl | 30 | ||||
| -rw-r--r-- | src/rabbit_memsup_darwin.erl | 36 | ||||
| -rw-r--r-- | src/rabbit_memsup_linux.erl | 36 |
3 files changed, 45 insertions, 57 deletions
diff --git a/src/rabbit_memsup.erl b/src/rabbit_memsup.erl index 5f24288170..b0d57cb27e 100644 --- a/src/rabbit_memsup.erl +++ b/src/rabbit_memsup.erl @@ -44,7 +44,8 @@ timeout, timer, mod, - mod_state + mod_state, + alarmed }). -define(SERVER, memsup). %% must be the same as the standard memsup @@ -78,8 +79,9 @@ init([Mod]) -> timeout = ?DEFAULT_MEMORY_CHECK_INTERVAL, timer = TRef, mod = Mod, - mod_state = Mod:update(Fraction, InitState) }, - {ok, State}. + mod_state = InitState, + alarmed = false }, + {ok, internal_update(State)}. start_timer(Timeout) -> {ok, TRef} = timer:apply_interval(Timeout, ?MODULE, update, []), @@ -108,10 +110,8 @@ handle_call(get_memory_data, _From, handle_call(_Request, _From, State) -> {noreply, State}. -handle_cast(update, State = #state { memory_fraction = MemoryFraction, - mod = Mod, mod_state = ModState }) -> - ModState1 = Mod:update(MemoryFraction, ModState), - {noreply, State #state { mod_state = ModState1 }}; +handle_cast(update, State) -> + {noreply, internal_update(State)}; handle_cast(_Request, State) -> {noreply, State}. @@ -124,3 +124,19 @@ terminate(_Reason, _State) -> code_change(_OldVsn, State, _Extra) -> {ok, State}. + +internal_update(State = #state { memory_fraction = MemoryFraction, + alarmed = Alarmed, + mod = Mod, mod_state = ModState }) -> + ModState1 = Mod:update(ModState), + {MemTotal, MemUsed, _BigProc} = Mod:get_memory_data(ModState1), + NewAlarmed = MemUsed / MemTotal > MemoryFraction, + case {Alarmed, NewAlarmed} of + {false, true} -> + alarm_handler:set_alarm({system_memory_high_watermark, []}); + {true, false} -> + alarm_handler:clear_alarm(system_memory_high_watermark); + _ -> + ok + end, + State #state { mod_state = ModState1, alarmed = NewAlarmed }. diff --git a/src/rabbit_memsup_darwin.erl b/src/rabbit_memsup_darwin.erl index 990c5b9966..3de2d8430e 100644 --- a/src/rabbit_memsup_darwin.erl +++ b/src/rabbit_memsup_darwin.erl @@ -31,23 +31,21 @@ -module(rabbit_memsup_darwin). --export([init/0, update/2, get_memory_data/1]). +-export([init/0, update/1, get_memory_data/1]). --record(state, {alarmed, - total_memory, +-record(state, {total_memory, allocated_memory}). %%---------------------------------------------------------------------------- -ifdef(use_specs). --type(state() :: #state { alarmed :: boolean(), - total_memory :: ('undefined' | non_neg_integer()), +-type(state() :: #state { total_memory :: ('undefined' | non_neg_integer()), allocated_memory :: ('undefined' | non_neg_integer()) }). -spec(init/0 :: () -> state()). --spec(update/2 :: (float(), state()) -> state()). +-spec(update/1 :: (state()) -> state()). -spec(get_memory_data/1 :: (state()) -> {non_neg_integer(), non_neg_integer(), ('undefined' | pid())}). @@ -56,32 +54,20 @@ %%---------------------------------------------------------------------------- init() -> - #state{alarmed = false, - total_memory = undefined, + #state{total_memory = undefined, allocated_memory = undefined}. -update(MemoryFraction, State = #state{ alarmed = Alarmed }) -> +update(State) -> File = os:cmd("/usr/bin/vm_stat"), Lines = string:tokens(File, "\n"), Dict = dict:from_list(lists:map(fun parse_line/1, Lines)), - PageSize = dict:fetch(page_size, Dict), - Inactive = dict:fetch('Pages inactive', Dict), - Active = dict:fetch('Pages active', Dict), - Free = dict:fetch('Pages free', Dict), - Wired = dict:fetch('Pages wired down', Dict), + [PageSize, Inactive, Active, Free, Wired] = + [dict:fetch(Key, Dict) || + Key <- [page_size, 'Pages inactive', 'Pages active', 'Pages free', + 'Pages wired down']], MemTotal = PageSize * (Inactive + Active + Free + Wired), MemUsed = PageSize * (Active + Wired), - NewAlarmed = MemUsed / MemTotal > MemoryFraction, - case {Alarmed, NewAlarmed} of - {false, true} -> - alarm_handler:set_alarm({system_memory_high_watermark, []}); - {true, false} -> - alarm_handler:clear_alarm(system_memory_high_watermark); - _ -> - ok - end, - State#state{alarmed = NewAlarmed, - total_memory = MemTotal, allocated_memory = MemUsed}. + State#state{total_memory = MemTotal, allocated_memory = MemUsed}. get_memory_data(State) -> {State#state.total_memory, State#state.allocated_memory, undefined}. diff --git a/src/rabbit_memsup_linux.erl b/src/rabbit_memsup_linux.erl index 460fd88f87..ca942d7caa 100644 --- a/src/rabbit_memsup_linux.erl +++ b/src/rabbit_memsup_linux.erl @@ -31,23 +31,21 @@ -module(rabbit_memsup_linux). --export([init/0, update/2, get_memory_data/1]). +-export([init/0, update/1, get_memory_data/1]). --record(state, {alarmed, - total_memory, +-record(state, {total_memory, allocated_memory}). %%---------------------------------------------------------------------------- -ifdef(use_specs). --type(state() :: #state { alarmed :: boolean(), - total_memory :: ('undefined' | non_neg_integer()), +-type(state() :: #state { total_memory :: ('undefined' | non_neg_integer()), allocated_memory :: ('undefined' | non_neg_integer()) }). -spec(init/0 :: () -> state()). --spec(update/2 :: (float(), state()) -> state()). +-spec(update/1 :: (state()) -> state()). -spec(get_memory_data/1 :: (state()) -> {non_neg_integer(), non_neg_integer(), ('undefined' | pid())}). @@ -56,30 +54,18 @@ %%---------------------------------------------------------------------------- init() -> - #state{alarmed = false, - total_memory = undefined, + #state{total_memory = undefined, allocated_memory = undefined}. -update(MemoryFraction, State = #state { alarmed = Alarmed }) -> +update(State) -> File = read_proc_file("/proc/meminfo"), Lines = string:tokens(File, "\n"), Dict = dict:from_list(lists:map(fun parse_line/1, Lines)), - MemTotal = dict:fetch('MemTotal', Dict), - MemUsed = MemTotal - - dict:fetch('MemFree', Dict) - - dict:fetch('Buffers', Dict) - - dict:fetch('Cached', Dict), - NewAlarmed = MemUsed / MemTotal > MemoryFraction, - case {Alarmed, NewAlarmed} of - {false, true} -> - alarm_handler:set_alarm({system_memory_high_watermark, []}); - {true, false} -> - alarm_handler:clear_alarm(system_memory_high_watermark); - _ -> - ok - end, - State#state{alarmed = NewAlarmed, - total_memory = MemTotal, allocated_memory = MemUsed}. + [MemTotal, MemFree, Buffers, Cached] = + [dict:fetch(Key, Dict) || + Key <- ['MemTotal', 'MemFree', 'Buffers', 'Cached']], + MemUsed = MemTotal - MemFree - Buffers - Cached, + State#state{total_memory = MemTotal, allocated_memory = MemUsed}. get_memory_data(State) -> {State#state.total_memory, State#state.allocated_memory, undefined}. |
