图片服务器实现方式的讨论
发布于 10 年前 作者 tank00 9152 次浏览 最后一次编辑是 5 年前

这几天对比了一下图片服务器的实现,有一些结论和问题可以跟大家分享和讨论一下。

总共做了两组对比:

一: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次,测试结果如下。

enter image description here

从结果的平均值和大概趋势来看,性能排列为:

                            蓝色                               >           红色                   >  绿色
    expressjs从数据库读取Mongo Binary Data > nginx静态文件服务器  > expressjs静态文件服务器。

   对应均值为(r/s):33.1865 > 31.5115 > 30.0971 。多数情况下,蓝色的实现方法略好于红色。

结论:尽量不要用nodejs和expressjs做纯静态文件服务器,这样会增加server的负担导致性能下降。

问题:从上面的结果来说是否expressjs从数据库读取Mongo Binary Data 显示成图片的性能好于 nginx静态文件服务器 ? 我怀着疑问的态度,尝试了一下直接在nginx所在的物理机上即服务器本地上做了同样的ab测试。 enter image description here

从结果来看,两个平均值基本相同都在192左右(蓝色192,红色194.6)。但是蓝色(从数据库读取图片的性能)非常不稳定,相对于前面的结果出现了如此反常的状况。随即我做了第二次测试来验证这种不稳定问题。 enter image description here

结果如下:虽然结果仍不稳定但是测试的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);
		}
	});
}
6 回复

弱问一句: 图是怎么生成的?

excel。。。。。

没人回复,没人讨论啥的么?

并发数再大些呢

持学习态度, 希望楼主能够找到一种比较好的解决方案,支持支持 ………………

回到顶部