前言:
这篇文章来自Google Group的一个问答,作者是@keztoo,由本人@lwhile将其翻译成中文.
转载的时候请注明来源.
以下是@keztoo对问题"一个能进行SQL查询和模板渲染功能的tornado实例,每秒能处理的请求数需要多大"的回答内容
每一天有86400秒,如果每秒能处理一个请求的话,那么一天就能处理86400个请求.如果把处理的能力增加10倍,即每秒能处理10个请求,那么一天下来就能处理的数量就达到了864000(接近100万).如果每秒能处理100个请求的话,那么将会是一个不错的开始.然后不幸的是,用户的请求并不会均匀得在24小时中分布,而是有可能同时挤在某个时刻到来,这可以会影响到你的服务.
在你的案例中(#译者注:指提问者的案例),其他需要考虑的因素还有传送的数据大小(如1k的页面,10k的页面,或者100k的页面等等),以及你的SQL语句消耗的时间.我个人倾向于使用面向服务的架构,将SQL请求传送到服务集群中去,再由相应的服务进行SQL访问.
假设有一个线程处理串行到达的请求(这里只是为了进行性能分析,和实际可能会不一样),这就意味着在一个线程中你每秒能处理40个请求左右(假设每个请求用时25ms).在这个基础上,你的tornado处理每个请求的时间越短,你的每秒请求处理数将超过40越多.
通常来说,限制因素是页面的传输带宽和前端的处理能力.假设你要传输的页面每页大小是100k,带宽是10mbs,那么你一秒能传送的页面数为10页(记住100k的单位用的是bytes,mbs用的单位是bits,它们之间的转换比大约是10:1,(#译者注:确切来说是8:1)).换句话说,你能撑得住10个用户的并发访问.
假设你的服务跑在一个具有无限带宽的云服务器上,并且忽略前端带宽(#译者注:这里是指服务器的带宽和客户的带宽),把注意力都放在服务平台上,这时候每个tornado实例每秒能处理40-100个请求.而且通过Nginx对几个并行运行的tornado实例做负载均衡,你还能很容易增加这个数字.写到这里我们可以算出:
使用1个前端代理和1个服务实例,每秒能处理25个请求
使用2个前端代理和2个服务实例,每秒能处理40个请求
使用4个前端代理和16个服务实例,每秒能处理80个请求
使用8个前端代理和32个服务实例,每秒能处理125个请求
我们来看看我上面讲的内容错了哪些地方(举例来说,我们的数据库有时候会发起长连接,这个被忽略了).所以,当我说使用8个前端代理和32个服务实例,每秒能处理125个请求时,我指的是只在一个1GHZ,380mb的机器上,我们只启动一个Nginx实例,做前端和后台的负债均衡,32个后端实例和8个tornado实例(很明显每个实例都拥有一个端口)(#译者注:这里不大理解,如果你看了原文知道意思请评论给我).在1GHZ的云服务器上,这很有可能导致负载过大.但就如我前面所说,我们现在只是为了做分析.到目前为止,我们在一台很小的机器上每秒能够处理100个请求了.我在做运行测试时(在一台很小的家用云服务器上),这个数字能接近我所期待的,大约500-700这个级别,我觉得这对于单台服务器来说已经很不错了.
总结:
如果你想要支撑住每日一百万级个请求,你至少得持续每秒处理10个请求.这可能只需要一台小小的服务器而已.
希望能对你有所帮助.