http用gwan流式传输大文件

时间:2013-10-22 21:36:05

标签: streaming g-wan http-proxy

FINAL

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

ORIGINAL 我正在使用大文件,G-WAN似乎非常适合我的用例,但我似乎无法将流媒体内容包裹在客户端。

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

3 个答案:

答案 0 :(得分:2)

  

源代码现已发布

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

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

  

复制到磁盘并从gwan服务是低效的,并且在内存中缓冲文件效率也很低

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

  

我看过sendfile()但是我找不到gwan存储客户端套接字的地方。我试过使用CLIENT_SOCKET,但它不起作用

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

通过使用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

相比之下,Nginx worker_connections 4096;在启动时吃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作为反向代理,这是一个完全不同的游戏(而不是提供本地文件)。 / p>

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

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

Griffin提到的splice()系统调用是(零拷贝)方式 - 而G-WAN(高效的基于事件和多线程)的体系结构将会令人惊叹 - 尤其是其低RAM使用率。

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

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

答案 1 :(得分:1)

有一个很好的require函数示例,也包含在gwan应用程序中。

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

希望这有帮助。

答案 2 :(得分:0)

我认为你可能意味着http流,而不是彗星 - 在这种情况下,有一个与gwan一起提供的flv.c连接处理程序示例。此外,您可以使用c sendfile()进行文件的零拷贝传输,或splice()系统调用,具体取决于您的需要。