4

我有很多查找表,我将从这些查找表中生成我的网络响应。

我认为带有 Asp.net 的 IIS 使我能够将静态查找表保存在内存中,我可以使用它来非常快速地提供我的响应。

但是,是否还有非 .net 解决方案可以做到这一点?

我看过 fastcgi,但我认为这会启动 X 进程,其中任何人都可以处理 Y 请求。但是根据定义,这些过程是相互屏蔽的。我可以将 fastcgi 配置为仅使用 1 个进程,但这是否具有可伸缩性影响?

任何使用 PHP 或任何其他解释语言的东西都不会飞,因为它也是 cgi 或 fastcgi 绑定的,对吗?

我知道 memcache 可能是一种选择,尽管这需要另一个(本地)套接字连接,我宁愿避免这种连接,因为内存中的所有内容都会快得多。

该解决方案可以在 WIndows 或 Unix 下运行......这并不重要。唯一重要的是会有很多请求(现在 100 个/秒,一年内增长到 500 个/秒),我想减少处理它所需的网络服务器数量。

当前的解决方案是使用 PHP 和 memcache 完成的(偶尔会碰到 SQL 服务器后端)。虽然它很快(无论如何对于 php),当超过 50/sec 时,Apache 有真正的问题。

由于我没有看到足够多的回应来做出明智的选择,因此我对这个问题给予了赏金。

目前我正在考虑使用 C(++) 的 Asp.net 或 fastcgi。

4

2 回答 2

5

听起来您应该使用像Redis这样的内存键值数据存储,如果您打算在未来拥有多个 Web 服务器,那么您绝对应该使用集中式内存存储。Redis 在这种情况下特别理想,因为它支持列表、集合和有序集合等高级数据结构。它也非常快,它可以在入门级 Linux 机器中获得 110000 SET/秒、81000 GET/秒。检查基准。如果你沿着这条路线走,我有一个可以简化访问的c# redis 客户端。

为了使用共享内存,您需要一个在同一进程中“始终运行”的应用程序服务器。在这些情况下,您可以使用静态类或共享的“应用程序”缓存。最流行的“应用程序服务器”是任何 Java servlet 容器(例如 Tomcat)或 ASP.NET。

现在转向访问内存而不是磁盘将大大节省性能,如果此性能对您很重要,那么我认为您不想考虑使用解释性语言。在处理请求、网络 IO、解析协议设置工作线程等时总是会有开销。与内存中相比,决定使用进程外(在同一主机上)共享内存存储可以忽略不计与完成请求所需的总时间进行比较。

于 2010-02-19T08:50:52.950 回答
1

首先,让我尝试与您一起思考您的直接问题:

- 对于您的目标性能,我会说要求共享内存访问查找表是矫枉过正的。例如,memcache 开发人员关于预期性能:“在具有非常高速网络(或本地访问)的快速机器上,memcached 每秒可以轻松处理 200,000 多个请求。”

- 您目前可能受到 cpu 时间的限制,因为您正在动态生成每个页面。如果可能的话:缓存,缓存,缓存!缓存您的首页并每隔一分钟或五分钟重建一次。对于已登录的用户,缓存他们可能在会话中再次访问的用户特定页面。例如:如果每秒 50 个请求对于动态页面来说还不错,在相当平庸的服务器上每秒有数千个静态页面。我最好的提示是研究使用varnishsquid设置反向代理。

- 如果仍然需要动态生成大量页面,请使用php 加速器,以避免每次运行脚本时都必须编译 php 代码。根据维基百科,这是 2 到 10 倍的性能提升。

- mod_php 是运行 php 的最快方式。

- 除了使用 fastcgi,您还可以编写一个 apache 模块并将您的数据与网络服务器本身共享内存空间。这可能非常快。但是,我从未听说有人这样做是为了提高性能,而且这是一个非常不灵活的解决方案。

- 如果您转向更多静态内容或采用 fastcgi 方式:lighthttpd比 apache 更快。

- 还是不够快?像TUX这样的内核网络服务器可以非常快。


其次:你不是第一个遇到这个挑战的人,幸运的是一些更大的鱼很乐意与我们分享他们的“技巧”。我想这超出了你的问题的范围,但看到这些人如何解决他们的问题真的很鼓舞人心,我决定分享我所知道的材料。

看看这个关于 facebook 架构的演示文稿,以及这个关于“构建可扩展 Web 服务”的演示文稿,其中包含一些关于 flickr 设计的注释。

此外,facebook 列出了他们开发和贡献的令人印象深刻的工具集,此外,他们还分享了有关其架构的注释。他们的一些性能改进技巧: - 对memcache
的一些性能改进定制,例如 memcache-over-udp。 - hiphop是一个 php-to-optimized-c++ 编译器。Facebook 工程师声称 CPU 使用量减少了 50%。- 以“更快的语言”实现计算密集型服务,并使用thrift 将所有内容连接在一起。



于 2010-05-04T23:29:34.817 回答