[php-src] Issue #12778: Windows IIS FastCGI Spin-Up Performance Slowdown

From: Date: Sat, 25 Nov 2023 00:35:15 +0000
Subject: [php-src] Issue #12778: Windows IIS FastCGI Spin-Up Performance Slowdown
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-245891@lists.php.net to get a copy of this message
Issue: https://github.com/php/php-src/issues/12778 Author: djvierus ### Description ## Default Form: The following code: ```php <?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. ```powershell 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 <img width="1723" alt="image" src="https://github.com/php/php-src/assets/49501310/9b6ee690-6b40-4232-8c28-7d0c320f9a85"> ### 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

« previous php.bugs (#245891) next »