From f712599f0070b86ab0f4777241d7561c72707f57 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Sun, 10 Jan 2021 00:51:57 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=95=B4?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/utComMisc.hrl | 11 ++++++++++- rebar.config | 4 +++- src/comMisc/utMisc.erl | 36 +++++++++++++++++++++++++++++++++++ src/srvNodeMgr/utVMInfo.erl | 38 +++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 2 deletions(-) diff --git a/include/utComMisc.hrl b/include/utComMisc.hrl index 683c00d..c390a77 100644 --- a/include/utComMisc.hrl +++ b/include/utComMisc.hrl @@ -14,4 +14,13 @@ Fields = record_info(fields, RecordName), [_ | Data] = tuple_to_list(RecordData), {RecordName, lists:zip(Fields, Data)} - end()). \ No newline at end of file + end()). + + +-define(pdMemInfo, '$pdMemInfo'). +%% 运行时内存初始化宏 +-define(MII(), utVMInfo:memInfoInit(?MODULE, ?LINE)). +%% 运行时内存默认打印函数 +-define(MIP(), utVMInfo:memInfoPrint(?MODULE, ?LINE, 100)). +%% 运行时内存带阀值参数打印函数 +-define(MIP(Threshold), utVMInfo:memInfoPrint(?MODULE, ?LINE, Threshold)). \ No newline at end of file diff --git a/rebar.config b/rebar.config index 32b969e..8a4a4a1 100644 --- a/rebar.config +++ b/rebar.config @@ -1,5 +1,7 @@ {erl_opts, [no_debug_info, {i, "include"}]}. -{deps, []}. +{deps, [ + {eSync, ".*", {git, "http://192.168.0.88:53000/SisMaker/eSync.git", {branch, "master"}}} +]}. % {pre_hooks, % [{"", compile, "escript c_src/erlNpc compile"}]}. diff --git a/src/comMisc/utMisc.erl b/src/comMisc/utMisc.erl index 3d7827e..9959326 100644 --- a/src/comMisc/utMisc.erl +++ b/src/comMisc/utMisc.erl @@ -220,6 +220,42 @@ is_in_range(X1, Y1, X2, Y2, Range) -> distance({X1, Y1}, {X2, Y2}) -> round(math:sqrt((X2 - X1) * (X2 - X1) + (Y2 - Y1) * (Y2 - Y1))). +traverseEts(TableName, MatchCnt) -> + ets:safe_fixtable(TableName, true), + try + case ets:match_object(TableName, '$1', MatchCnt) of + '$end_of_table' -> + ok; + {ElemList, NextKey} -> + match_do_fun(ElemList), + continue_next(NextKey) + end + after + ets:safe_fixtable(TableName, false) + end. + +continue_next(NextKey) -> + case ets:match_object(NextKey) of + '$end_of_table' -> + ok1111; + {ElemList, NewNextKey} -> + match_do_fun(ElemList), + continue_next(NewNextKey) + end. + +match_do_fun(ElemList) -> + [io:format("IMY*************one ~p~n", [OneElem]) || OneElem <- ElemList], + ok. + +test() -> + case ets:info(test, id) of + undefined -> + ets:new(test, [named_table, ordered_set, public]); + _ -> + ignore + end, + [ets:insert(test, {{One, aaa}, bbb}) || One <- lists:seq(1, 15)], + traverseEts(test, 6). diff --git a/src/srvNodeMgr/utVMInfo.erl b/src/srvNodeMgr/utVMInfo.erl index 89bd230..4df5cbd 100644 --- a/src/srvNodeMgr/utVMInfo.erl +++ b/src/srvNodeMgr/utVMInfo.erl @@ -1,5 +1,7 @@ -module(utVMInfo). +-include("utComMisc.hrl"). + -export([ vmInfo/0 %% 打印虚拟机简略信息 , processInfo/1 %% 打印进程简略信息 @@ -15,6 +17,10 @@ , scheduler_usage/1 %% 统计下1s每个调度器CPU的实际利用率(因为有spin wait、调度工作, 可能usage 比top显示低很多)\ , scheduler_stat/0 %% 统计下1s内调度进程数量(含义:第一个数字执行进程数量,第二个数字迁移进程数量) , scheduler_stat/1 %% 统计下1s内调度进程数量(含义:第一个数字执行进程数量,第二个数字迁移进程数量) + + , memInfoInit/2 + , memInfoPrint/3 + , test/0 ]). %% 打印虚拟机简略信息 @@ -457,4 +463,36 @@ get_processes() -> io:fwrite("process count:~p~n~p value is large than ~p count:~p~nLists:~p~n", get_process_info_and_large_than_value(memory, 0)). +memInfoInit(CurModule, CurLine) -> + erlang:put(?pdMemInfo, {CurModule, CurLine, erlang:system_time(nanosecond), recon:info(self(), memory_used)}). + +memInfoPrint(CurModule, CurLine, Threshold) -> + case erlang:get(?pdMemInfo) of + undefined -> + erlang:put(?pdMemInfo, {CurModule, CurLine, erlang:system_time(nanosecond), recon:info(self(), memory_used)}); + {OldModule, OldLine, OldTime, OldMemInfo} -> + CurMemInfo = recon:info(self(), memory_used), + CurTime = erlang:system_time(nanosecond), + erlang:put(?pdMemInfo, {CurModule, CurLine, CurTime, recon:info(self(), memory_used)}), + OldUsed = element(2, lists:nth(1, element(2, OldMemInfo))), + CurUsed = element(2, lists:nth(1, element(2, CurMemInfo))), + Sub = CurUsed - OldUsed, + case erlang:abs(Sub) >= Threshold of + true -> + io:format("IMY*********Memory use changes are too large~n~p~n~p~n~p~n~p~n", [{addOrSub, Sub}, {timeDiff, CurTime - OldTime}, {old, OldModule, OldLine, OldTime, OldMemInfo}, {cur, CurModule, CurLine, CurTime, OldMemInfo}]); + _ -> + ignore + end + end. + + +test() -> + ?MII(), + ?MIP(0), + ?MIP(0), + ?MIP(0). + + + +