这几天对比了一下图片服务器的实现,有一些结论和问题可以跟大家分享和讨论一下。
总共做了两组对比:
一:nodejs搭建静态文件服务器、expressjs搭建静态文件服务器、直接用nginx做静态文件服务器 测试环境:Localhost
主要做了ab测试对比RPS(即Request per second,每秒钟的处理请求数,它的倒数即为每个请求的平均时间)。nginx的静态文件性能优势十分明显。
具体是实现出来的性能排列为——nginx > nodejs > expressjs。
二、expressjs从数据库读取二级制文件、nginx静态文件服务器对比、expressjs静态文件服务器。
测试环境:Dell OPTIPLEX 380 (4G内存 E7500@2.93GHz win7 64bit) (存放图片的数据库、expressjs服务器、nginx均在本地同一台物理机上,且都是空载只是端口不同) 使用笔记本在局域网进行ab测试,主要测试RPS,测试图片大小为276kB(尺寸:600x800)。 测试命令为:
(数据库) ab -c 500 -n 500 http://***ip隐去**/uploadimg/4f7994df3b0731bc86000001
(nginx) ab -c 500 -n 500 http://***ip隐去**:3000/image/1.jpg
(expressjs)ab -c 500 -n 500 http://***ip隐去**:3100/images/1.jpg
-c :同一时间的并发请求数 -n :请求的总数量
以上三种命令均执行100次,测试结果如下。
从结果的平均值和大概趋势来看,性能排列为:
蓝色 > 红色 > 绿色
expressjs从数据库读取Mongo Binary Data > nginx静态文件服务器 > expressjs静态文件服务器。
对应均值为(r/s):33.1865 > 31.5115 > 30.0971 。多数情况下,蓝色的实现方法略好于红色。
结论:尽量不要用nodejs和expressjs做纯静态文件服务器,这样会增加server的负担导致性能下降。
问题:从上面的结果来说是否expressjs从数据库读取Mongo Binary Data 显示成图片的性能好于 nginx静态文件服务器 ? 我怀着疑问的态度,尝试了一下直接在nginx所在的物理机上即服务器本地上做了同样的ab测试。
从结果来看,两个平均值基本相同都在192左右(蓝色192,红色194.6)。但是蓝色(从数据库读取图片的性能)非常不稳定,相对于前面的结果出现了如此反常的状况。随即我做了第二次测试来验证这种不稳定问题。
结果如下:虽然结果仍不稳定但是测试的rps均值蓝色为228.5要高于红色的193.8很多。
结论:从数据库读图的性能虽然不稳定,但是性能略优于目前的直接用nginx做静态服务器的性能。
问题:具体原因还没有好的解释。网上也有人这样做,说存数据库中确实会比静态文件服务器并发性能高一些,但是可能随着数据库的快速增长降低数据库的性能。不晓得这种问题是否客观存在,如果存在是否有好的解决办法?目前的结论和想法都还比较粗糙,欢迎讨论和指导。
主要代码实现为:
if (method == 'get') {
db.findImg(req.params.id,function(err,one){
if(err) throw err;
if(one){
res.contentType(one.contentType);
res.end(one.image.buffer);
}
});
}