【发布时间】:2014-11-06 04:48:29
【问题描述】:
我是网络应用程序开发的新手,我不知道对于动态网站来说,多少 RPS(每秒请求数)是正常的,但我认为我的应用程序非常慢。
我现在正在编写 Catalyst::Manual::Tutorial 的第 4 部分,现在我有大约 45 RPS 用于从 DB 读取 5-10 个条目,而只有大约 3-5 RPS 用于更新/创建/删除 DB 中的数据.我正在使用教程中提到的所有工具,即 SQLite3、Catalyst 5.90075 和 linux 上的 perl 5.18。在 DB 中,我有 2 个包含数据的表(作者和书籍)和 1 个链接表(author_book),我的硬盘速度 ~120MiB/s 用于读/写和核心 i5 英特尔处理器。
我的应用中有 2 个控制器、1 个模型和 4 个链式操作,并使用开发服务器(试用 Starman,结果完全相同,暂时不要使用 Apache 尝试 perl_mod)。假设我做错了什么......有人可以帮助提高性能吗?
【问题讨论】:
-
你检查内存了吗?它会交换吗?
-
不,我根本没有交换。我有 4 GiB 的 RAM。开发服务器需要约 100MiB 和 Starman,具体取决于工人数量
-
我建议您在分析器上运行它并查看花费的时间。见slideshare.net/Tim.Bunce/nyt-prof-201406key
-
当涉及数据库时,这些时间听起来很典型。当它是平面数据或缓存数据时,我得到了 250+。您可以并且应该运行多个进程(受 RAM 限制),从而增加有效 RPS。 uWSGI 几乎在各个方面都比 Starman 好,并且可以很好地与 .psgi 和 Catalyst 配合使用。
-
好的,我发现 Catalyst(默认情况下)使用 DBIx 的方式是为每个条目创建 1 个 SELECT,而不是为所有条目创建 1 个 SELECT。但是为什么它被选为默认行为呢?每个 SELECT 的成本约为 2.2 毫秒(来自 NYTProf 的信息,最昂贵的是 sub DBIx::Class::Storage::DBIHacks::_resolve_aliastypes_from_select_args),并且像 Catalyst 那样做这些事情非常昂贵......在 INSERT 的情况下最昂贵的是 DBI::st:execute(xsub) 并假设没有办法改善这一点(在插入的情况下)......非常感谢 NYTProf,非常好的工具
标签: performance perl catalyst