From 7c4dbbf42891f0d685b623ff4142131c3584ac0f Mon Sep 17 00:00:00 2001 From: Marek Majkowski Date: Thu, 29 Oct 2009 12:22:58 +0000 Subject: QA: Removed useless comments, added 'no such command' guards. --- src/vm_memory_monitor.erl | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl index 46c36af4..4e33c025 100644 --- a/src/vm_memory_monitor.erl +++ b/src/vm_memory_monitor.erl @@ -198,12 +198,14 @@ get_mem_limit(MemFraction, TotalMemory) -> %% get_total_memory(OS) -> Total %% Windows and Freebsd code based on: memsup:get_memory_usage/1 -%% Original code was part of OTP and released under "Erlang Public -%% License". +%% Original code was part of OTP and released under "Erlang Public License". -%% Darwin: Uses vm_stat command. get_total_memory({unix,darwin}) -> File = os:cmd("/usr/bin/vm_stat"), + case string:str(File, " not found\n") of + 0 -> ok; + _ -> throw({command_not_found, "/usr/bin/vm_stat"}) + end, Lines = string:tokens(File, "\n"), Dict = dict:from_list(lists:map(fun parse_line_mach/1, Lines)), [PageSize, Inactive, Active, Free, Wired] = @@ -212,15 +214,11 @@ get_total_memory({unix,darwin}) -> 'Pages wired down']], PageSize * (Inactive + Active + Free + Wired); -%% FreeBSD: Look in /usr/include/sys/vmmeter.h for the format of -%% struct vmmeter get_total_memory({unix,freebsd}) -> PageSize = freebsd_sysctl("vm.stats.vm.v_page_size"), PageCount = freebsd_sysctl("vm.stats.vm.v_page_count"), PageCount * PageSize; -%% Win32: Find out how much memory is in use by asking the -%% os_mon_sysinfo process. get_total_memory({win32,_OSname}) -> [Result|_] = os_mon_sysinfo:get_mem_info(), {ok, [_MemLoad, TotPhys, _AvailPhys, @@ -228,7 +226,6 @@ get_total_memory({win32,_OSname}) -> io_lib:fread("~d~d~d~d~d~d~d", Result), TotPhys; -%% Linux: Look in /proc/meminfo get_total_memory({unix, linux}) -> File = read_proc_file("/proc/meminfo"), Lines = string:tokens(File, "\n"), @@ -237,6 +234,10 @@ get_total_memory({unix, linux}) -> get_total_memory({unix, sunos}) -> File = os:cmd("/usr/sbin/prtconf"), + case string:str(File, "No such file or directory\n") of + 0 -> ok; + _ -> throw({command_not_found, "/usr/sbin/prtconf"}) + end, Lines = string:tokens(File, "\n"), Dict = dict:from_list(lists:map(fun parse_line_sunos/1, Lines)), dict:fetch('Memory size', Dict); @@ -287,7 +288,12 @@ parse_line_sunos(Line) -> end. freebsd_sysctl(Def) -> - list_to_integer(os:cmd("/sbin/sysctl -n " ++ Def) -- "\n"). + Result = os:cmd("/sbin/sysctl -n " ++ Def), + case string:str(Result, " not found\n") of + 0 -> ok; + _ -> throw({command_not_found, "/sbin/sysctl"}) + end, + list_to_integer(Result -- "\n"). %% file:read_file does not work on files in /proc as it seems to get %% the size of the file first and then read that many bytes. But files -- cgit v1.2.1 From 89f5ec33cac5bcea68f87db108da1213ad6c819d Mon Sep 17 00:00:00 2001 From: Marek Majkowski Date: Thu, 29 Oct 2009 13:06:02 +0000 Subject: QA: yes, that's better error handling... --- src/vm_memory_monitor.erl | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl index 4e33c025..9acf1354 100644 --- a/src/vm_memory_monitor.erl +++ b/src/vm_memory_monitor.erl @@ -195,17 +195,20 @@ get_mem_limit(MemFraction, TotalMemory) -> %%---------------------------------------------------------------------------- %% Internal Helpers %%---------------------------------------------------------------------------- +cmd(Command) -> + [Exec| _Rest] = string:tokens(Command, " "), + case os:find_executable(Exec) of + false -> throw({command_not_found, Exec}); + _ -> ok + end, + os:cmd(Command). %% get_total_memory(OS) -> Total %% Windows and Freebsd code based on: memsup:get_memory_usage/1 %% Original code was part of OTP and released under "Erlang Public License". get_total_memory({unix,darwin}) -> - File = os:cmd("/usr/bin/vm_stat"), - case string:str(File, " not found\n") of - 0 -> ok; - _ -> throw({command_not_found, "/usr/bin/vm_stat"}) - end, + File = cmd("/usr/bin/vm_stat"), Lines = string:tokens(File, "\n"), Dict = dict:from_list(lists:map(fun parse_line_mach/1, Lines)), [PageSize, Inactive, Active, Free, Wired] = @@ -233,11 +236,7 @@ get_total_memory({unix, linux}) -> dict:fetch('MemTotal', Dict); get_total_memory({unix, sunos}) -> - File = os:cmd("/usr/sbin/prtconf"), - case string:str(File, "No such file or directory\n") of - 0 -> ok; - _ -> throw({command_not_found, "/usr/sbin/prtconf"}) - end, + File = cmd("/usr/sbin/prtconf"), Lines = string:tokens(File, "\n"), Dict = dict:from_list(lists:map(fun parse_line_sunos/1, Lines)), dict:fetch('Memory size', Dict); @@ -288,12 +287,7 @@ parse_line_sunos(Line) -> end. freebsd_sysctl(Def) -> - Result = os:cmd("/sbin/sysctl -n " ++ Def), - case string:str(Result, " not found\n") of - 0 -> ok; - _ -> throw({command_not_found, "/sbin/sysctl"}) - end, - list_to_integer(Result -- "\n"). + list_to_integer(cmd("/sbin/sysctl -n " ++ Def) -- "\n"). %% file:read_file does not work on files in /proc as it seems to get %% the size of the file first and then read that many bytes. But files -- cgit v1.2.1 From 65ae3759422e4455ac4d3bcb60d1fa4c2814145b Mon Sep 17 00:00:00 2001 From: Marek Majkowski Date: Thu, 29 Oct 2009 14:17:29 +0000 Subject: QA: specs --- src/vm_memory_monitor.erl | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl index 9acf1354..82bccc38 100644 --- a/src/vm_memory_monitor.erl +++ b/src/vm_memory_monitor.erl @@ -69,6 +69,21 @@ alarmed }). +%%---------------------------------------------------------------------------- + +-ifdef(use_specs). + +-spec(start_link/1 :: (_) -> 'ignore' | {error,_} | {ok,pid()}). +-spec(update/0 :: () -> ok). +-spec(get_total_memory/0 :: () -> non_neg_integer() | unknown). +-spec(get_check_interval/0 :: () -> non_neg_integer() ). +-spec(set_check_interval/1 :: (non_neg_integer()) -> ok ). +-spec(get_vm_memory_high_watermark/0 :: () -> float() ). +-spec(set_vm_memory_high_watermark/1 :: (float()) -> ok ). + +-endif. + + %%---------------------------------------------------------------------------- %% gen_server callbacks %%---------------------------------------------------------------------------- -- cgit v1.2.1 From f25509f3cdca230dfd89358a6e2b88175f8cf2b6 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Thu, 29 Oct 2009 16:48:59 +0000 Subject: Minor improvements to spec and some cosmetics --- src/vm_memory_monitor.erl | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl index 82bccc38..d0aa1b7d 100644 --- a/src/vm_memory_monitor.erl +++ b/src/vm_memory_monitor.erl @@ -73,13 +73,13 @@ -ifdef(use_specs). --spec(start_link/1 :: (_) -> 'ignore' | {error,_} | {ok,pid()}). --spec(update/0 :: () -> ok). --spec(get_total_memory/0 :: () -> non_neg_integer() | unknown). --spec(get_check_interval/0 :: () -> non_neg_integer() ). --spec(set_check_interval/1 :: (non_neg_integer()) -> ok ). --spec(get_vm_memory_high_watermark/0 :: () -> float() ). --spec(set_vm_memory_high_watermark/1 :: (float()) -> ok ). +-spec(start_link/1 :: (float()) -> ('ignore' | {error, any()} | {'ok', pid()})). +-spec(update/0 :: () -> 'ok'). +-spec(get_total_memory/0 :: () -> (non_neg_integer() | unknown)). +-spec(get_check_interval/0 :: () -> non_neg_integer()). +-spec(set_check_interval/1 :: (non_neg_integer()) -> 'ok'). +-spec(get_vm_memory_high_watermark/0 :: () -> float()). +-spec(set_vm_memory_high_watermark/1 :: (float()) -> 'ok'). -endif. @@ -211,12 +211,11 @@ get_mem_limit(MemFraction, TotalMemory) -> %% Internal Helpers %%---------------------------------------------------------------------------- cmd(Command) -> - [Exec| _Rest] = string:tokens(Command, " "), + Exec = hd(string:tokens(Command, " ")), case os:find_executable(Exec) of false -> throw({command_not_found, Exec}); - _ -> ok - end, - os:cmd(Command). + _ -> os:cmd(Command) + end. %% get_total_memory(OS) -> Total %% Windows and Freebsd code based on: memsup:get_memory_usage/1 -- cgit v1.2.1 From 3b7176156fd02edc7f6296e876e908e922aeea22 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Thu, 29 Oct 2009 17:39:56 +0000 Subject: set limits for 32bit to 4GB and 64bit to 256TB. Set default vm_memory_high_watermark to 0.4, and adjust display of memory size in undetected OS case --- scripts/rabbitmq-server | 2 +- scripts/rabbitmq-server.bat | 2 +- scripts/rabbitmq-service.bat | 2 +- src/vm_memory_monitor.erl | 11 ++++++----- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/scripts/rabbitmq-server b/scripts/rabbitmq-server index 08ceb27d..34904850 100755 --- a/scripts/rabbitmq-server +++ b/scripts/rabbitmq-server @@ -109,7 +109,7 @@ exec erl \ -os_mon start_cpu_sup true \ -os_mon start_disksup false \ -os_mon start_memsup false \ - -os_mon vm_memory_high_watermark 0.7 \ + -os_mon vm_memory_high_watermark 0.4 \ -mnesia dir "\"${RABBITMQ_MNESIA_DIR}\"" \ ${RABBITMQ_CLUSTER_CONFIG_OPTION} \ ${RABBITMQ_SERVER_START_ARGS} \ diff --git a/scripts/rabbitmq-server.bat b/scripts/rabbitmq-server.bat index 7cd3a33f..cf94d61c 100755 --- a/scripts/rabbitmq-server.bat +++ b/scripts/rabbitmq-server.bat @@ -138,7 +138,7 @@ if exist "%RABBITMQ_CONFIG_FILE%.config" ( -os_mon start_cpu_sup true ^ -os_mon start_disksup false ^ -os_mon start_memsup false ^ --os_mon vm_memory_high_watermark 0.7 ^ +-os_mon vm_memory_high_watermark 0.4 ^ -mnesia dir \""%RABBITMQ_MNESIA_DIR%"\" ^ %CLUSTER_CONFIG% ^ %RABBITMQ_SERVER_START_ARGS% ^ diff --git a/scripts/rabbitmq-service.bat b/scripts/rabbitmq-service.bat index f882da8a..6f9e525d 100755 --- a/scripts/rabbitmq-service.bat +++ b/scripts/rabbitmq-service.bat @@ -173,7 +173,7 @@ set ERLANG_SERVICE_ARGUMENTS= ^ -os_mon start_cpu_sup true ^ -os_mon start_disksup false ^ -os_mon start_memsup false ^ --os_mon vm_memory_high_watermark 0.7 ^ +-os_mon vm_memory_high_watermark 0.4 ^ -mnesia dir \""%RABBITMQ_MNESIA_DIR%"\" ^ %CLUSTER_CONFIG% ^ %RABBITMQ_SERVER_START_ARGS% ^ diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl index d0aa1b7d..6da47933 100644 --- a/src/vm_memory_monitor.erl +++ b/src/vm_memory_monitor.erl @@ -95,9 +95,10 @@ init([MemFraction]) -> TotalMemory = case get_total_memory() of unknown -> - rabbit_log:warning("Unknown total memory size for your OS ~p. " - "Assuming memory size is ~p bytes.~n", - [os:type(), ?MEMORY_SIZE_FOR_UNKNOWN_OS]), + rabbit_log:warning( + "Unknown total memory size for your OS ~p. " + "Assuming memory size is ~pMB.~n", + [os:type(), trunc(?MEMORY_SIZE_FOR_UNKNOWN_OS/1048576)]), ?MEMORY_SIZE_FOR_UNKNOWN_OS; M -> M end, @@ -199,8 +200,8 @@ start_timer(Timeout) -> %% in big trouble anyway. get_vm_limit() -> case erlang:system_info(wordsize) of - 4 -> 2147483648; %% 2 GB for 32 bits 2^31 - 8 -> 140737488355328 %% 128 TB for 64 bits 2^47 + 4 -> 4294967296; %% 4 GB for 32 bits 2^32 + 8 -> 281474976710656 %% 256 TB for 64 bits 2^48 %% http://en.wikipedia.org/wiki/X86-64#Virtual_address_space_details end. -- cgit v1.2.1