php / php/php-src

Windows IIS FastCGI Spin-Up Performance Slowdown

未关闭
#12,778 3 条评论 3 个 reaction 已指派 0 人 在 GitHub 查看

@ndossche 已经在做这个了。

开始于 2023年11月25日。

  • #12784 来自 @ndossche —— 未关闭
Bug OS: Windows SAPI: cgi Status: Verified
主要语言
C
星标
40.4k
派生
8.2k
平均合并
2 天 13 小时
30 天内合并 PR
96

描述

Description

Default Form:

The following code:

<?php
$obj = array("loaded"=>microtime(true),"version"=>phpversion());
# Sleep in order to ensure new fastcgis spin up with provided Powershell Script.
sleep(2);
echo json_encode($obj);
?>

Resulted in this output:
2-3 times slower fastcgi spin up time versus older versions.

{"loaded":<epoch micro time>,"version":<php version>}

But I expected this output instead:
Similar FastCGI Spin up times to older versions

{"loaded":<epoch micro time>,"version":<php version>}

Deeper Description:

Observed Behavior

Starting at about PHP 8.1.2, The amount of time it takes the php-cgi.exe to spin up once called by IIS' w3wp process has doubled to tripled based on tests I have done. With bare-bones PHP code and Out-Of-Box ini configs, the load times for my local tests have gone from ~.05 seconds for pre PHP 8.1.2 to ~.10-.15 seconds. It's almost unnoticeable but it does leave a possibility of IIS having a higher chance to enter a race condition where it spend too much time spinning up the FastCGI instances versus handling the incoming requests during a sudden influx of traffic.

Testing Conditions

I threw the above PHP script on an IIS server and measured when PHP was able to microtime itself with older versions versus 8.1.2+ versions. My powershell script would timestamp itself, call the page with no FastCGIs running, and then calculate the difference. It was easier to see this performance difference when I ran these requests in parrallel in order to spin up more than just 1 FastCGI at a time. I was also able to get some performance back by disabling opcache, so not sure if that hints at any possible clues.

Restart-WebAppPool "<YourAppPoolHere>"
sleep 5

workflow FastCGIParallel {

  param(
    [string]$url,
    [int]$parallelCount = 10
  )

  foreach -parallel ($x in 1..$parallelCount) {

#MicroTimestamp Powershell.
$local_time =((Get-Date).ToFileTime() / 10000000 - 11644473600)

#Call the php script.
$response = Invoke-RestMethod -Method Get  $url

#Calculate the two timestamps.
$diff = $response.loaded - $local_time

#Output version of PHP (For Sanity Checking).
$version = $response.version

#Echos data to console.
"Load_Time : $diff |Version : $version"
    
  }
}

FastCGIParallel "<YourIISURLHere>" -parallelCount 10 

Visual Studio CPU Performance Analysis for "Hello World" Script
image
Disclaimer

This is my first bug report to PHP so please feel free to critique my submission and suggest corrective actions. I spent a good amount of time trying to make sure this wasn't something I was messing up on my end, but I do believe that there is still room for me to make a mistake here if I am overlooking something.

PHP Version

PHP 8.1.2+, 8.2.0+

Operating System

Windows IIS - Server and Desktop

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

首先查看链接的 pull request #12784,然后使用提供的 PHP 脚本和 PowerShell 并行工作流,在 Windows IIS 上重现 PHP 8.1.2+ 的 FastCGI 启动时间。比较较旧的 PHP 版本,以及启用和禁用 opcache 时的运行结果;完成的标准是识别并解决回归问题,同时保持可比的启动性能。

由索引模型根据 Issue 内容生成。

评估

技术栈
php, powershell
领域
backend, operating-systems, performance
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
需要澄清
新手友好度
25/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。