From 17332b046581758a34742b071b871de165fae0ef Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 14 Nov 2019 10:40:55 +0800 Subject: [PATCH] Improve the emqx_vm module and update test cases --- src/emqx_vm.erl | 216 ++++++++++++++++++++--------------------- test/emqx_vm_SUITE.erl | 104 ++------------------ 2 files changed, 117 insertions(+), 203 deletions(-) diff --git a/src/emqx_vm.erl b/src/emqx_vm.erl index 2fee25633..b59f57b7a 100644 --- a/src/emqx_vm.erl +++ b/src/emqx_vm.erl @@ -19,6 +19,7 @@ -export([ schedulers/0 , scheduler_usage/1 , microsecs/0 + , system_info_keys/0 , get_system_info/0 , get_system_info/1 , get_memory/0 @@ -26,11 +27,12 @@ , loads/0 ]). --export([ get_process_list/0 +-export([ process_info_keys/0 , get_process_info/0 , get_process_info/1 - , get_process_gc/0 - , get_process_gc/1 + , process_gc_info_keys/0 + , get_process_gc_info/0 + , get_process_gc_info/1 , get_process_group_leader_info/1 , get_process_limit/0 ]). @@ -62,86 +64,83 @@ sl_alloc, ll_alloc, fix_alloc, - std_alloc]). + std_alloc + ]). --define(PROCESS_LIST, [initial_call, - reductions, - memory, - message_queue_len, - current_function]). +-define(PROCESS_INFO_KEYS, [initial_call, + current_function, + registered_name, + status, + message_queue_len, + group_leader, + priority, + trap_exit, + reductions, + %%binary, + last_calls, + catchlevel, + trace, + suspending, + sequential_trace_token, + error_handler + ]). --define(PROCESS_INFO, [initial_call, - current_function, - registered_name, - status, - message_queue_len, - group_leader, - priority, - trap_exit, - reductions, - %%binary, - last_calls, - catchlevel, - trace, - suspending, - sequential_trace_token, - error_handler]). +-define(PROCESS_GC_KEYS, [memory, + total_heap_size, + heap_size, + stack_size, + min_heap_size + ]). --define(PROCESS_GC, [memory, - total_heap_size, - heap_size, - stack_size, - min_heap_size]). - %fullsweep_after]). - --define(SYSTEM_INFO, [allocated_areas, - allocator, - alloc_util_allocators, - build_type, - check_io, - compat_rel, - creation, - debug_compiled, - dist, - dist_ctrl, - driver_version, - elib_malloc, - dist_buf_busy_limit, - %fullsweep_after, % included in garbage_collection - garbage_collection, - %global_heaps_size, % deprecated - heap_sizes, - heap_type, - info, - kernel_poll, - loaded, - logical_processors, - logical_processors_available, - logical_processors_online, - machine, - %min_heap_size, % included in garbage_collection - %min_bin_vheap_size, % included in garbage_collection - modified_timing_level, - multi_scheduling, - multi_scheduling_blockers, - otp_release, - port_count, - process_count, - process_limit, - scheduler_bind_type, - scheduler_bindings, - scheduler_id, - schedulers, - schedulers_online, - smp_support, - system_version, - system_architecture, - threads, - thread_pool_size, - trace_control_word, - update_cpu_info, - version, - wordsize]). +-define(SYSTEM_INFO_KEYS, [allocated_areas, + allocator, + alloc_util_allocators, + build_type, + check_io, + compat_rel, + creation, + debug_compiled, + dist, + dist_ctrl, + driver_version, + elib_malloc, + dist_buf_busy_limit, + %fullsweep_after, % included in garbage_collection + garbage_collection, + %global_heaps_size, % deprecated + heap_sizes, + heap_type, + info, + kernel_poll, + loaded, + logical_processors, + logical_processors_available, + logical_processors_online, + machine, + %min_heap_size, % included in garbage_collection + %min_bin_vheap_size, % included in garbage_collection + modified_timing_level, + multi_scheduling, + multi_scheduling_blockers, + otp_release, + port_count, + process_count, + process_limit, + scheduler_bind_type, + scheduler_bindings, + scheduler_id, + schedulers, + schedulers_online, + smp_support, + system_version, + system_architecture, + threads, + thread_pool_size, + trace_control_word, + update_cpu_info, + version, + wordsize + ]). -define(SOCKET_OPTS, [active, broadcast, @@ -166,7 +165,8 @@ send_timeout, send_timeout_close, sndbuf, - tos]). + tos + ]). schedulers() -> erlang:system_info(schedulers). @@ -178,16 +178,16 @@ microsecs() -> loads() -> [{load1, ftos(avg1()/256)}, {load5, ftos(avg5()/256)}, - {load15, ftos(avg15()/256)}]. + {load15, ftos(avg15()/256)} + ]. + +system_info_keys() -> ?SYSTEM_INFO_KEYS. get_system_info() -> - [{Key, format_system_info(Key, get_system_info(Key))} || Key <- ?SYSTEM_INFO]. + [{Key, format_system_info(Key, get_system_info(Key))} || Key <- ?SYSTEM_INFO_KEYS]. get_system_info(Key) -> - try erlang:system_info(Key) catch - error:badarg->undefined - end. -%% conversion functions for erlang:system_info(Key) + try erlang:system_info(Key) catch error:badarg-> undefined end. format_system_info(allocated_areas, List) -> [convert_allocated_areas(Value) || Value <- List]; @@ -221,8 +221,9 @@ convert_allocated_areas({Key, Value}) -> mem_info() -> Dataset = memsup:get_system_memory_data(), - [{total_memory, proplists:get_value(total_memory, Dataset)}, - {used_memory, proplists:get_value(total_memory, Dataset) - proplists:get_value(free_memory, Dataset)}]. + Total = proplists:get_value(total_memory, Dataset), + Free = proplists:get_value(free_memory, Dataset), + [{total_memory, Total}, {used_memory, Total - Free}]. ftos(F) -> S = io_lib:format("~.2f", [F]), S. @@ -300,24 +301,24 @@ container_value(Props, Pos, Type, Container) -> TypeProps = proplists:get_value(Type, Props), element(Pos, lists:keyfind(Container, 1, TypeProps)). -get_process_list()-> - [get_process_list(Pid) || Pid <- processes()]. - -get_process_list(Pid) when is_pid(Pid) -> - [{pid, Pid} | [process_info(Pid, Key) || Key <- ?PROCESS_LIST]]. +process_info_keys() -> + ?PROCESS_INFO_KEYS. get_process_info() -> - [get_process_info(Pid) || Pid <- processes()]. + get_process_info(self()). get_process_info(Pid) when is_pid(Pid) -> - process_info(Pid, ?PROCESS_INFO). + process_info(Pid, ?PROCESS_INFO_KEYS). -get_process_gc() -> - [get_process_gc(Pid) || Pid <- processes()]. -get_process_gc(Pid) when is_pid(Pid) -> - process_info(Pid, ?PROCESS_GC). +process_gc_info_keys() -> + ?PROCESS_GC_KEYS. + +get_process_gc_info() -> + get_process_gc_info(self()). +get_process_gc_info(Pid) when is_pid(Pid) -> + process_info(Pid, ?PROCESS_GC_KEYS). get_process_group_leader_info(LeaderPid) when is_pid(LeaderPid) -> - [{Key, Value}|| {Key, Value} <- process_info(LeaderPid), lists:member(Key, ?PROCESS_INFO)]. + [{Key, Value}|| {Key, Value} <- process_info(LeaderPid), lists:member(Key, ?PROCESS_INFO_KEYS)]. get_process_limit() -> erlang:system_info(process_limit). @@ -446,8 +447,7 @@ ports_type_count(Types) -> mapping(Entries) -> mapping(Entries, []). -mapping([], Acc) -> - Acc; +mapping([], Acc) -> Acc; mapping([{owner, V}|Entries], Acc) when is_pid(V) -> OwnerInfo = process_info(V), Owner = proplists:get_value(registered_name, OwnerInfo, undefined), @@ -470,10 +470,10 @@ cpu_util() -> compat_windows(Fun) -> case os:type() of {win32, nt} -> 0; - _Other -> handle_error(Fun()) + _Type -> + case catch Fun() of + Val when is_number(Val) -> Val; + _Error -> 0 + end end. -handle_error(Value) when is_number(Value) -> - Value; -handle_error({error, _Reason}) -> - 0. diff --git a/test/emqx_vm_SUITE.erl b/test/emqx_vm_SUITE.erl index 1fa1cacbf..6ed6e6522 100644 --- a/test/emqx_vm_SUITE.erl +++ b/test/emqx_vm_SUITE.erl @@ -21,115 +21,29 @@ -include_lib("eunit/include/eunit.hrl"). --define(SYSTEM_INFO, [allocated_areas, - allocator, - alloc_util_allocators, - build_type, - check_io, - compat_rel, - creation, - debug_compiled, - dist, - dist_ctrl, - driver_version, - elib_malloc, - dist_buf_busy_limit, - %fullsweep_after, % included in garbage_collection - garbage_collection, - %global_heaps_size, % deprecated - heap_sizes, - heap_type, - info, - kernel_poll, - loaded, - logical_processors, - logical_processors_available, - logical_processors_online, - machine, - %min_heap_size, % included in garbage_collection - %min_bin_vheap_size, % included in garbage_collection - modified_timing_level, - multi_scheduling, - multi_scheduling_blockers, - otp_release, - port_count, - process_count, - process_limit, - scheduler_bind_type, - scheduler_bindings, - scheduler_id, - schedulers, - schedulers_online, - smp_support, - system_version, - system_architecture, - threads, - thread_pool_size, - trace_control_word, - update_cpu_info, - version, - wordsize]). - --define(PROCESS_INFO, [initial_call, - current_function, - registered_name, - status, - message_queue_len, - group_leader, - priority, - trap_exit, - reductions, - %%binary, - last_calls, - catchlevel, - trace, - suspending, - sequential_trace_token, - error_handler]). - --define(PROCESS_GC, [memory, - total_heap_size, - heap_size, - stack_size, - min_heap_size]). - %fullsweep_after]). - all() -> emqx_ct:all(?MODULE). t_load(_Config) -> - ?assertMatch([{load1, _}, - {load5, _}, - {load15, _} - ], emqx_vm:loads()). + ?assertMatch([{load1, _}, {load5, _}, {load15, _}], emqx_vm:loads()). t_systeminfo(_Config) -> - Keys = [Key || {Key, _} <- emqx_vm:get_system_info()], - ?SYSTEM_INFO = Keys, - ?assertEqual(undefined, emqx_vm:get_system_info(undefined)). + ?assertEqual(emqx_vm:system_info_keys(), + [Key || {Key, _} <- emqx_vm:get_system_info()]), + ?assertEqual(undefined, emqx_vm:get_system_info(undefined)). t_mem_info(_Config) -> application:ensure_all_started(os_mon), MemInfo = emqx_vm:mem_info(), - [{total_memory, _}, - {used_memory, _}]= MemInfo, + [{total_memory, _}, {used_memory, _}]= MemInfo, application:stop(os_mon). -t_process_list(_Config) -> - Pid = self(), - ProcessInfo = emqx_vm:get_process_list(), - true = lists:member({pid, Pid}, lists:concat(ProcessInfo)). - t_process_info(_Config) -> - ProcessInfos = emqx_vm:get_process_info(), - ProcessInfo = lists:last(ProcessInfos), - Keys = [K || {K, _V}<- ProcessInfo], - ?PROCESS_INFO = Keys. + ProcessInfo = emqx_vm:get_process_info(), + ?assertEqual(emqx_vm:process_info_keys(), [K || {K, _V}<- ProcessInfo]). t_process_gc(_Config) -> - ProcessGcs = emqx_vm:get_process_gc(), - ProcessGc = lists:last(ProcessGcs), - Keys = [K || {K, _V}<- ProcessGc], - ?PROCESS_GC = Keys. + GcInfo = emqx_vm:get_process_gc_info(), + ?assertEqual(emqx_vm:process_gc_info_keys(), [K || {K, _V}<- GcInfo]). t_get_ets_list(_Config) -> ets:new(test, [named_table]),