PHP CPU和内存使用情况


PHP CPU and Memory Usage

我正在学习PHP和Laravel我工作的公司有一个纯PHP构建的web应用程序。我注意到,当做一些事情,比如从一个CPU和内存密集型的大型CSV文件执行数据库更新时,几乎没有其他事情可以用web应用程序完成。例如,用一些无关紧要的东西更新某人的帐户,根本不需要CPU和内存密集型。基本上是前一种方法,直到完成为止。查看Linux服务器上的TOP,显示CPU使用率约为99%,内存使用率相当高。

无论如何,这真的不是一个企业级的系统,只是一些用户用来管理另一个客户端使用Python框架编写的web应用程序的用户。但这让我思考基于PHP的企业系统应该采用什么方法?

显然,不能让单个用户执行阻塞系统的密集任务,直到它完成。我想在现实世界中有很多PHP处理非常复杂的内存密集型任务的例子,而其他用户却没有注意到。

编辑:当我说"砖系统"我的意思是服务器本身,所以无论是管理PHP web应用程序和客户端Python web应用程序真的不响应请求。

在企业系统中,首先要处理的是冗余。一切都必须是多余的。对于基于PHP的应用程序,设置是至关重要的。

如果我们谈论的是一个网站,这些是步骤

  • DNS已更新,因此它可以解析多于1个IP。这样,哪个IP返回给浏览器,或者DNS池中的某个服务器是否首先死亡,都无关紧要。我们使用的是亚马逊的53号公路。

  • 接下来是web server。当一个IP被"击中"时,请求就会发送到web服务器。我们用nginx(因为nginx——你猜对了——太棒了)。由于DNS池中有多个IP地址,因此有多个web服务器可用。同样,这是无关的web服务器将处理客户端的请求冗余的胜利。

  • nginx要么提供静态内容,要么在满足规则时将请求传递给PHP。我们使用php-fpm。每个nginx服务器将HTTP请求代理到php-fpm节点集群。在常规语言中-它选择另一台计算机在计算机集群中提供PHP服务。这是无关的PHP节点将处理请求冗余的胜利

  • PHP现在做一些工作,连接到数据库,并且-你猜-它与数据库集群"对话"。数据库是同步的,有一整本书都在讨论这个话题,所以我就不详细讲了。同样,这与哪个db获得查询冗余无关(实际上有很多方法可以处理这个问题)。

  • 数据库服务器是为它们正在做的工作类型优化的 -这意味着它们为读或写进行了优化。数据库或任何存储解决方案都不是你可以像那样填满的无限黑洞。您必须仔细选择服务器将要做什么——它会写吗?它是用来阅读的吗?它将执行多少写入操作?它会读多少次?工作量增加时的计划是什么?基本上,你需要优化数据库服务器——你肯定不能使用默认的MySQL配置。如果您有可能使数据库过载的大量工作负载,您可以使用队列机制,该机制能够在单个事务中整理多个插入并刷新它们-该方法利用硬盘的带宽并将其交换为I/O(基本上,这意味着它很好而且工作速度快)。

就是这样。这是一个简短的概述,介绍如何在PHP中实现企业级的东西。每个部分都应该是冗余的,横向可扩展的,并针对它所做的工作类型进行优化。

你肯定不希望让你的应用挂起,或者当有人把事情搞砸的时候变得不可用。

不应该在web请求上执行高要求的进程。

例如,你应该使用队列。
这样,您允许文件上传并创建一个队列进程来提供服务,然后请求完成,在服务器上的进程启动后不久,用户收到了请求。

那么您可以考虑将队列配置为低CPU优先级,或者您可以在数据处理之间添加睡眠时间,允许CPU为其他进程服务。

或者你可以在上传文件后记录文件,并配置一个控制台作业,每分钟检查一次是否有待处理的数据,然后处理一个批处理,并允许下一个批处理在下一分钟检查,保持当前行的处理位置

但是,同样,尽量避免在web请求上做那些长时间繁重的过程,使用web请求来获取信息,然后单独触发进程。

Laravel对框架中的控制台作业或队列都有很好的支持。

我用我所有的Quatloos打赌,对于长时间运行的执行数据库插入的请求,您有一个打开的会话,这会阻止后续请求打开会话。你需要做的是:

<?php
session_start();
/* pre-game stuff that depends on $_SESSION */
session_write_close();
/* long-running stuff that doesn't need to update $_SESSION */

或者,如果可能的话,跳过为这个任务打开会话。

附录:

  1. 炒了那个956列,只有varchar的数据库模式的人。
  2. 如果插入是那么慢,我敢打赌,有人走了,添加了太多的索引。
  3. 如果您运行在尽可能便宜的共享CPU公共云实例上,那么您很可能会耗尽所有CPU共享。我只是通过将大文件写入快速磁盘来重新标记GCE微实例的CPU。
相关文章: