<div dir="ltr"><div><p class="MsoNormal"><span lang="EN-US">Hi,</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">I really appreciate the the ecio feature on
OTP 17.4(for lower latency and smoother management</span></p>

<p class="MsoNormal"><span lang="EN-US">of IO), I run the test for two scenes, one
for short tcp connection, one for keepalive tcp connection.</span></p>

<p class="MsoNormal"><span lang="EN-US">In order to measure effects of ecio, I make
a wrapper for prepare_for_sys_schedule:</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">static ERTS_INLINE <b>int</b></span></p>

<p class="MsoNormal"><span lang="EN-US">prepare_for_sys_schedule_wrapper(ErtsSchedulerData
*esdp, <b>int</b> non_blocking)</span></p>

<p class="MsoNormal"><span lang="EN-US">{</span></p>

<p class="MsoNormal"><span lang="EN-US">       
<b>int</b> r = prepare_for_sys_schedule(esdp, non_blocking);</span></p>

<p class="MsoNormal"><span lang="EN-US">       
<b>int</b> <b>index</b> = non_blocking + erts_eager_check_io*2;</span></p>

<p class="MsoNormal"><span lang="EN-US">       
<b>if</b> (r) {</span></p>

<p class="MsoNormal"><span lang="EN-US">               
erts_no_atomic32_inc(&(schedule_statistics[<b>index</b>]));</span></p>

<p class="MsoNormal" style="margin-left:21pt;text-indent:21pt"><span lang="EN-US">}</span></p>

<p class="MsoNormal"><span lang="EN-US">       
erts_no_atomic32_inc(&(schedule_statistics[4]));</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">       
<b>if</b> (schedule_statistics[4] % 10000 == 0) {</span></p>

<p class="MsoNormal"><span lang="EN-US">                erts_print(ERTS_PRINT_STDOUT,
NULL, "counts:%d %d %d %d %d\n", schedule_statistics[4],
schedule_statistics</span></p>

<p class="MsoNormal"><span lang="EN-US">[0], schedule_statistics[1],
schedule_statistics[2], schedule_statistics[3]);</span></p>

<p class="MsoNormal"><span lang="EN-US">       
}</span></p>

<p class="MsoNormal"><span lang="EN-US">       
<b>return</b> r;</span></p>

<p class="MsoNormal"><span lang="EN-US">}</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">ERTS_CIO_EXPORT(erts_check_io)(<b>int</b>
do_wait)</span></p>

<p class="MsoNormal"><span lang="EN-US">{</span></p>

<p class="MsoNormal"><span lang="EN-US">   
erts_no_atomic32_inc(&(check_count[do_wait]));</span></p>

<p class="MsoNormal"><span lang="EN-US">   
erts_no_atomic32_inc(&(check_count[3]));</span></p>

<p class="MsoNormal"><span lang="EN-US">    <b>if</b>
(check_count[3] % 10000 == 0) {</span></p>

<p class="MsoNormal"><span lang="EN-US">       
erts_print(ERTS_PRINT_STDOUT, NULL, "check:%d %d %d\n",
check_count[3], check_count[0], check_count[1]);</span></p>

<p class="MsoNormal"><span lang="EN-US">    }</span></p>

<p class="MsoNormal"><span lang="EN-US">}</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">Test A:</span></p>

<p class="MsoNormal"><span lang="EN-US">Test for http (short tcp connection), a
http server runs on erl, a client makes stress test with apache ab cmd: ./ab -c
60 -n 100000 <a href="http://10.10.10.10:8888/">http://10.10.10.10:8888/</a>  </span></p>

<p class="MsoNormal"><span lang="EN-US">Test A1:</span></p>

<p class="MsoNormal"><span lang="EN-US">./bin/erl +K true +h 99999  +P 99999 -secio true -smp enable -s ehttpd</span></p>

<p class="MsoNormal"><span lang="EN-US">Result:</span></p>

<p class="MsoNormal"><span lang="EN-US">counts:30700000 0 0 1465043 2728782</span></p>

<p class="MsoNormal"><span lang="EN-US">check:17860000 14405477 3454523</span></p>

<p class="MsoNormal"><span lang="EN-US">prepare_for_sys_schedule=1 ratio (1465043 +
2728782)/30700000 = 13.6%</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">Compared with</span></p>

<p class="MsoNormal"><span lang="EN-US">Test A2:</span></p>

<p class="MsoNormal"><span lang="EN-US">./bin/erl +K true +h 99999  +P 99999 -secio false -smp enable -s ehttpd</span></p>

<p class="MsoNormal"><span lang="EN-US">counts:36110000 1433811 919525 0 0</span></p>

<p class="MsoNormal"><span lang="EN-US">check:16070000 12576257 3493743</span></p>

<p class="MsoNormal"><span lang="EN-US">prepare_for_sys_schedule=1 ratio (1433811 +
919525)/36110000 = 6.5%</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">Check_io_count ratio: A1 check_io / A2
check_io = 17860000/16070000  = 1.11</span></p>

<p class="MsoNormal"><span lang="EN-US">Time Cost: same (diff < 0.5%)</span></p>

<p class="MsoNormal"><span lang="EN-US">QPS: same (diff < 0.5%)</span></p>

<p class="MsoNormal"><span lang="EN-US">CPU: A1 62% per CPU, A2 64% per CPU</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">Test B:</span></p>

