我们有一个基于 imagemagic 的用 Code Igniter 编写的 PHP 图像 API。我们有 nginx/php-fpm 背后的 API。我们知道 Imagemagic 部分很重,但我们试图使整体吞吐量越来越高。
我们阅读了 30 多篇关于 Nginx 的优化文章。通过主要遵循文章并进行 TCP 优化,我们能够将输出从 300 个请求/分钟提高到 350 个请求/分钟。
这严重影响了服务器的加载时间。我可以告诉你没有平均负载,因为这是一个新机器,并且它基于 Nginx。我们过去有 Apache 工作器(每分钟不到 300 个请求)。现在每分钟有 350 个请求,平均负载为 20。这太多了,我们正在寻求改进。
当我们使用 htop 调查进程时,通常我们会看到大约 20 个 php-fpm 进程大量使用所有 16 个 CPU,并且内存占用为 24GB 中的 2GB 左右。
我们的目标是大幅减少系统负载。我希望有经验的用户能够分享他们的知识,比如在哪里查找、尝试什么。我会发布您要求的任何数字,但我不想一开始就用这个来填满整个帖子。
您将如何减少系统负载但仍保持吞吐量?
答案1
既然我们已经确定这是一个纯粹的 CPU 占用问题(没有 iowait),那么我真的看不出有什么方法可以在不添加更多资源的情况下保持相同的吞吐量。要么调低 PHP 进程的最大数量,要么添加更多 CPU 核心。
或者让开发人员使用 ImageMagick 以外的其他东西。
答案2
如果有重复的请求,您可以检查 fastcgi 缓存(http://wiki.nginx.org/HttpFastcgiModule)或者在nginx前面使用varnish。
这将使您能够缓存已处理的图像,而不必再次执行繁重的 CPU 进程。
答案3
由于您的问题指出 PHP-FPM 进程位于 TOP CPU 中,因此我想象您正在使用 ImageMagick PHP 库(http://php.net/imagick)。
让您的开发人员测试直接由 ImageMagick 二进制文件完成图像处理的场景(例如 /usr/bin/[compare, import, display ...]。
如果直接使用二进制文件有效,则使用 php 函数 exec() 并封装对 ImageMagick 二进制文件的调用,并查看其进展情况(就 CPU 和持续时间而言)。
@附加信息:https://stackoverflow.com/questions/4323672/how-do-i-get-imagemagick-installed
答案4
开发人员方式
- 尝试减少图像处理的 php 开销。
- 尽量少用资源进行图像处理。使用准备好的图像或更改一些对性能要求较低的操作
管理方式
- 使用更强大的 CPU