DreamFactory 第9章 性能注意事项
DreamFactory是一个基于PHP的应用程序,尽管我们会尽一切努力优化代码,但性能很大程度上取决于基础架构级别的决策。幸运的是,这些决定并不是由预算决定的,而是由可靠的技术和主机选择决定的。尽管您的DreamFactory环境在例如AWS t2.large上无疑比在15美元的Digital Ocean Droplet上更具性能,但是当您谨慎地正确配置和调整环境时,两者之间的鸿沟可以大大减少。在本章中,我们将提供一些常规性能基准,然后提供有关如何确保DreamFactory实例以峰值容量运行的指南。
绩效基准
下表列出了DreamFactory与在各种流行的托管解决方案上托管平台相关的平均响应时间。在每种情况下,托管环境都是未经修改的,并且没有以任何方式进行优化。但是重要的是要注意所有的程序都在运行PHP 7.2,NGINX和PHP-FPM。
环境 | 负载和API类型 | 平均响应时间 |
---|---|---|
$ 15 Digital Ocean飞沫 | 每秒10个MySQL API请求(10条记录) | 2524毫秒 |
$ 15 Digital Ocean飞沫 | 启用缓存的情况下,每秒10个MySQL API请求(10条记录) | 101毫秒(改善96%) |
$ 15 Digital Ocean飞沫 | 启用缓存的情况下,每秒10个MySQL API请求(100条记录) | 145毫秒 |
AWS t2.large | 每秒50个MySQL API请求(100条记录) | 83毫秒 |
AWS t2.large | 每秒启用缓存50个MySQL API请求(100条记录) | 72毫秒(改善13.3%) |
AWS t2.large | 每秒100个MySQL API请求(100条记录) | 85毫秒 |
AWS t2.large | 启用缓存的情况下,每秒100个MySQL API请求(100条记录) | 73毫秒(改善14.2%) |
AWS t2.large | 每秒10个S3 API JPEG文件请求 | 198毫秒 |
AWS t2.large | 每秒10个MySQL API请求(1,000条记录) | 281毫秒 |
AWS t2.large | 启用缓存的情况下,每秒10个MySQL API请求(1,000条记录) | 264毫秒(改善7.2%) |
这些负载测试是使用第三方负载测试服务Loader.io进行的。。
这里最明显的收获是,如果您在低功耗服务器上运行DreamFactory,则启用数据库缓存会对性能产生巨大影响。在更强大的服务器环境中,影响并不那么明显,但是在上述ts.large上启用缓存的所有方法均实现了上述场景平均11.6%的性能提升。那么,您还可以做些什么来提高性能呢?
优化DreamFactory的数据库API
通过确保数据库已正确配置,已分配了适当的硬件和网络资源,并打开DreamFactory的数据库缓存功能,可以确保确保DreamFactory生成的数据库API以最佳性能运行。在本节中,我们将更多地讨论所有这些任务。
索引数据库
对于数据库支持的API,没有比适当索引数据库还要执行的更具影响力的任务。数据库索引使您的数据库引擎可以快速识别哪些行与where
子句定义的条件匹配。有关常规和特定于数据库的索引信息,请参考以下资源:
数据库API缓存
尽可能启用数据库API缓存,因为它无疑会提高性能。
DreamFactory实例可以是负载平衡的,并且可以配置为共享系统数据库,缓存详细信息以及在分布式环境中运行所需的其他信息。以下是一些链接,可以帮助您与一些最常见的云提供程序一起配置负载均衡器。
默认情况下,DreamFactory启用基于文件的缓存,但是您可以选择配置其他受支持的缓存解决方案之一,例如Redis。请查看以下链接以查看连接教程:
添加Redis缓存
DreamFactory的一大优势是它建立在Laravel之上,因此,您可以利用Laravel对共享缓存解决方案的支持等优势。这很棒,因为这意味着缓存解决方案已经在生产环境中进行了广泛的测试和验证。
要安装predis软件包,您只需导航到项目的根目录并执行以下命令:
$ composer require predis/predis
接下来,打开您的.env文件,并查找以下部分:
## CACHE_DRIVER options: apc, array, database, file, memcached, redis
CACHE_DRIVER=file
Change CACHE_DRIVER to:
CACHE_DRIVER=redis
接下来,向下滚动并通过删除这些取消注释行#
,然后更新CACHE_HOST
,CACHE_PORT
和(可选)CACHE_PASSWORD
,以配合您的Redis环境参数:
## If CACHE_DRIVER = memcached or redis
#CACHE_HOST=
#CACHE_PORT=
#CACHE_PASSWORD=
最后,向下滚动到以下部分并取消注释CACHE_DATABASE
和REDIS_CLIENT
:
## If CACHE_DRIVER = redis
#CACHE_DATABASE=2
## Which Redis client to use: predis or phpredis (PHP extension)
#REDIS_CLIENT=predis
您可以将CACHE_DATABASE设置为2。REDIS_CLIENT
如果已安装predis / predis软件包,则可以将其设置为predis(推荐)。默认情况下,您的Redis数据库将为0,因此请确保SELECT
无论您将数字设置为CACHE_DATABASE
等于多少。然后,您可以开始查看KEYS
填充。
负载均衡DreamFactory环境
您可以使用负载平衡器在多个服务器之间分配API请求。负载平衡器还可以执行运行状况检查,并自动从池中删除运行不正常的服务器。大多数大型服务器体系结构在整个基础架构中的多个位置都包含负载平衡器。您可以对负载均衡器进行群集以避免单点故障。DreamFactory是专门设计用于与负载平衡器和所有各种调度算法一起使用的。REST API请求可以随时发送到任何一台Web服务器并以无状态方式处理。
使用OPcache编译DreamFactory代码
通过使用OPcache编译DreamFactory应用程序代码,可以实现特别高的性能。下列
第三方资源
- “ NGINX食谱:用于高性能负载平衡的高级食谱”:这份175页的指南提供了有关NGINX扩展的深刻见解和具体解决方案。
- Amazon EC2成本计算器:该计算器可以帮助您浏览AWS众所周知的不透明EC2实例定价模型。
结论
这些只是一些技巧,旨在帮助您确保DreamFactory环境以峰值容量运行!如果您还有其他想法,请将其发送至dreamfactory.com上的代码!