O PHP é mais lento do que deveria ser

4

Eu tenho um servidor com Dual Xeon Quad Core L5420 rodando a 2.5GHz. Eu tenho otimizado meu servidor e chego ao meu gargalo final: PHP.

Meu script PHP muito simples:

./ test.php

<?php print_r(posix_getpwuid(posix_getuid()));

Meu não-tão-científico-porque-eles-não-prestam atenção-para-thread-locking-mas-científico-suficiente-para-me-um-razoável-multithreaded-pedidos-per- Scripts de segundo resultado:

./ benchmark-php

#!/bin/bash
if [ -z $1 ]; then
  LIMIT=10
else
  LIMIT=$1
fi

if [ -z $2 ]; then
  SCRIPT="index.php"
else
  SCRIPT=$2
fi

START=$(date +%s.%N)
COUNT=0
while (( $COUNT < $LIMIT ))
do
  php $SCRIPT > /dev/null
  COUNT=$(echo "$COUNT + 1" | bc)
done
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
REQS_PER_SEC=$(echo "scale=2; $COUNT / $DIFF" | bc)
echo $REQS_PER_SEC

./ realmente-benchmark-php

#!/bin/bash
if [ -z $1 ]; then
  LIMIT=10
else
  LIMIT=$1
fi

if [ -z $2 ]; then
  THREADS=16
else
  THREADS=$2
fi

if [ -z $3 ]; then
  SCRIPT="index.php"
else
  SCRIPT=$3
fi

PIDS=""

echo '' > results
for thread in 'seq 1 $THREADS'; do
  ./benchmark-php $LIMIT $SCRIPT >> results &
  PIDS="$PIDS $!"
done

for PID in $PIDS; do
  wait $PID
done

RESULTS='cat results'
MATH="0"
for RESULT in $RESULTS; do
  MATH="$MATH + $RESULT"
done

echo "$MATH" | bc

O resultado da execução de ./really-benchmark-php 100 8 test.php é de 137 solicitações por segundo.

A execução do mesmo script em uma instância do Drupal ativada por sqlite ou mysql retorna ~ 1.5 req / s.

Eu tenho o APC e o mem_cache instalados e verifiquei que eles estão sendo executados nos padrões. (Sim, o enable_cli da APC também está ligado.) Alguém conhece a mágica "faça o PHP executar mais rápido"?

Eu tenho uma configuração de configuração alternativa (FPM / FastCGI) que serve ~ 140 req / s da instalação do MySQL Drupal ... como isso poderia ser possível se o próprio PHP não puder servir 2 req / s da linha de comando? ?

O resultado da ferramenta ab parece tão baixo para mim:

página estática: ab -n 1000 -c 100 http://x.x.x.x/ de solicitações por segundo: 683.71

test php: ab -n 100 -c 5 http://x.x.x.x/ Solicitações por segundo: 41.38

drupal-mysql: ab -n 100 -c 10 http://x.x.x.x/drupal/ de solicitações por segundo: 0,24

drupal-sqlite: ab -n 100 -c 10 http://x.x.x.x/drupal-test/ de solicitações por segundo: 4.92

    
por Caleb Gray 12.01.2012 / 23:20

1 resposta

4

Se você está lançando o PHP a partir da linha de comando, cada execução precisa carregar o interpretador PHP inteiro, todas as bibliotecas, arquivos, etc. necessários. Isso tem uma sobrecarga enorme.

Se o seu servidor web estiver configurado para fazer a mesma coisa, então a magia "tornar o PHP mais rápido" provavelmente está mudando para usar mod_php , FastCGI ou algo similar, o que permite que um único interpretador PHP atenda a múltiplas solicitações. (Observe que cada intérprete pode atender apenas a uma solicitação simultaneamente; a responsabilidade de lançar vários interpretadores PHP está no servidor da Web para mod_php ou o que quer que esteja iniciando sua ação FastCGI.)

    
por 16.01.2012 / 00:00

Tags