<p class="MsoNormal"><span lang="EN-US">Test for tcp keepalive connection, a proxy
server runs on erl, a client make stress test with mysql request.</span></p>

<p class="MsoNormal"><span lang="EN-US">Test B1:</span></p>

<p class="MsoNormal"><span lang="EN-US">beam.smp -secio true -sbt db -sbwt
very_short -swt low -sfwi 500 -MBmmsbc 100 -MHmmsbc 100 -MBmmmbc 100 -MHmmmbc
100 -MMscs 1024 -MBsmbcs 10240 -MHsbct 2048 -hmbs 46422 -hms 2586 -zdbbl 8192
-W w -P 1000000 -A 16 -K true -d -e 50000 -Q 1000000 -sct
L0T0C0P0N0:L1T1C1P0N0:L2T2C2P0N0:L3T3C3P0N0:L4T4C4P0N0:L5T5C5P0N0:L6T6C0P1N1:L7T7C1P1N1:L8T8C2P1N1:L9T9C3P1N1:L10T10C4P1N1:L11T11C5P1N1:L12T12C0P0N0:L13T13C1P0N0:L14T14C2P0N0:L15T15C3P0N0:L16T16C4P0N0:L17T17C5P0N0:L18T18C0P1N1:L19T19C1P1N1:L20T20C2P1N1:L21T21C3P1N1:L22T22C4P1N1:L23T23C5P1N1
-swct medium -- -root /path/ -progname ** -- -home /path -- -boot /path -mode
interactive -config /path -shutdown_time 30000 -setcookie *** -name
<a href="mailto:name@10.10.10.10">name@10.10.10.10</a> – console</span></p>

<p class="MsoNormal"><span lang="EN-US">Result:</span></p>

<p class="MsoNormal"><b><span lang="EN-US">counts</span></b><span lang="EN-US">:72090000
0 0 13711145 1499024</span></p>

<p class="MsoNormal"><b><span lang="EN-US">check</span></b><span lang="EN-US">:16230000
15777657 452343</span></p>

<p class="MsoNormal"><span lang="EN-US">prepare_for_sys_schedule=1 ratio = 21</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">Test B2:</span></p>

<p class="MsoNormal"><span lang="EN-US">beam.smp -secio false -sbt db -sbwt
very_short -swt low -sfwi 500 -MBmmsbc 100 -MHmmsbc 100 -MBmmmbc 100 -MHmmmbc
100 -MMscs 1024 -MBsmbcs 10240 -MHsbct 2048 -hmbs 46422 -hms 2586 -zdbbl 8192
-W w -P 1000000 -A 16 -K true -d -e 50000 -Q 1000000 -sct L0T0C0P0N0:L1T1C1P0N0:L2T2C2P0N0:L3T3C3P0N0:L4T4C4P0N0:L5T5C5P0N0:L6T6C0P1N1:L7T7C1P1N1:L8T8C2P1N1:L9T9C3P1N1:L10T10C4P1N1:L11T11C5P1N1:L12T12C0P0N0:L13T13C1P0N0:L14T14C2P0N0:L15T15C3P0N0:L16T16C4P0N0:L17T17C5P0N0:L18T18C0P1N1:L19T19C1P1N1:L20T20C2P1N1:L21T21C3P1N1:L22T22C4P1N1:L23T23C5P1N1
-swct medium -- -root /path/ -progname ** -- -home /path -- -boot /path -mode
interactive -config /path -shutdown_time 30000 -setcookie *** -name
<a href="mailto:name@10.10.10.10">name@10.10.10.10</a> – console</span></p>

<p class="MsoNormal"><span lang="EN-US">Result:</span></p>

<p class="MsoNormal"><b><span lang="EN-US">counts</span></b><span lang="EN-US">:72170000
13840081 1023183 0 0 </span></p>

<p class="MsoNormal"><b><span lang="EN-US">check</span></b><span lang="EN-US">:15630000
15303454 326546</span></p>

<p class="MsoNormal"><span lang="EN-US">prepare_for_sys_schedule=1 ratio = 20.5%</span></p>

<p class="MsoNormal"><span lang="EN-US">Time Cost: B1 with 18 min 17 seconds, B2
with 18 min 12 seconds</span></p>

<p class="MsoNormal"><span lang="EN-US">CPU: B1 with around 1000%, B2 with around
1000%</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">I test scene B for several times, the result
is nearly the same, then I review the code and debug the key path for ecio:</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><b><span lang="EN-US">else</span></b><span lang="EN-US"> <b>if</b>
(!ERTS_SCHEDULER_IS_DIRTY(esdp) &&</span></p>

<p class="MsoNormal"><span lang="EN-US">                 (fcalls > input_reductions
&&</span></p>

<p class="MsoNormal"><span lang="EN-US">                  prepare_<b>for</b>_sys_schedule(esdp,
!0))) {</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">I find when io task is heavy(in Test B), we
barely get here, so there is nearly no effect with +secio true.  In test A, +secio has a little effect.</span></p>

<p class="MsoNormal"><span lang="EN-US">I presume that +scio true only works with
High CPU & Low IO scene, so we can prevent the port task from IO starvation.
Is that true? And how do you test ecio?</span></p>

<p class="MsoNormal"><span lang="EN-US"> </span></p>

<p class="MsoNormal"><span lang="EN-US">Best Regards,</span></p>

<p class="MsoNormal"><span lang="EN-US">Songlu Cai</span></p></div><div><br></div></div>