最后
进一步的测试表明,在较新版本的 G-WAN 中,一切都按预期工作。
原始 我正在处理大文件,G-WAN 似乎非常适合我的用例,但我似乎无法将我的注意力集中在流式传输到客户端的内容上。
我想避免缓冲响应,因为内存会消耗得非常快。
最后
进一步的测试表明,在较新版本的 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.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
相比之下,Nginxworker_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 万个并发连接,而无需预先预留内存(顺便说一下也没有任何配置)。
如果你配置 Nginx ,worker_connections 1000000;
那么你有:
> 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/Cloud 开发人员编写应用程序。
无论如何,如果您需要这种效率水平,G-WAN 可以帮助您达到新的性能水平。在 G-WAN 的网站上联系我们。
我认为您可能指的是 http 流,而不是彗星 - 在这种情况下,gwan 提供了一个 flv.c 连接处理程序示例。此外,您可以根据需要使用 csendfile()
进行文件的零拷贝传输或splice()
系统调用。