diff options
author | Björn Gustavsson <[email protected]> | 2017-05-30 09:40:43 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2017-06-03 08:45:45 +0200 |
commit | 8f87dd1eaa80bdad501ad6f7767f14b4e0cb01d6 (patch) | |
tree | ce373baef97d4691b50861e9a9e3e413fd5fac1b /erts/emulator/test/process_SUITE.erl | |
parent | b833a06ca54056b883b25664146707afc3a69b5b (diff) | |
download | otp-8f87dd1eaa80bdad501ad6f7767f14b4e0cb01d6.tar.gz otp-8f87dd1eaa80bdad501ad6f7767f14b4e0cb01d6.tar.bz2 otp-8f87dd1eaa80bdad501ad6f7767f14b4e0cb01d6.zip |
Fix process_SUITE:low_prio/1
It is expected that low-priority processes should be allowed
to run about 1/8 of the time of normal-priority processes.
The proportion calculated was usually considerably lower than
1/8. It seems that the main reason is the punishement in
reductions when sending to a process that alreday has many
messages in the message queue. I have verified that by running
the emulator with the +snsp to turn off the send punishment.
To avoid that punishment, let the server process run at high
priority so that it can keep its message queue short.
It seems that the proportion is now very close to 1/8. Therefore,
we can tighten the margins for the proportion.
Diffstat (limited to 'erts/emulator/test/process_SUITE.erl')
-rw-r--r-- | erts/emulator/test/process_SUITE.erl | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/erts/emulator/test/process_SUITE.erl b/erts/emulator/test/process_SUITE.erl index e14185e881..a65c3f0cad 100644 --- a/erts/emulator/test/process_SUITE.erl +++ b/erts/emulator/test/process_SUITE.erl @@ -1024,36 +1024,48 @@ bump_big(Prev, Limit) -> %% Priority 'low' should be mixed with 'normal' using a factor of %% about 8. (OTP-2644) low_prio(Config) when is_list(Config) -> - case erlang:system_info(schedulers_online) of - 1 -> - ok = low_prio_test(Config); - _ -> - erlang:system_flag(multi_scheduling, block_normal), - ok = low_prio_test(Config), - erlang:system_flag(multi_scheduling, unblock_normal), - {comment, - "Test not written for SMP runtime system. " - "Multi scheduling blocked during test."} - end. + erlang:system_flag(multi_scheduling, block_normal), + Prop = low_prio_test(Config), + erlang:system_flag(multi_scheduling, unblock_normal), + Str = lists:flatten(io_lib:format("Low/high proportion is ~.3f", + [Prop])), + {comment,Str}. low_prio_test(Config) when is_list(Config) -> process_flag(trap_exit, true), - S = spawn_link(?MODULE, prio_server, [0, 0]), + + %% Spawn the server running with high priority. The server must + %% not run at normal priority as that would skew the results for + %% two reasons: + %% + %% 1. There would be one more normal-priority processes than + %% low-priority processes. + %% + %% 2. The receive queue would grow faster than the server process + %% could process it. That would in turn trigger the reduction + %% punishment for the clients. + S = spawn_opt(?MODULE, prio_server, [0, 0], [link,{priority,high}]), + + %% Spawn the clients and let them run for a while. PCs = spawn_prio_clients(S, erlang:system_info(schedulers_online)), - ct:sleep({seconds,3}), + ct:sleep({seconds,2}), lists:foreach(fun (P) -> exit(P, kill) end, PCs), + + %% Stop the server and retrieve the result. S ! exit, - receive {'EXIT', S, {A, B}} -> check_prio(A, B) end, - ok. + receive + {'EXIT', S, {A, B}} -> + check_prio(A, B) + end. check_prio(A, B) -> Prop = A/B, ok = io:format("Low=~p, High=~p, Prop=~p\n", [A, B, Prop]), - %% It isn't 1/8, it's more like 0.3, but let's check that - %% the low-prio processes get some little chance to run at all. - true = (Prop < 1.0), - true = (Prop > 1/32). + %% Prop is expected to be appr. 1/8. Allow a reasonable margin. + true = Prop < 1/4, + true = Prop > 1/16, + Prop. prio_server(A, B) -> receive |