<div dir="ltr">I've rewritten my SCGI server to work with TPL directly instead of using async/await to make it run on mono 2.10. Then I've tried to run it with mono 2.10.8.1 and mono 3.2 with System.Net.Sockets backend and to hammer it with jmeter. 500K requests without any lockups on Mono 2.10, lockup at 22164th request on mono 3.2. <div>
<br></div><div>Server source code is still on GitHub - <a href="https://github.com/kekekeks/scgi-sharp">https://github.com/kekekeks/scgi-sharp</a></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/8/7 Greg Young <span dir="ltr"><<a href="mailto:gregoryyoung1@gmail.com" target="_blank">gregoryyoung1@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I believe attaching a debugger changes things like optimizations from occurring (not positive but it does in clr)<div class="HOEnZb">
<div class="h5"><span></span><br><br>On Wednesday, August 7, 2013, Nikita Tsukanov  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Huh, it doesn't require debugger to be _attched_, just debugging subsystem initialized i. e. if I launch this program as a "debugger" it doesn't lock up.<div><br><div><font face="Consolas"><span style="color:rgb(0,150,149)">public</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(0,150,149)">static</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(0,150,149)">void</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">Main</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">(</span><span style="color:rgb(0,150,149)">string</span><span style="color:rgb(68,68,68)">[]</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">args</span><span style="color:rgb(68,68,68)">)</span><br>



<span style="color:rgb(68,68,68)">{</span><br><span style="color:rgb(68,68,68)">  </span><span style="color:rgb(0,150,149)">int</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">port</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">=</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(245,125,0)">27042</span><span style="color:rgb(68,68,68)">;</span><br>



<span style="color:rgb(68,68,68)">  </span><span style="color:rgb(0,150,149)">if</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">(</span><span style="color:rgb(68,68,68)">args</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(68,68,68)">Length</span><span style="color:rgb(68,68,68)"> !</span><span style="color:rgb(68,68,68)">=</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(245,125,0)">0</span><span style="color:rgb(68,68,68)">)</span><br>




<span style="color:rgb(68,68,68)">    </span><span style="color:rgb(68,68,68)">port</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">=</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(0,150,149)">int</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(68,68,68)">Parse</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">(</span><span style="color:rgb(68,68,68)">args</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">[</span><span style="color:rgb(245,125,0)">0</span><span style="color:rgb(68,68,68)">])</span><span style="color:rgb(68,68,68)">;</span><br>




<span style="color:rgb(68,68,68)">  </span><span style="color:rgb(0,150,149)">while</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">(</span><span style="color:rgb(0,150,149)">true</span><span style="color:rgb(68,68,68)">)</span><br>




<span style="color:rgb(68,68,68)">  </span><span style="color:rgb(68,68,68)">{</span><br>
<span style="color:rgb(68,68,68)">    </span><span style="color:rgb(0,150,149)">var</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">vm</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">=</span><span style="color:rgb(68,68,68)"> Mono</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(68,68,68)">Debugger</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(68,68,68)">Soft</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(51,100,164)">VirtualMachineManager</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(68,68,68)">Listen</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">(</span><span style="color:rgb(0,150,149)">new</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(51,100,164)">IPEndPoint</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">(</span><span style="color:rgb(51,100,164)">IPAddress</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(68,68,68)">Loopback</span><span style="color:rgb(68,68,68)">,</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">port</span><span style="color:rgb(68,68,68)">))</span><span style="color:rgb(68,68,68)">;</span><br>




<span style="color:rgb(68,68,68)">    </span><span style="color:rgb(68,68,68)">vm</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(68,68,68)">Resume</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">()</span><span style="color:rgb(68,68,68)">;</span><br>




<span style="color:rgb(68,68,68)">    </span><span style="color:rgb(68,68,68)">vm</span><span style="color:rgb(68,68,68)">.</span><span style="color:rgb(68,68,68)">Detach</span><span style="color:rgb(68,68,68)"> </span><span style="color:rgb(68,68,68)">()</span><span style="color:rgb(68,68,68)">;</span><br>




<span style="color:rgb(68,68,68)">  </span><span style="color:rgb(68,68,68)">}</span><br><span style="color:rgb(68,68,68)">}</span><br><br>
</font></div></div><div><font face="Consolas">I'll use running with --debugger-agent=transport=dt_socket,address=<a href="http://127.0.0.1:27042" target="_blank">127.0.0.1:27042</a> as a temporary workaround since performance doesn't degrade a lot.</font></div>



<div><br><br><div>2013/8/7 Nikita Tsukanov <span dir="ltr"><<a>keks9n@gmail.com</a>></span><br><blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr">I suspect that the problem is actually with thread pool itself. I've created socket layer implementation using libevent (wrapped with Oars) and send/recv that utilizes thread pool for cases when it's unable to complete operation synchronously. It survives longer, but still locks up after a while. Same behavior with debugger - I'm unable to reproduce the issue when running under it. I also unable to grab thread stack traces, it prints "Full thread dump: " and nothing else.</div>



<div><div>
<div><br><br><div>2013/8/7 Greg Young <span dir="ltr"><<a>gregoryyoung1@gmail.com</a>></span><br><blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


We will see your test then as it will probably affect us as well<div><div><span></span><br><br>On Tuesday, August 6, 2013, Nikita Tsukanov  wrote:<br><blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div dir="ltr">Greg, I've tried running my server with mono compiled from master (with pull request #703 merged in), still freezes after a while.</div><div><br><br><div>2013/8/7 Greg Young <span dir="ltr"><<a>gregoryyoung1@gmail.com</a>></span><br>






<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Do you have our pull req? We are stable after (and seriously read history of this list)<div><div>
<span></span><br><br>On Tuesday, August 6, 2013, Nikita Tsukanov  wrote:<br><blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><a href="https://github.com/kekekeks/scgi-sharp" target="_blank">https://github.com/kekekeks/scgi-sharp</a> - here is my SCGI server with host for NancyFx. If you run Sandbox.exe with --echo-server it will not use nancy infrastructure and will respond directly. It locks up after several thousands of requests under jmeter.<br>








<div><br></div><div>Simple nginx configuration:</div><div><br></div><div>location /</div><div>{</div><div>   include /etc/nginx/scgi_params;</div><div>   scgi_pass <a href="http://127.0.0.1:10081" target="_blank">127.0.0.1:10081</a>;</div>








<div>}</div><div><br></div><div>Now I'm looking for alternative socket library to use it as a replacement for System.Net.Sockets.</div></div><div><br><br><div>2013/8/6 Greg Young <span dir="ltr"><<a>gregoryyoung1@gmail.com</a>></span><br>








<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Actually not that surprised we also found out file stream.flush(true) only works sometimes and ms never back supported it to actually work :)<div>








<div><span></span><br><br>On Tuesday, August 6, 2013, Alfred Hall  wrote:<br><blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<u></u>

  
  
  

<div>
<font face="tahoma">Yeah you're having exactly the same issues as I am. I'm surprised others haven't had this problem before. Not sure who works on this area of the mono codebase these days. If you got a minimal test case it may be worth us raising a Xamarin bug in bugzilla.<br>









</font><blockquote style="border-left:2px solid #325fba;padding-left:5px;margin-left:5px;margin-right:0px">-----Original message-----<br><b>From:</b> Nikita Tsukanov <<a>keks9n@gmail.com</a>><br>
<b>Sent:</b> Tuesday 6th August 2013 20:18<br><b>To:</b> <a>mono-devel-list@lists.ximian.com</a><br>
<b>Subject:</b> Re: [Mono-dev] NancyFX self hosting (HttpListener) locking up on linux<br><br>

<div dir="ltr"><div>Running with mono from master haven't helped.</div><div><br></div><div>And I'm not sure what the hell is going on, but I cann't reproduce the issue when running under... Monodevelop's debugger. It runs perfectly under it, but when I try to run the same binary from console (even with --debug option) it locks up or segfaults. Does anyone know what does it mean?</div>










</div><div><br><br><div>2013/8/6 Nikita Tsukanov <span dir="ltr"><<a title="This external link will open in a new window">keks9n@gmail.com</a>></span><br>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Great. It locked up with my more complex logic. <div>Funny fact: NancyFx increases request processing time from 2ms to 70ms with the same echo response.</div><div>Another funny fact: with MONO_DISABLE_AIO I've got segfault.</div>











<div><br></div><div>Now I'll try to use build patched mono. Not sure that it's the same issue, because in my case it never tries to read and write simultane</div></div></blockquote></div></div></blockquote></div>

</blockquote></div></div></blockquote></div></div></blockquote></div></div></blockquote></div></div></blockquote></div></div></blockquote></div></div></div></div></blockquote></div></div></div>
</blockquote><br><br></div></div><div class="HOEnZb"><div class="h5">-- <br>Le doute n'est pas une condition agréable, mais la certitude est absurde.<br>
</div></div></blockquote></div><br></div>