nextcloud, 程式设计

Nextcloud的新架构

关于Nextcloud的一再抱怨是,对于某些任务它可能会很慢。为什么Nextcloud速度慢?这是一个非常普遍的问题。 Nextcloud并不总是那么慢。实际上,在过去的几年中,它已大大改善。 PHP最新版本越来越快,Nextcloud开发人员现在更加谨慎地简化资产,以避免数十个请求加载Web界面,依此类推。

但是,上传多个小文件或浏览图库等操作仍然非常缓慢。如果我们将它们与其他方案进行比较,那就太慢了。

这两个用例有一个共同点:许多请求需要并行处理,而这正是Nextcloud苦苦挣扎的地方。

造成这种情况的主要原因有两个,分别是围绕Nextcloud和传统PHP项目的体系结构。

传统PHP请求的过程

在经典的PHP体系结构中,该服务在空闲时并未真正运行。 HTTP服务器正在网络上侦听,然后检测到何时有PHP处理请求,并知道将其传递给PHP解释器。

现在,HTTP守护程序如何处理PHP请求有了发展。如今, PHP-FPM 是最常用的一种,它是实现 快速CGI 界面。 HTTP服务器使用以下命令转发请求 mod_proxy_fcgi 到PHP-FPM,通常会产生一个新的过程来开始解释PHP代码,直到请求得到处理,然后PHP过程要么结束,要么空闲以等待新任务。

这意味着对于每个HTTP请求,进程(在本例中为Nextcloud)都需要启动和终止,它需要解析其配置文件,初始化其变量,处理所有内容并进行清理。

将其与传统的C或C ++服务(例如Apache本身)进行比较,该服务会加载其配置,为其主要结构分配内存并保持监听等待传入连接。他们只需要满足请求,但是他们不需要’无需每次都从零开始。

现在,在Apache示例中停留更长的时间,此操作和许多其他服务的经典操作方式是在每次请求到达时派生一个新的子进程,以便子进程对其进行处理,父进程可以返回监听插座。

这样做的问题是,产生一个新线程的计算量很大,因为现在我们由操作系统执行了上下文切换,因此两个线程都有各自的处理时间份额。另外,由于每个衍生线程都包含COW模式下的父进程内存的副本,因此可以保留大量内存。记忆赢了’直到它在进程之间分开为止,否则将被复制,但是除非我们使用 过量使用 它会被占两次。

事实证明,继续使用单个线程或线程池来避免上述开销会更有效。没有产生和有限的上下文切换。该模型利用了异步OS原语,例如 投票 保证单独的并发事件可以由单个线程顺序处理。诸如libevent,libev和libuv之类的库使用这些原语在闭环中处理诸如读,写和计时器之类的请求,在该闭环中,库用户只需要注册回调。这称为 事件循环 architecture.

这正是Nginx变得强大的地方,因为它正是使用这种架构来实现更好的性能。 Apache最终在MPM事件中采用了相同的策略,随后又采取了其​​他策略。

现在,这种范例无处不在。 东京 在Rust中, Boost.asio 在C ++中, libuv 在C中,这是NodeJS的事件循环,是一些著名的例子。

Nextcloud

Nextcloud是传统的PHP应用程序。就像MPM之前的Apache。想想打开画廊:立即将许多请求发送到服务器,以检索所有需要在屏幕上绘制的数十个缩略图。

对于这些缩略图中的每一个,我们都加载配置文件,解析环境,使用其所有钩子加载所有Nextcloud应用程序,进行安全保护,例如CSRF,令牌等。

因此,改善这种情况的第一件事是为每个请求尽可能地减少负载,换句话说,使每个请求尽可能轻。无需接触架构即可完成。

真正的进步来自于采取行业其他部门已经采取的措施。 Nextcloud应该采用事件循环模型。

这样,请求到达时服务已经在运行。该环境已经加载,我们正在事件循环中等待调度请求,而无需初始化和拆除每个请求。在这种体系结构中,检索每个缩略图通常可以归结为数据库访问和文件系统访问。

PHP中已经有一些值得探索的框架,例如 reactPHP,是在 此拉取请求.

这显然是一个巨大的范式转变,但是为了保持相关性,应该认真对待这一转变。如果有人认为这太昂贵了,我只想引用 沉没成本谬误.

Check out this post 了解有关其他图库性能问题的更多信息。

作者: nachoparker

谦虚地分享我认为有用的东西 [ 的github 码头工人hub ]

10 Comments

  1. 您好,这非常有趣(尽管我不是架构专家)。您是这个好新观点还是已经决定和计划的事情?谢谢 !

    1. 嗨,sk

      这似乎是通过SSE提供推送功能的PR。很酷的东西,但是无关。您可以在文章中包含的链接中看到有关事件循环建议的一些讨论,但没有’似乎没有太大的吸引力,所以我想再次提出来进行讨论。

      很高兴看到实现的推送功能,也许我建议改用websockets。

      干杯,感谢您的光临

  2. 我想说谢谢您的调查。没有你我没有’知道nextcloud的缺点。我将考虑迁移到另一个OSS服务。

  3. 感谢您这篇非常有趣的文章。没错,Nextcloud开发人员应该尝试在速度方面做些事情,以保持竞争状态。我不’没有足够的知识说“您的解决方案是正确的”,但对我来说很有意义。对不起,我的英语不好。我希望我的评论会(一点)帮助您获得良好的SEO。很棒的网站。非常感谢

  4. 你好,
    您认为与用C ++和Python编写的DropBox或Seafile相比,Nextcloud更具竞争力吗?
    大学教师’别误会,我使用NextcloudPi,它比Seafile具有很多优势,但是有时候有些事情令人非常失望。
    我可以在大约15-20分钟内从Web界面将1 GB的图片下载到我的PC。
    使用IOS-App将它们下载到我的Ipad上需要4个多小时….
    无论如何,我要感谢您所做的工作以及您在该项目中所做的努力。
    如果您打算将NCP调整为更强大的SBC,我愿意测试这些调整,但是我已经尝试了很多,并且’认为无需更改架构就可以实现。

    1. 我看到了您的问题,但是当我通过域注册云时,我个人没有这个问题,这是我的互联网相当缓慢的记录,但是如果我使用IP,则如果10Mbits的下载速度为23Mbits,则可以上传

发表回覆 skjnldsv 取消回复

您的电子邮件地址不会被公开。 必需的地方已做标记 *