什么用于高性能服务器编码?

时间:2011-04-21 13:05:40

标签: c# performance

我需要构建一个服务器以接受具有非常高频率和负载的客户端连接(每个用户每0.5秒发送一个请求,并且应该在800毫秒内得到响应,我应该能够在一个上支持数千个用户服务器)。假设SQL Server经过精心调整,不会造成问题。 (假设当然可能不是真的)

我正在寻找一个非阻塞服务器来实现这一目标。我的后端是一个坐在另一台机器上的SQL Server。它不需要实时更新 - 所以我认为我可以将大部分数据缓存在内存中,并每隔10-20秒将其转储到数据库中。

我应该使用C#(与SQL Server更兼容)编写服务器吗?也许Python与龙卷风?编写高性能服务器时应该考虑什么?

编辑:(添加更多信息)

  1. 应用程序是游戏服务器。
  2. 我真的不知道实际的流量 - 但这是预测,服务器应该支持它并且可以很好地扩展。
  3. 它在数据中心托管“云中”。
  4. 语言并不重要。表现呢。 (可以在SQL Server上公开Web服务以允许除.NET之外的其他语言)
  5. 连接非常频繁但很小(返回的数据很少,并且几乎不需要计算)。
  6. 它应该将大部分数据保存在内存中以获得最快的性能。
  7. 任何想法将不胜感激:)

    由于

4 个答案:

答案 0 :(得分:0)

使用您最了解的编程语言。在你不完全理解的大型应用程序中寻找性能问题要花费更多。

购买更多硬件要便宜很多。

答案 1 :(得分:0)

好吧,如果你真的需要高性能,不要选择C#,而是使用C / C ++,这很明显。

在任何情况下,进行服务器编程的最快方法(据我所知)是使用IOCP(I / O完成端口)。好吧,这就是我在制作MMORPG服务器模拟器时所使用的,它的执行速度比官方基于C ++ select的服务器快。

以下是C#中IOCP的完整介绍 http://www.codeproject.com/KB/IP/socketasynceventargs.aspx

祝你好运!

答案 2 :(得分:0)

人们会说C ++,因为.Net中的垃圾收集可以扼杀你的延迟。如果你聪明,可以通过重用现有的托管对象来避免垃圾收集。

编辑:您对SQL Server的假设可能是错误的。您需要将状态存储在内存中以供随机访问。如果您需要保留更改,请将它们记录到filsystem并将它们与不常用的数据库合并

编辑2:你会有很多不同的线程与同一数据交谈。为了避免阻塞和死锁,请了解无锁编程(Interlocked.CompareExchange等)

答案 3 :(得分:0)

我是一个项目的一部分,其中包括非常高性能的服务器代码,实际上包括在12毫秒左右的时间内响应TCP数据包的能力。

我们使用C#而且我必须同意jgauffin - 你知道的语言比任何事情都重要得多。

两个提示:

  1. 写入控制台(特别是彩色)可能会减慢速度。

  2. 如果服务器在第一次请求时很快就很重要,那么您可能希望使用pre-JIT编译器来避免在第一次请求期间进行JIT编译。见Ngen.exe

相关问题