天天看点

小网站架构优化:从100并发抗到4000并发

前言:

小网站架构优化:从100并发抗到4000并发

很久前,在512m内存+access的vps里,写过了一个经典的秋色园技术原理解析系列。

后来的某一天,换上了1g内存+mssql2000,秋色园又跑过了一个多年头。

秋色园的架构,基本上从简单到复杂最后又回归简单,不断做着减法,去掉了好多以前用于减轻负载的算法,包括aop+sqlite分压和文本分压等机制,还有一些缓存式算法。

好多时候,硬件不给力,这时候就会被逼着把整个系统架构复杂化。

一当硬件给力时,系统轻装上阵,架构可以更简单。

因为本质就是请求+返回(硬件能加速的,软件就不用搞太多算法了)。

小网站架构优化:从100并发抗到4000并发

下面在分享一下我记忆中还记得的秋色园关于负载测试的起缘:

1:某天,我发现秋色园cpu经常会跑满100%:

小网站架构优化:从100并发抗到4000并发

经过一年的岁月,不知觉的最终被我发现是搜索引擎引发的(虽然写过iis日志分析工具,但是我自己都很少用,几乎没怎么用,一用没想到找到问题了)。

我发现秋色园的关键字(tag),由于是直接链接到搜索,而搜索这块是全表的like搜索,没做缓存的优化,所以搜索引擎心情好时就把它弄挂菜了。

小网站架构优化:从100并发抗到4000并发

2:某天,某人用几百个并发,把秋色园又搞到cpu百分百了:

小网站架构优化:从100并发抗到4000并发

我很疑惑,秋色园几乎都是半静态+缓存,除了队列缓存式更新访问计数,和除了后台,不可能顶这点并发就挂了。

通过查看iis日志,我从日志里发现,是由于url引发的:

由于秋色园是根据url缓存的,对方的并发通过在url后面补充一些随机参数,导致每次请求的url都不一样,结果系统每次会重新读取并生成html,导致cpu飘起来。

解决方法就是重整所有的url链接和对应的缓存机制了。

小网站架构优化:从100并发抗到4000并发

3:某天,我也玩起了负载工具,自己时不时的把秋色园弄到cpu百分百.

下面分享下,在负载推力下,对秋色园后续折腾的几个优化方案:

经过不断的负载测试,秋色园顺路把一些常见的优化手段也用上了:

1:分离静态资源域名:static.cyqdata.com

小网站架构优化:从100并发抗到4000并发

架构处理过程:

1:把模板加载和图片处理的,都给处理到另一个域名。

2:新开一个网站,绑定static.cyqdata.com域名,位置仍指向原来的位置。

3:由于是静态站点,可以关掉和.net无关的所有东西。

这样变化后,图片的负载就是天与地的变化:

如果没有分离出来,仍经过.net解析后再返回图片,测试1-2千个并发cpu就近满了。

经过分离,关掉和.net相关的资源后,跑了5000以上并发,cpu和内存也没怎么动静。

主要自己三台机最多只上到这5k左右的并发数,不能往上再测试,但是差距已经很明显了。

小网站架构优化:从100并发抗到4000并发

2:http 304:这是客户端缓存的应用:

除了服务器缓存,客户端缓存也是另一个重点,除了一些静态数据处理缓存,动态数据也适时用上304。

如:秋色园上有一些动态的文件“下载次数”:

小网站架构优化:从100并发抗到4000并发

一般的程序,文件下载都是和文章内容分开的,单独提供下载。

如上,我需要在文章内容里提供下载,又要考虑下载次数机制,用上了图片机制,通过动态一个请求返回了图片资源。

由于下次数次实时性不强,而且变化少,通过来点手段,也可以304缓存。

3:关掉不常用的modules:

小网站架构优化:从100并发抗到4000并发

如果你重写过url,或看过秋色园技术原理解析关于url重写这块文章,下面代码应该会熟悉:

通过调试,看下图:秋色园的modules只剩下3个,那时因为其它的没用的都关掉了。

本来session模块也是要关掉,突然发现oauth2里用到了,就保留了。

看下图还会发现一段注释的for语句,是打印出默认系统带的十几个moudules。

小网站架构优化:从100并发抗到4000并发
小网站架构优化:从100并发抗到4000并发

关掉也很简单,web.config配置:

小网站架构优化:从100并发抗到4000并发

    <httpmodules>

      <add name="urlrewrite" type="web.urlrewrite.urlrewrite,web.urlrewrite" />

      <remove name="outputcache" />

      <!--<remove name="session"/>-->

      <remove name="windowsauthentication" />

      <remove name="formsauthentication" />

      <remove name="passportauthentication" />

      <remove name="rolemanager" />

      <remove name="urlauthorization" />

      <remove name="fileauthorization" />

      <remove name="anonymousidentification" />

      <remove name="profile" />

      <remove name="errorhandlermodule" />

      <remove name="servicemodel" />

      <!--<remove name="urlrewrite"/>-->

      <!--<remove name="defaultauthentication"/>-->

    </httpmodules>

小网站架构优化:从100并发抗到4000并发

4:尽早关闭数据库链接:

以前喜欢这样写代码:

小网站架构优化:从100并发抗到4000并发

using (maction action = new maction(u_qblogfileenum.blog_file))

            {

                action.setselectcolumns(files.id, files.hits, files.filepath);

                if (action.fill(id))

                {

                   document.load(action.data);

                   。。获取数据库数据处理一些业务逻辑显示到界面。 

                }

            }

小网站架构优化:从100并发抗到4000并发

这种坏习惯,导致数据库链接会根据业务的时间延长了关闭链接,导致并发性能下降,平时看不出来。

改进:

小网站架构优化:从100并发抗到4000并发

mdatarow row;

                   row=action.data;

if(row!=null)

{

document.load(action.data);

。。获取数据库数据处理一些业务逻辑显示到界面。

}

小网站架构优化:从100并发抗到4000并发

把逻辑放到外面,提前关闭链接后再去处理事情,并发时性能会提升不少。

5:web园的抗并发能力:

小网站架构优化:从100并发抗到4000并发

基于不断的优化改进,秋色园从100个并发挂菜-》基本优化-》到1000个并发挂菜-》经过架构调整优化-》抗到2000个并发左右。

最后,还有一个招,就是iis的web园,通过允许的设置了2个进程,发现能抗到4000并发,虽然cpu接近100%,但仍能正常访问,可见web园的确是个奇招。

开启web园,意味着多进程负载,当然session默认的模式就不能用了。

小网站架构优化:从100并发抗到4000并发

如上所说,同样的硬件配置:从100个并发,到4000个并发,改动并不多,路也并不长,但是常人又知多少。

以上的服务器环境,都是美国vps 10m带宽cpu双核,配置如下:

小网站架构优化:从100并发抗到4000并发

6:如何对网站进行负载测试:

后话:

硬件能顶半边天:一台好的服务器,程序写的烂一点,不做任何优化,也能跑的潇潇洒洒。

软件能顶半边天:好的优化机制和架构,穷的服务器也能跑个安安稳稳。

现实时,只有超过了那半边天,你才会去想另一半的重要性。