我想为我的静态内容创建一个服务器。
我需要提供一些 3-10 mb 的文件 - 很多。(我还会在这个服务器上放置一些 .js 和 .css 以及来自我网站的图像)。
我想到了 nginx 和 G-WAN(http://trustleap.com/)。
我不知道的是提供静态内容需要哪些资源?每次文件传输需要多少 RAM?
如果我使用 256 mb(或 512 mb)VPS,端口良好,带宽巨大,那么我每秒可以提供多少次点击(3-10 mb 文件)?(我知道“这取决于情况” - 但请根据经验或理论给我一个粗略的估计)。
文件不多,只是经常下载 - 我应该考虑缓存吗,或者这只会使用提供点击所需的内存?
答案1
如果您使用的是 nginx,那么每个活动连接的开销只有几 KB。如果您使用的是 Apache 之类的程序,那么每个连接将有一个线程,这意味着每个连接将有数百 KB 甚至兆字节。
但是nginx不支持异步磁盘Linux 上的 IO(因为 Linux 上的异步磁盘 IO 基本上在设计上就很糟糕)。因此,您将必须运行许多 nginx 工作进程,因为每次磁盘读取都可能阻塞整个工作进程。如果您使用的是 FreeBSD,这不是问题,而且 nginx 将在异步磁盘和网络 IO 方面发挥出色作用。但是如果您使用 Linux 进行此项目,您可能希望继续使用 Apache。
但实际上,最重要的是磁盘缓存,而不是您选择的 Web 服务器。您需要大量的可用 RAM,以便操作系统缓存这些文件并快速读取。如果“热集”超过 8 GB,请考虑购买较少的 RAM 和便宜的 SSD,因为成本/收益比可能会更好。
最后,考虑使用 CDN 来卸载它,并购买一台非常便宜的服务器。他们提供静态文件服务,而且速度非常快,成本非常低。SimpleCDN 的价格最低,但 MaxCDN、Rackspace、Amazon 等都是 CDN 领域低端的巨头。
答案2
如果操作系统可以将内容的热门部分缓存到内存中,它将不会使用磁盘,并且可以非常快速地提供服务。 VPS 每秒可以处理数百个请求,在达到 CPU 限制之前,您很可能会使网络饱和。
如果内容不适合内存,那么磁盘 IO(寻道、吞吐量、文件系统碎片)将发挥作用,并且等式会发生变化。
Web 服务器会为每个客户端增加内存开销,但 nginx 只需每个连接几千字节即可完成。
希望这些指示能对你有所帮助。
答案3
提供静态内容需要哪些资源?每次文件传输需要多少 RAM?
首先,对于相同数量的工作者,G-WAN v4.7+ 在启动时使用的 RAM 比 Nginx 少得多:
> Server 'nginx' process topology:
---------------------------------------------
6] pid:21228 Process RAM: 0.77 MB
5] pid:21229 Process RAM: 2.44 MB
4] pid:21230 Process RAM: 2.44 MB
3] pid:21231 Process RAM: 2.44 MB
2] pid:21232 Process RAM: 2.44 MB
1] pid:21233 Process RAM: 2.44 MB
0] pid:21234 Process RAM: 2.44 MB
---------------------------------------------
Total 'nginx' server footprint: 15.39 MB
> Server 'gwan' process topology:
---------------------------------------------
6] pid:6054 Thread
5] pid:6053 Thread
4] pid:6052 Thread
3] pid:6051 Thread
2] pid:6050 Thread
1] pid:6049 Thread
0] pid:5839 Process RAM: 2.19 MB
---------------------------------------------
Total 'gwan' server footprint: 2.19 MB
G-WAN 使用线程(通常每个核心一个线程),Nginx 使用进程(通常每个核心一个进程),进程会拖累更多开销,需要通过共享内存进行同步等。两者都使用事件处理的“异步”模型。
注意这里G-WAN 可以自动增长到超过 100 万个并发连接,而 Nginx 则受限于其worker_connections
设置(仅在 4096 中定义ab.c测试上述内容)。
我不清楚的是每个连接是否有内存开销:即 nginx 或 gwan 是否每次命中都会消耗内存?
简而言之,对于所有文件大小,G-WAN v4.7+(默认情况下禁用内存缓存)比 Nginx 消耗的 RAM 少得多,同时每秒可处理更多请求。
长话短说,尽管 Nginx 即使在有新的 HTTP keep-alived 请求时也会消耗越来越多的内存,但 G-WAN 的内存使用量对于 HTTP keep-alived 请求可以保持稳定,并且其增长速度远低于具有非 keep-alived 请求的 Nginx。
我们的weighttp 包装器 ab.c测量测试期间服务器应用程序和系统的内存消耗。结果表明,Nginx 在内存资源消耗方面对系统的影响更大。
这是由于每个 Web 服务器处理请求和分配内存的方式所致。
如果我同时对一个 5 mb 的文件发出 10 个请求,这是否意味着将使用 50mb 内存来处理它?也许 + 线程内存(我不知道 nginx 或 gwan 是否对每个连接都使用线程)。
两个服务器(Nginx 和 G-WAN)都使用sendfile()
内核(而不是应用程序)为 I/O 分配资源。
Web 服务器仍将分配资源,但这是为了维护每个连接的上下文,而不是缓冲磁盘 I/O。
因此,内存消耗取决于每次调用时发送的文件块的大小,sendfile()
而不是直接取决于文件的总大小。
totfile 大小对高并发性的长期影响很大,但这是由于内核需要缓存的块数量所致。
如有其他问题,请通过 G-WAN 与我们联系。我们在类似 CDN 的应用程序方面投入了大量资金。