【发布时间】:2014-11-14 05:07:17
【问题描述】:
我正在构建一个 REST 服务,我期待很多请求(甚至是 DoS 攻击)。那么考虑一下网络和 CPU 消耗,哪种 HTTP 方法更适合我的服务器(接受 POST 或 GET)?
我已经做了一些测试...使用虚拟机 Ubuntu 14.04 (1 core) 作为服务器,带有 apache 和 php
get.php:
$s = "G: ";
foreach ( $_GET as $key => $val){
$s .= $val . ", ";
}
echo $s;
post.php:
$s = "P: ";
foreach ( $_POST as $key => $val){
$s .= $val . ", ";
}
echo $s;
测试#1(使用 ab):
ab -n 10000 'http://10.0.0.112/get.php?key1=val1&key2=val2&key3=val3'
Concurrency Level: 1
Time taken for tests: 9.080 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2080000 bytes
HTML transferred: 210000 bytes
Requests per second: 1101.33 [#/sec] (mean)
Time per request: 0.908 [ms] (mean)
Time per request: 0.908 [ms] (mean, across all concurrent requests)
Transfer rate: 223.71 [Kbytes/sec] received
ab -n 10000 -p post.data -T application/x-www-form-urlencoded 'http://10.0.0.112/post.php'
Concurrency Level: 1
Time taken for tests: 9.526 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2090000 bytes
Total body sent: 1860000
HTML transferred: 220000 bytes
Requests per second: 1049.72 [#/sec] (mean)
Time per request: 0.953 [ms] (mean)
Time per request: 0.953 [ms] (mean, across all concurrent requests)
Transfer rate: 214.25 [Kbytes/sec] received
我多次运行 AB 测试,结果相同:POST 更快,但 GET 更轻。所以我想在第二次测试中(更真实的)。
测试#2(使用 wget):
TIME_POST=0
TIME_GET=0
X1=100
X2=10
function fpost {
START=$(date +%s.%N)
i=0
while [ $i -lt $X1 ]
do
wget -q -O out.file 'http://10.0.0.112/post.php' --post-data 'key1=val1&key2=val2&key3=val3'
rm -rf out.file
i=$[$i+1]
done
END=$(date +%s.%N)
T=$(echo "$END - $START" | bc)
echo "POST: $T"
TIME_POST=$(echo "$TIME_POST + $T" | bc)
}
function fget {
START=$(date +%s.%N)
i=0
while [ $i -lt $X1 ]
do
wget -q -O out.file 'http://10.0.0.112/get.php?key1=val1&key2=val2&key3=val3'
rm -rf out.file
i=$[$i+1]
done
END=$(date +%s.%N)
T=$(echo "$END - $START" | bc)
echo "GET: $T"
TIME_GET=$(echo "$TIME_GET + $T" | bc)
}
j=0
while [ $j -lt $X2 ]
do
echo "#"$[$j+1]
fpost
fget
echo
j=$[$j+1]
done
echo "TIME POST: $TIME_POST"
echo "TIME GET: $TIME_GET"
mmmmm 与 wget 测试.... GET 更快:
...
TIME POST: 54.707362313
TIME GET: 53.049255400
哪种 HTTP 方法的性能更好?
我应该关心它吗?
我应该期待 nginx 或 nodejs (expess) 的不同结果吗?
【问题讨论】:
-
到目前为止的答案都很好,但你的问题是关于速度的。您可能比这里的其他任何东西都更能测试
ab和wget的速度; POST 和 GET 在速度上不应有任何固有的显着差异。