php / php/php-src

Windows IIS FastCGI Spin-Up Performance Slowdown

Ouverte
#12,778 3 commentaires 3 réactions 0 personnes assignées Voir sur GitHub

@ndossche y travaille déjà.

Depuis le 25/11/2023.

  • #12784 par @ndossche — ouverte
Bug OS: Windows SAPI: cgi Status: Verified
Langage dominant
C
Étoiles
40.4k
Forks
8.2k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par examiner la pull request liée #12784, puis reproduisez les temps de démarrage de FastCGI de PHP 8.1.2+ sur Windows IIS avec le script PHP fourni et le workflow parallèle PowerShell. Comparez les anciennes versions de PHP ainsi que les exécutions avec opcache activé et désactivé ; la tâche est considérée comme terminée lorsque la régression est identifiée et résolue, tout en préservant des performances de démarrage comparables.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
php, powershell
Domaine
backend, operating-systems, performance
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.