[Mono-dev] Fundamental performance problems with Mono

zvikag zvika at liboxmail.com
Thu Jan 7 10:37:54 EST 2010

Hello all,
The bottom line of this message is that I don't see how can one write a
high-performance socket server in Mono...
Here is the story:
I am writing a proxy server using .NET Socket API. This proxy does almost
entirely I/O work - copying buffers from one socket to another. Now, Mono
doesn't implement the newer 
XXXAsync Socket API  that was introduced in .NET 2.0 SP1 (or more
accurately, implements it 
perfunctorily ). So I was left to use the APM Socket API which produces tons
of garbage objects under heavy load.
When testing the server on Linux under load we saw very frequent CPU bursts
that crippled the throughput of the server. After profiling with the mono
built-in profiler I confirmed that the reason for the high CPU usage was the
GC collections that got more and more frequent and took more and more time.
I then read a little bit and realized that the Mono GC is non-generational
which might explain the long GC cycles (if it was generational it could have
collected the garbage objects that were created during async socket
operations in generation 0 and probably stop there, but it has to traverse
the entire managed heap).
So the combination of the non-generational GC and the unimplemented XXXAsync
Socket API result in very poor performance of the Mono server. The maximum
throughput of the server with Mono on Linux is about half of that on Windows
using .NET.

I attached the GC stats and profiling results of a 15 minute run.
http://old.nabble.com/file/p27026906/profile_alloc.log profile_alloc.log 
http://old.nabble.com/file/p27026906/gc_stats.log gc_stats.log 
Can you help me out here?
View this message in context: http://old.nabble.com/Fundamental-performance-problems-with-Mono-tp27026906p27026906.html
Sent from the Mono - Dev mailing list archive at Nabble.com.

More information about the Mono-devel-list mailing list