FINAL
进一步测试显示,在较新版本的G-WAN中,一切都按预期工作。
ORIGINAL 我正在使用大文件,G-WAN似乎非常适合我的用例,但我似乎无法将流媒体内容包裹在客户端。
我想避免缓冲响应,因为内存消耗得非常快。
答案 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)
答案 2 :(得分:0)
我认为你可能意味着http流,而不是彗星 - 在这种情况下,有一个与gwan一起提供的flv.c连接处理程序示例。此外,您可以使用c sendfile()
进行文件的零拷贝传输,或splice()
系统调用,具体取决于您的需要。