我正在构建一个 REST 服务,我期待很多请求(甚至是 DoS 攻击)。那么考虑网络和 CPU 消耗,哪种 HTTP 方法更适合我的服务器(接受 POST 或 GET)?
我做了一些测试......使用 VM Ubuntu 14.04(1 核)作为服务器,使用 apache 和 php
获取.php:
$s = "G: ";
foreach ( $_GET as $key => $val){
$s .= $val . ", ";
}
echo $s;
Run Code Online (Sandbox Code Playgroud)
后.php:
$s = "P: ";
foreach ( $_POST as $key => $val){
$s .= $val . ", ";
}
echo $s;
Run Code Online (Sandbox Code Playgroud)
测试 #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
Run Code Online (Sandbox Code Playgroud)
我多次运行 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"
Run Code Online (Sandbox Code Playgroud)
mmmmm 与 wget 测试.... GET 更快:
...
TIME POST: 54.707362313
TIME GET: 53.049255400
Run Code Online (Sandbox Code Playgroud)
哪种 HTTP 方法的性能更好?
我应该关心它吗?
我应该期待 nginx 或 nodejs (expess) 的不同结果吗?
小智 5
在处理 api 时,我认为现在大多数开发人员都习惯于使用 RESTful 接口。所以这不是什么更快的问题,而是请求的目的是什么。因此,当您说您正在构建 RESTful api 时,有一些规则会取代您提出的问题。也就是说,速度问题无关紧要。
http://en.wikipedia.org/wiki/Representational_state_transfer
就您发布的结果而言,GET 移动的数据较少,并且应该总是更快一些。
| 归档时间: |
|
| 查看次数: |
16458 次 |
| 最近记录: |