最初,我在ServerFault发布了这个...但也许这更像是一个PHP语言问题。
我的服务器配备双Xeon四核L5420,运行频率为2.5GHz。我一直在优化我的服务器,并且已经到了我最后的瓶颈:PHP。
我非常简单的PHP脚本:
./ test.php的
<?php print_r(posix_getpwuid(posix_getuid()));
我不那么科学 - 因为 - 他们 - 不要注意线程锁定 - 但是科学 - 足够 - 给我一个合理的多线程请求 - 第二结果脚本:
./基准的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
./真-基准的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个请求。
在Drupal的sqlite或mysql驱动的实例上运行相同的脚本会返回~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
答案 0 :(得分:14)
Drupal Core(未优化,未缓存,没有APC,每秒性能/页面浏览量非常糟糕)。
长话短说。使用Varnish或其他一些反向代理缓存。
总的来说,非常令人印象深刻。我每秒可以处理的页面请求数量增加了167407.84%。Start: 0.51
End : 854.29
以下是性能差异和
以下是我帖子中显示不同数字的相关摘录。
运行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)
然后我重复测试,但启用了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)
如您所见,这明显更好。但仍然糟糕。每秒1个请求!?大声笑。这太可怕了。
然后我启用了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
所以现在我每秒最终收到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)
总的来说,非常令人印象深刻。我在每秒可以处理的页面请求数量上增加了 167407.84%的百分比。
Start: 0.51
End : 854.29
另外,我将每个请求的页面加载时间从1978ms减少到1.17ms(同时),这是... 很多的整体速度增益。速度降低了99.94%。哎哟。