I want to create a high performance server in C# which could take about ~10k clients. Now i started writing a TcpServer with C# and for each client-connection i open a new thread. I also use one thread to accept the connections. So far so good, works fine.
The server has to deserialize AMF incoming objects do some logic ( like saving the position of a player ) and send some object back ( serializing objects ). I am not worried about the serializing/deserializing part atm.
My main concern is that I will have a lot of threads with 10k clients and i’ve read somewhere that an OS can only hold like a few hunderd threads.
Are there any sources/articles available on writing a decent async threaded server ? Are there other possibilties or will 10k threads work fine ? I’ve looked on google, but i couldn’t find much info about design patterns or ways which explain it clearly
You’re going to run into a number of problems.
You can’t spin up 10,000 threads for a couple of reasons. It’ll trash the kernel scheduler. If you’re running a 32-bit, then the default stack address space of 1MB means that 10k threads will reserve about 10GB of address space. That’ll fail.
You can’t use a simple select system either. At it’s heart, select is O(N) for the number of sockets. With 10k sockets, that’s bad.
You can use IO Completion Ports. This is the scenario they’re designed for. To my knowledge there is no stable, managed IO Completion port library. You’ll have to write your own using P/Invoke or Managed C++. Have fun.