2

我有一个 C# TCP 异步套接字服务器。

在本地测试,我可以在 35 秒内接受 5K 连接。我正在运行四核超线程 PC(8 个线程),每个内核的利用率约为 20-40%。当连接被接受时,服务器向客户端询问一堆数据,然后执行一堆数据库条目。

我将服务器应用程序和 SQL 数据库移至 Amazon AWS 上的小型数据库和中型服务器实例。

Amazon 中型服务器 (EC2) 是 1 个虚拟核心和 2 个 ECU。据我所知,它只有 1 个线程。(来自性能监视器)

如果我尝试在 35 秒内将 1000 个客户端连接到中型服务器。大约 650 个连接后,我开始接收Connect failed(b) No connection could be made because the target machine positively拒绝它

查看性能监视器,我注意到 CPU 利用率只有 ~10-15%。

我猜核心没有被加载,因为它试图处理大量的连接队列、小型操作并且没有提供足够的负载来增加 CPU 使用率,因为服务器只有 1 个虚拟核心。

有没有人有这方面的经验,我的理论有意义吗?我陷入了硬件限制?(需要增加服务器大小?)

如果没有,有什么想法可以提高利用率并支持更多/更快的连接吗?

有人对此有经验吗?

编辑:

我将我在 Amazon EC2 上的实例升级到了 High CPU Extra Large 实例。

该实例现在有 8 个内核和 20 个 ECU。

我遇到了同样的问题,我得到 No connection could be made 因为目标机器在 ~600 个连接后主动拒绝了它。

4

3 回答 3

1

检查 Amazon 服务器是否配置为允许打开的 TCP 连接数。在 Windows 中,您必须通过为最大允许 TCP 连接添加注册表项来将服务器设置为允许连接。

于 2012-09-05T18:52:06.303 回答
0

当您在本地运行代码时,您的代码似乎正在使用多个内核。您是否在将代码移至单核时对其进行了更改?当我使用虚拟用户创建进行测试并以编程方式使他们同时访问应用程序时,我在我的应用程序中看到了类似的情况。在一定数量之后,我曾经连接断开/无法访问。

如果您的要求是高利用率,您可以使用更高配置的 EC2 并获取预留实例(如果您希望长时间使用它),这可能会花费您非常经济的成本。此外,尝试使用 cloudfront 、负载均衡器(如果您有 2 个/更多实例)。他们肯定会增加您目前可以处理的用户数量。希望能帮助到你。

于 2012-08-29T18:14:48.330 回答
0

我能够解决这个问题。我升级了我的实例以使用 PIOPS。我还在本地使用了更好的互联网连接,因为我的旧上传速度太慢,无法支持发送所有数据和连接。

通过这 2 个更改,我能够在本地创建 5K+ TCP 连接并毫无问题地连接到服务器。

于 2012-10-19T20:33:21.590 回答