运行Drupal基准测试的PHP比它应该的要慢

Cal*_*ray 0 php bash benchmarking drupal

最初,我在ServerFault上发布了这个...但也许它更像是一个PHP语言问题.

我的服务器配备双Xeon四核L5420,运行频率为2.5GHz.我一直在优化我的服务器,并且已经到了我最后的瓶颈:PHP.

我非常简单的PHP脚本:

./test.php

<?php print_r(posix_getpwuid(posix_getuid()));
Run Code Online (Sandbox Code Playgroud)

我不那么科学 - 因为他们不注意线程锁定但科学足够给我一个合理的多线程请求每秒结果脚本:

./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
Run Code Online (Sandbox Code Playgroud)

./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
Run Code Online (Sandbox Code Playgroud)

运行的结果./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 req/s的MySQL Drupal安装......如果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

Lay*_*yke 14

Drupal Core(未优化,未缓存,没有APC,每秒性能/页面浏览量都很糟糕).

长话短说.使用Varnish或其他一些反向代理缓存.

总的来说,相当令人印 我每秒可以处理的页面请求数量增加了167407.84%.

Start: 0.51
End : 854.29
Run Code Online (Sandbox Code Playgroud)

这是性能和差异

以下是我帖子中显示不同数字的相关摘录.

测试1(获得起始基准)

运行apache基准测试

ab -k -n 100 -c 100 -g step1.txt http://example.com/how-it-works

好的,所以这个请求完全杀了我的服务器.见下图.

在此输入图像描述

因此,我决定减少请求,以便只计算每秒的沼泽标准请求.我有100个请求,并发2级并发.

并且出来了:

Concurrency Level:      2
Time taken for tests:   197.855 seconds
Complete requests:      100
Requests per second: 0.51 [#/sec] (mean)
Time per request: 3957.105 [ms] (mean)
Run Code Online (Sandbox Code Playgroud)

测试2启用APC

然后我重复测试,但启用了APC.

Concurrency Level:      2
Time taken for tests:   87.270 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Keep-Alive requests:    0
Total transferred:      2138900 bytes
HTML transferred:       2096300 bytes
Requests per second:    1.15 [#/sec] (mean)
Time per request:       1745.396 [ms] (mean)
Time per request:       872.698 [ms] (mean, across all concurrent requests)
Run Code Online (Sandbox Code Playgroud)

如您所见,这明显更好.但仍然很可怕.每秒1个请求!?大声笑.这太可怕了.

测试3 - 启用Drupal核心缓存

然后我启用了Drupal Core Caching ......并重复了apache基准测试

ab -k -n 100 -c 5 -g test2-c5-k.txt http://example.com/how-it-works

Concurrency Level:      2
Time taken for tests:   23.229 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Keep-Alive requests:    0
Total transferred:      1923002 bytes
HTML transferred:       1880900 bytes
Requests per second:    4.30 [#/sec] (mean)
Time per request:       464.580 [ms] (mean)
Time per request:       232.290 [ms] (mean, across all concurrent requests)
Transfer rate:          80.84 [Kbytes/sec] received
Run Code Online (Sandbox Code Playgroud)

所以现在我最终得到每秒4个请求.哪个明显更好,但仍然很糟糕.

最后一步,在混合中添加反向代理缓存应用程序.我想看到什么?我实际上并不在意,任何东西都必须比每秒4个请求更好.如果我能达到每秒约300个请求,那么我会很高兴.任何接近1000个请求的东西我都会欣喜若狂.

这就是我最终得到的结果:

Concurrency Level:      300
Time taken for tests:   11.706 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    10000
Total transferred:      190260000 bytes
HTML transferred:       185140000 bytes
Requests per second:    854.29 [#/sec] (mean)
Time per request:       351.168 [ms] (mean)
Run Code Online (Sandbox Code Playgroud)

总的来说,相当令人印 我每秒可以处理的页面请求数量增加了167407.84%.

Start: 0.51
End : 854.29
Run Code Online (Sandbox Code Playgroud)

另外,我将每个请求的页面加载时间从1978ms减少到1.17ms(同时),这是一个很大的整体速度增益.速度降低了99.94%.哎哟.

在此输入图像描述

在此输入图像描述