performance - 如何配置 IIS-10 和 FastCGI 以实现高并发?
问题描述
场景:我们有一个通过 FastCGI 使用 IIS10 的 php 7 Web 应用程序。我们对我们的应用程序进行了性能测试,发现速度变慢了。我们排除了数据库层。我们查看了 IIS 服务器,即使在负载很重的情况下,当应用程序显着减速时,资源也不会紧张……没有 CPU 峰值没有 RAM 峰值。进一步挖掘我们得出的结论是,所有进来的请求都只是在排队。当一些请求需要更长的时间(对于一些需要 1-3 分钟的非常大的报告),那么每个其他请求都会排队等待第一个请求通过。
所以,问题是:我们在哪里寻找增加 IIS 一次可以处理的并发请求的数量?
我在 FastCGI 下找到了这些设置,但文档很少。有人可以解释这四个设置的作用吗?
- 实例 MaxRequests
- 最大实例
- 队列长度
- 每分钟快速失败
我们应该在 DefaultAppPool 下查看其他设置吗?
- 队列长度
- 最大工作进程
- 回收
更新:应该为其他可能搜索此内容的人澄清一些事情:
- 此上下文中的请求意味着从浏览器到 IIS 服务器的一次调用
- 我们使用 jmeter https://jmeter.apache.org/做一些基本的负载测试
- 从浏览器到 IIS 服务器的请求(为了这个上下文)将像这样处理:浏览器 > DefaultAppPool 工作进程(在 IIS 中默认为 1,如果你想增加这个,请查看网络花园)> FastCGI 实例(想想其中作为进程线程,语言很棘手,网络上的人们可以互换使用线程/进程/实例,这可能会造成混淆)。FastCGI 默认为 4。所以这意味着当 5 个并发请求通过时,它们都将通过 1 个 DefaultAppPool 工作进程汇集,5 个中的 4 个将由 FastCGI 并发处理,第 5 个将排队。我们对此进行了测试:在 IIS 重新启动后,不会有 w3wp.exe 或 php-cgi.exe 进程在运行。当 5 个并发请求进来时: w3wp.exe 将启动并生成 4 个 php-cgi.exe 进程(检查任务管理器)
- 为了增加并发性,我们将 FastCGI “Max Instances”设置为 0,这允许 IIS 根据可用资源决定它想要处理的数量,但您也可以将其设置为特定的更高数字。我们对此进行了测试,我相信它是准确的。您可以看到 w2wp.exe 进程和 php-cgi.exe 进程的数量随着请求的进入而增加。
- 您还应该能够增加 DefaultAppPool 工作进程,如果您将其设置为 4 并将 FastCGI 实例也保留为 4,这应该意味着,理论上,每个工作进程总共会产生自己的 4 个 FastCGI 实例4x4=16 个并发请求。我还没有进行充分的测试,以确保 100% 这就是实际的结果。
解决方案
Instance MaxRequests:控制 FastCGI 进程回收行为。指定 FastCGI 应用程序在进程被回收之前允许处理的最大请求数。默认值为 200。
Max Instances:指定所选 FastCGI 应用程序在应用程序进程池中允许的最大 FastCGI 进程数。此数字还表示 FastCGI 应用程序可以处理的最大并发请求数。默认值为 4。
队列长度:指定为 FastCGI 应用程序池排队的最大请求数。当队列已满时,后续请求会向客户端返回 HTTP 错误代码 503(服务不可用)。此错误代码表示应用程序太忙。默认值为 1000。
Rapid Fails PerMinute:指定对应用程序的请求所允许的最长时间。如果一个 FastCGI 进程在单个请求上花费的时间超过了指定的时间,它就会被终止。默认值为 90 秒。
应用程序池:
队列长度:向 HTTP.sys 指示在拒绝未来请求之前要为应用程序池排队的请求数。默认值为 1000。
最大工作进程数:指示将用于应用程序池的最大工作进程数。
Recycling中的属性可以参考这个链接:
推荐阅读
- php - PSR-15 中间件:是否期望中间件 *instance* 可以重复用于不同的请求?
- amazon-web-services - 从 AWS 拉取 docker 映像时,设备上没有剩余空间
- eclipse - 如何在 Talend Open Studio 中添加 maven 依赖项
- angular - 在 Angular 旁边安装 wordpress
- python - Boto3 - 我可以使用排序键以变量开头的 batch_get_item 获取项目吗?
- database - 是否可以将单独的数据库连接到 wordpress 中的多个用户?
- python - 以随机方式一个一个地获取所有对象
- c# - 来自 MongoDB C# API 的 InsertMany 不返回已确认
- python - 如何使用 Beautiful soup 找到其中没有兄弟姐妹的 P 标签
- karate - 空手道 - 无法在循环中运行动态场景大纲