我有一台服务器,双Xeon四核L5420运行在2.5GHz.我一直在优化我的服务器,并且已经到了我最后的瓶颈:
PHP.
我非常简单的PHP脚本:
./test.PHP
<?PHP print_r(posix_getpwuid(posix_getuid()));
我不那么科学 – 因为他们不注意线程锁定但科学足够给我一个合理的多线程请求每秒结果脚本:
./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
./really-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
运行./really-benchmark-PHP 100 8 test.PHP的结果是每秒约137个请求.
在supite或MysqL驱动的Drupal实例上运行相同的脚本会返回~1.5 req / s.
我安装了APC和mem_cache,并且我已经验证它们是在默认情况下运行的. (是的,APC的enable_cli也开启了.)有人知道魔术“让PHP执行更快”的开关吗?
我有一个替代的配置设置(FPM / FastCGI),可以为140 Drqal安装提供~140 req / s …如果PHP本身甚至无法从命令行提供2个req / s,那怎么可能呢?
ab工具的结果对我来说感觉很低:
静态页面:ab -n 1000 -c 100 http://x.x.x.x/每秒请求数:683.71
测试PHP:ab -n 100 -c 5 http://x.x.x.x/每秒请求数:41.38
drupal-MysqL:ab -n 100 -c 10 http://x.x.x.x/drupal/每秒请求数:0.24
drupal-sqlite:ab -n 100 -c 10 http://x.x.x.x/drupal-test/每秒请求数:4.92