问题标签 [c10k]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
396 浏览

google-app-engine - 平台即服务,可同时处理数以万计的长期网络连接

是否有一个平台即服务(PaaS,例如 Google App Engine 或 Windows Azure)可以以合理的成本运行服务器,用于在客户端之间中继对等“实时”通信?

在我的例子中,该系统将用于将(少量)网络流量中继到和从具有有限资源的嵌入式 C 编程的小型家庭自动化小工具到 Android 和 iOS 应用程序。几年后,我预计会有数万个同时连接。

我正在寻找 PaaS 解决方案而不是 IaaS 的原因是我希望最大限度地减少虚拟计算机、操作系统和服务器应用程序维护所需的时间和专业知识。

由于家庭自动化小工具的资源限制,像PubNub这样的解决方案是不可能的。我的嵌入式 C 代码有几千字节的可用程序闪存,因此使用的协议必须非常基本(例如原始 TCP 或 UDP、HTTP 或 WebSockets)。

使用 Google App Engine (GAE) 的“长轮询”成本太高,因为即使几乎没有流量传输,它们也会在整个连接期间计费。GAE 支持套接字,但仅支持传出套接字,而不支持服务器上的侦听套接字。是否有可能以某种方式绕过这个限制,例如首先向 GAE 发送一个 UDP 数据包(在用户的防火墙上打一个洞,然后让 GAE 启动一个传出套接字返回到家庭自动化小工具或 Android/iOS 应用程序?

或者您是否看到使用 Windows Azure 或其他 PaaS 提供商的 PaaS 方面的任何其他可能的解决方案?

非常感谢任何提示或可能的解决方案!

0 投票
3 回答
2735 浏览

java - 线程闲置=不好?

我想在一个小型机器集群(尽可能小)上同时支持大约 10,000 个 HTTP 客户端。我想在用户使用应用程序时保持与每个客户端的连接,以允许服务器推送更新。

我相信通常建议将异步 IO 用于这些类型的长期连接,以避免大量线程处于空闲状态。但是让线程闲置有什么问题呢?我发现线程模型在精神上更容易使用,但我不想做会让我头疼的事情。我想我必须进行实验,但我想知道是否有人知道以前的这些实验?

0 投票
1 回答
260 浏览

multithreading - c10k 中每个线程有多个客户端

在 c10k 问题中通常使用每个客户端一个线程是否有任何最佳理由?

我们可以在每个线程中放置 5、10 或 25 个吗?性能会有什么负面变化吗?

每个客户端有一个线程似乎对系统来说非常繁重,如果我们每个线程有 25 个线程,我们可以为 10,000 个线程提供 400 个线程,而不是为 10,000 个线程提供 10,000 个线程。

0 投票
1 回答
1233 浏览

java - 创建数千个 Netty 客户端而不创建数千个线程

我使用 Netty 4 创建了一个相当简单的服务器。我已经能够将其扩展为处理数千个连接,并且它永远不会超过约 40 个线程。

服务器线程数保持不变(通过 Java VisualVM)

为了测试它,我还创建了一个创建数千个连接的测试客户端。不幸的是,这会创建与建立连接一样多的线程。我希望为客户减少线程。为此,我查看了很多帖子。许多示例显示了单连接设置。 说要在客户之间共享 NioEventLoopGroup,我就是这样做的。我得到的 nioEventLoopGroup 数量有限,但在其他地方每个连接都有一个线程。我不是故意在管道中创建线程,也不知道可能是什么。

客户端线程数随连接数增长(通过 Java VisualVM)

线程(通过 Java VisualVM)

这是我的客户端代码设置的一个片段。根据我迄今为止的研究,它似乎应该保持一个固定的线程数。有没有什么我应该做的事情来防止每个客户端连接的线程?

主要的

模拟客户端

0 投票
1 回答
2093 浏览

django - GEvent / GUnicorn 和 C10k 问题

C10K 问题告诉我们传统的Web 服务器最多只能同时限制约 10k 的容量。

像 nginx 这样的服务器使用单线程模型和异步通信而不是线程来处理传入的请求。AFAIK Gevent使用greenlets(同一线程内的可切换执行上下文)而不是线程。

这让我想到了两个问题(再次:假设我们处于异步模型中 - 考虑 gevent 和 gunicorn):

  1. 在这种情况下:是否存在资源占用的风险?对于基于greenlet的服务器,我将进一步限制问题:假设资源占用实际上是互斥锁(互斥锁阻塞当前线程,尽管不是当前进程;但现在我们不再处于多线程架构中如果我们使用greenlets ...我错了吗?)。
  2. 如果我们不是基于 greenlet 的架构(也不是线程架构):Websockets 是如何在服务器中实现的?

还有一个关于 Django 的问题:

  1. 当我不在视图内且无法直接访问视图参数时,如何识别当前请求?我有使用 a (填充在自定义中间件中)识别当前线程的不良做法,threading.local但当时我没有考虑非线程架构(我的代码很好,只要我可以说“一个请求(暗示)一根线”)。

这将在一个场景中帮助我:request当表单调用(我的/自定义)字段的clean()方法时识别当前(即根据当前请求根据数据验证值)。但是,如果我有超过 10k 限制的同时请求并使用异步(非线程)方法,则此方法将失败。

0 投票
1 回答
687 浏览

java - 从调用另一个 REST 服务的 java 公开 SOAP 1.2 Web 服务

我是一名 Python 程序员,我们有一个用于 Web 项目的 Python 后端,我们使用 Python Web 服务器(Tornado)来提供 REST Web 服务。

几个月前,我们被要求为客户提供 SOAP,令我们惊讶的是 Python 3 的 SOAP 公开能力非常差。我们尝试了Ladon&TornadoWS包,但两者都有其局限性。甚至其中一些会生成不符合相应 WSDL 的无效响应。

所以现在我认为更好的方法是使用 Java 制作 SOAP 接口,这将使用我们的 Python 后端的 Web 服务。我有一些 Java 经验,但主要是使用 Struts 框架。我需要找到一个轻量级但高度可定制的解决方案。

提供调用 REST Python 后端的 JAVA soap 接口的可能解决方案

我目前正在寻找的是:

  • 完全模仿我们客户现有 WSDL 上的 WSDL(客户将使用我们的服务,但他们希望做出最少的更改)。
  • 100% 有效的 soap/xml 响应和 WSDL!(令人惊讶的是,我们尝试的一些第 3 方 Python 包会生成无效响应)。.NET 平台将使用 SOAP 服务。
  • 我们需要最大限度地控制生成的 WSDL 的元素名称和名称空间,以便客户端可以透明地切换到我们的 Web 服务。
  • 用于在 Java 中公开 SOAP 1.1 和 1.2 服务的轻量级解决方案,可扩展到许多并发请求。
  • 这个 Java 接口将调用我们的 Python 后端的 REST Web 服务。所以我正在寻找特别适合这个目的的东西。
  • 现在我们将 nginx + tornado 用于我们的 REST Web 服务,我正在寻找 Java 中类似的东西。特别是解决c10k问题的东西。基本上,Java 接口所做的只是接受 SOAP 请求,进行 HTTP 调用并返回这些响应。所以我认为期待类似Tornado的东西是合理的,它提供了非阻塞网络 I/O 并且可以很好地扩展。

我知道这个问题可能被认为没有建设性,但我真的在这里寻找一些好的意见,因为我没有在网上找到信息(可能是由于我的搜索不佳)。

我也愿意接受其他可能的解决方案来解决我们的问题。

0 投票
1 回答
450 浏览

multithreading - Boost:多线程性能,线程/套接字的重用

我将首先描述我的任务,然后在下面提出我的问题。

我正在尝试为我们的分布式数据采集系统实现“单线程一连接”方案。我在 Linux 平台上将 Boost 用于线程(thread_group),将 ASIO 用于套接字。

我们有 320 个联网的 DAQ 模块。大约每 0.25ms 一次,其中大约一半会各自生成一个数据包(大小小于标准 MTU)并发送到 linux 服务器。每个模块都有自己的长寿命 TCP 连接到服务器上的专用端口。也就是说,服务器端应用程序运行 320 个线程 320 个 tcp 同步接收器,在 1Gbe NIC,8 个 CPU 内核上。

320 个线程不必对传入的数据进行任何计算 - 只需接收数据、生成和添加时间戳并将数据存储在线程拥有的内存中。套接字都是同步的,因此没有传入数据的线程会被阻塞。套接字在运行期间保持打开状态。

我们的要求是线程应该以尽可能短的时间延迟读取它们各自的套接字连接。阅读了 C10K和这篇文章后 ,我预计每个线程每秒都能轻松处理至少 1K 的 MTU 大小的数据包。

我的问题是这样的:我首先通过在服务器上触发时间同步数据来测试系统(不同套接字上的传入数据相隔不到几微秒)。当数据包的数量非常少(小于 10)时,我发现线程时间戳之间相隔几微秒。但是,如果超过 10 个,则时间戳会分散多达 0.7 秒。

我的问题是:

  1. 我是否完全误解了 C10K 问题并搞砸了实施?与C10K相比,320确实微不足道
  2. 关于出了什么问题的任何提示?
  3. 这真的可以重用线程和/或套接字吗?(我真的不知道如何在我的情况下实现重用,所以任何解释都值得赞赏。)
0 投票
1 回答
362 浏览

c - Httperf 文件描述符限制

我的问题和这个问题这个问题一样

我基本上想尝试像这样并行运行具有 10000 个连接的 httperf [httperf --uri / --server 192.168.1.2 --port 8080 --num-conns=500000 --rate 10000]

我在 Ubuntu 14.04 上运行它。

首先,我提高了系统文件描述符限制,这是我现在 SO 中配置的内容:

我试图从 github 存储库编译 HEAD 版本,但它似乎完全不稳定。

我还尝试了 0.9.0 版本修改限制(更改 /usr/include/x86_64-linux-gnu/bits/typesizes.h 以解锁 FD_SETSIZE 1024),就像其他问题答案建议做的那样。重新编译 httperf 后,它一直返回相同的错误:

我对诸如 select 之类的低级系统调用并不熟悉,但据我所知,htperf 0.9.0 使用 select 来处理套接字事件,并且此系统调用受硬编码的 1024 大小的文件描述符限制的限制。所以你们知道我做错了什么吗?如何解锁 1024 限制?

0 投票
1 回答
216 浏览

java - 2015 年 64 位 Linux 上的 Java 阻塞 IO 是否解决了 C10K 问题?

2015 年 64 位 Linux 上的 Java 阻塞 IO 是否解决了 C10K 问题?

换句话说:

在 64 位 Linux 上运行的每套接字线程 Java 服务器(不是 NIO)能否保持 10,000 个线程运行?

它能否在一两毫秒内轻松回复传入数据(在连接的一小部分上)?

0 投票
1 回答
798 浏览

nginx - 如何在端口上发出超过 65k 的请求

我有一个简单的节点 js Web 套接字服务器,如下所示:

此服务器需要 65k 连接(因为一个端口最多需要 65k 连接)。如何扩展服务器以使其可以连接超过 10 万个连接?

我最近打开了三个具有不同端口的此类服务器,并尝试使用 nginx 进行负载平衡,但无济于事,因为 nginx 服务器也只能使用 65k 连接。nginx配置在这里

端口 8000 只能进行 65k 连接。

这些情况如何实时处理。我是这里的业余爱好者,需要一些好的指针来扩展服务器。该解决方案不必使用 nginx。它可以是任何东西。我只是想知道,如何处理这些问题。详细的答案表示赞赏。谢谢。