Просмотр исходного кода

perf(broker): speedup trans when broker has a big mqueue

William Yang 4 лет назад
Родитель
Сommit
e122ac5716
3 измененных файлов с 27 добавлено и 28 удалено
  1. 2 2
      etc/emqx.conf
  2. 4 4
      priv/emqx.schema
  3. 21 22
      src/emqx_router.erl

+ 2 - 2
etc/emqx.conf

@@ -2268,8 +2268,8 @@ broker.shared_dispatch_ack_enabled = false
 ## Value: Flag
 broker.route_batch_clean = off
 
-## Performance toggle for subscribe/unsubscribe wildcard topic
-## change this toggle only when there are many wildcard topics.
+## Performance toggle for subscribe/unsubscribe wildcard topic.
+## Change this toggle only when there are many wildcard topics.
 ## Value: Enum
 ##  - key:   mnesia translational updates with per-key locks. recommended for single node setup.
 ##  - tab:   mnesia translational updates with table lock. recommended for multi-nodes setup.

+ 4 - 4
priv/emqx.schema

@@ -2254,16 +2254,16 @@ end}.
   {datatype, flag}
 ]}.
 
-%% @doc performance toggle for subscribe/unsubscribe wildcard topic
-%%      change this toggle only when there are many wildcard topics.
+%% @doc Performance toggle for subscribe/unsubscribe wildcard topic.
+%%      Change this toggle only when there are many wildcard topics.
 %% key:   mnesia translational updates with per-key locks. recommended for single node setup.
 %% tab:   mnesia translational updates with table lock. recommended for multi-nodes setup.
 %% global: global lock protected updates. recommended for larger cluster.
-%% spawn: same as `key', but transaction is done in another proc, ideal for handling bursty traffic.
+%% NOTE: when changing from/to 'global' lock, it requires all nodes in the cluster
 %%
 {mapping, "broker.perf.route_lock_type", "emqx.route_lock_type", [
   {default, key},
-  {datatype, {enum, [key, tab, global, spawn]}}
+  {datatype, {enum, [key, tab, global]}}
 ]}.
 
 %% @doc Enable trie path compaction.

+ 21 - 22
src/emqx_router.erl

@@ -263,32 +263,31 @@ maybe_trans(Fun, Args) ->
             trans(fun() ->
                           emqx_trie:lock_tables(),
                           apply(Fun, Args)
-                  end, []);
-        spawn ->
-            %% trigger selective receive optimization of compiler,
-            %% ideal for handling busty traffic.
-            Ref = erlang:make_ref(),
-            Owner = self(),
-            {WPid, RefMon} = spawn_monitor(fun() ->
-                                                Res = trans(Fun, Args),
-                                                Owner ! {Ref, Res}
-                                        end),
-            receive
-                {Ref, TransRes} ->
-                    receive
-                        {'DOWN', RefMon, process, WPid, normal} -> ok
-                    end,
-                    TransRes;
-                {'DOWN', RefMon, process, WPid, _Info} ->
-                    {error, trans_crash}
-            end
+                  end, [])
     end.
 
 -spec(trans(function(), list(any())) -> ok | {error, term()}).
 trans(Fun, Args) ->
-    case mnesia:transaction(Fun, Args) of
-        {atomic, Ok} -> Ok;
-        {aborted, Reason} -> {error, Reason}
+    %% trigger selective receive optimization of compiler,
+    %% ideal for handling bursty traffic.
+    Ref = erlang:make_ref(),
+    Owner = self(),
+    {WPid, RefMon} = spawn_monitor(
+                       fun() ->
+                               Res = case mnesia:transaction(Fun, Args) of
+                                         {atomic, Ok} -> Ok;
+                                         {aborted, Reason} -> {error, Reason}
+                                     end,
+                               Owner ! {Ref, Res}
+                       end),
+    receive
+        {Ref, TransRes} ->
+            receive
+                {'DOWN', RefMon, process, WPid, normal} -> ok
+            end,
+            TransRes;
+        {'DOWN', RefMon, process, WPid, Info} ->
+            {error, {trans_crash, Info}}
     end.
 
 lock_router() ->