使用 GWAN 流式传输大文件



>FINAL

进一步的测试表明,在较新版本的G-WAN中,一切都按预期工作。

源语言我正在处理大文件,G-WAN 似乎非常适合我的用例,但我似乎无法将内容流式传输到客户端。

我想避免缓冲响应,因为内存消耗得非常快。

源代码现已发布

谢谢。您得到的值显然是错误的,这可能来自定义CLIENT_SOCKET枚举的 gwan.h 文件中的不匹配。等待与可执行文件同步的文件的下一个版本。

请注意,如下所述,您不必处理流文件(本地或远程文件)的CLIENT_SOCKET,因为本地文件由 G-WAN 流式传输,而使用 G-WAN 的反向代理更好地提供远程文件。

复制到磁盘并从 GWAN 提供服务效率低下,在内存中缓冲文件效率低下

G-WAN与Nginx和许多其他人一样,已经在使用sendfile()因此您无需执行任何操作即可"将大文件流式传输到客户端"。

我看过 sendfile(),但我找不到 gwan 存储客户端套接字的位置。我尝试使用CLIENT_SOCKET但没有用

CLIENT_SOCKET无法返回客户端套接字的唯一方法是使用与gwan可执行文件的版本不匹配的gwan.h标头。

通过使用 G-WAN connection handler ,您可以绕过 G-WAN 的默认行为(我假设这就是您尝试过的)...但同样,这是不必要的,因为 G-WAN 已经完成了您想要实现的目标(如上所述)。

考虑到这一点,以下是关于G-WAN和sendfile()的几点:

  • G-WAN 的旧版本意外禁用了sendfile() - 请勿使用它,请确保您使用的是较新版本。

  • 4 月的公开版本在关闭连接(减慢非保持活动连接的速度)时过于小心,并且仅对大于特定大小的文件使用sendfile()

  • 最近的开发版本对所有静态文件使用 sendfile()(默认情况下,由于它使太多用户感到困惑,我们禁用了缓存,可以全局、按连接或针对特定资源显式还原)。

因此,对于大文件测试负载,G-WAN 现在比我们测试过的所有其他服务器都快。

我们还对内存消耗进行了大量修改,以达到无与伦比的水平(占 Nginx 内存消耗的一小部分) - 即使使用 sendfile() 提供大文件也是如此。

启动时的 G-WAN on a 6-Core Xeon需要 2.2 MB 的 RAM(没有编译和加载的脚本,如 servlet 和处理程序):

> Server 'gwan' process topology:
---------------------------------------------
  6] pid:4843 Thread
  5] pid:4842 Thread
  4] pid:4841 Thread
  3] pid:4840 Thread
  2] pid:4839 Thread
  1] pid:4838 Thread
  0] pid:4714 Process RAM: 2.19 MB
---------------------------------------------
Total 'gwan' server footprint: 2.19 MB

相比之下,带有worker_connections 4096;的Nginx在启动时消耗15.39 MB:

> Server 'nginx' process topology:
---------------------------------------------
  6] pid:4703 Process RAM: 2.44 MB
  5] pid:4702 Process RAM: 2.44 MB
  4] pid:4701 Process RAM: 2.44 MB
  3] pid:4700 Process RAM: 2.44 MB
  2] pid:4699 Process RAM: 2.44 MB
  1] pid:4698 Process RAM: 2.44 MB
  0] pid:4697 Process RAM: 0.77 MB
---------------------------------------------
Total 'nginx' server footprint: 15.39 MB

而且,与Nginx不同,G-WAN可以处理超过100万个并发连接,而无需预先保留内存(顺便说一下,也不需要任何配置)。

如果您使用 worker_connections 1000000; 配置 Nginx,那么您将获得:

> Server 'nginx' process topology:
---------------------------------------------
  6] pid:4568 Process RAM: 374.71 MB
  5] pid:4567 Process RAM: 374.71 MB
  4] pid:4566 Process RAM: 374.71 MB
  3] pid:4565 Process RAM: 374.71 MB
  2] pid:4564 Process RAM: 374.71 MB
  1] pid:4563 Process RAM: 374.71 MB
  0] pid:4562 Process RAM: 0.77 MB
---------------------------------------------
Total 'nginx' server footprint: 2249.05 MB

Nginx甚至在收到任何连接之前就消耗了2.2 GB的RAM!

在相同情况下,G-WAN只需要2.2 MB的RAM(少1024倍)。

G-WAN现在在大文件方面比Nginx更快。

我想从远程源流式传输大文件

sendfile()可能不是您要找的,因为您说:"我想从远程源流式传输大文件"。

在这里,如果我正确理解您的问题,您希望使用 G-WAN 作为反向代理从远程存储库中继大文件,这是一个完全不同的游戏(而不是提供本地文件)。

最新的G-WAN

开发版本具有通用的TCP反向代理功能,可以使用G-WAN connection handler进行个性化设置。

但在您的情况下,您只需要一个盲中继(无需流量重写)即可尽可能快地进行,而不是允许您过滤和更改后端服务器回复。

Griffin提到的splice()系统调用是(零拷贝)方式 - G-WAN(高效的基于事件和多线程)架构将创造奇迹 - 特别是其低RAM使用率。

G-WAN

可以在未来的版本中做到这一点(这比改变流量更简单),但这是一个非常垂直的应用程序,而不是G-WAN的主要目标,即让Web/云开发人员编写应用程序

无论如何,如果您需要这种效率水平,G-WAN 可以帮助您达到新的性能水平。通过 G-WAN 的网站联系我们。

有一个很好的需要功能的例子,也包含在 gwan 应用程序中。

http://gwan.com/source/comet.c

希望这有帮助。

我想你可能指的是http流,而不是彗星 - 在这种情况下,有一个flv.c连接处理程序示例随gwan一起提供。此外,您可以使用 c sendfile() 进行文件的零拷贝传输,或者根据需要splice()系统调用。

相关内容

  • 没有找到相关文章

最新更新