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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介:
前言:
复制代码
很久前,在512M内存+Access的VPS里,写过了一个经典的秋色园技术原理解析系列。
后来的某一天,换上了1G内存+MSSQL2000,秋色园又跑过了一个多年头。
之后,秋色园和  CYQ.Data,也在一直默默的优化和改进,只是没写什么文章分享分享。
秋色园的架构,基本上从简单到复杂最后又回归简单,不断做着减法,去掉了好多以前用于减轻负载的算法,包括AOP+SQLite分压和文本分压等机制,还有一些缓存式算法。
好多时候,硬件不给力,这时候就会被逼着把整个系统架构复杂化。
一当硬件给力时,系统轻装上阵,架构可以更简单。
因为本质就是请求+返回(硬件能加速的,软件就不用搞太多算法了)。
复制代码
 

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

 

1:某天,我发现秋色园CPU经常会跑满100%:
经过一年的岁月,不知觉的最终被我发现是搜索引擎引发的(虽然写过IIS日志分析工具,但是我自己都很少用,几乎没怎么用,一用没想到找到问题了)。

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

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

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

通过查看IIS日志,我从日志里发现,是由于URL引发的:
由于秋色园是根据URL缓存的,对方的并发通过在URL后面补充一些随机参数,导致每次请求的URL都不一样,结果系统每次会重新读取并生成Html,导致CPU飘起来。
解决方法就是重整所有的URL链接和对应的缓存机制了。
复制代码
 

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

 

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

 

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

 

1:分离静态资源域名:static.cyqdata.com
复制代码
架构处理过程:

1:把模板加载和图片处理的,都给处理到另一个域名。
2:新开一个网站,绑定static.cyqdata.com域名,位置仍指向原来的位置。
3:由于是静态站点,可以关掉和.net无关的所有东西。
这样变化后,图片的负载就是天与地的变化:
如果没有分离出来,仍经过.net解析后再返回图片,测试1-2千个并发CPU就近满了。
经过分离,关掉和.net相关的资源后,跑了5000以上并发,CPU和内存也没怎么动静。
主要自己三台机最多只上到这5K左右的并发数,不能往上再测试,但是差距已经很明显了。
复制代码
 

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

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

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

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

如上,我需要在文章内容里提供下载,又要考虑下载次数机制,用上了图片机制,通过动态一个请求返回了图片资源。
由于下次数次实时性不强,而且变化少,通过来点手段,也可以304缓存。
 

3:关掉不常用的Modules:

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

通过调试,看下图:秋色园的Modules只剩下3个,那时因为其它的没用的都关掉了。
本来Session模块也是要关掉,突然发现OAuth2里用到了,就保留了。
看下图还会发现一段注释的for语句,是打印出默认系统带的十几个Moudules。
关掉也很简单,web.config配置:
复制代码
    <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>
复制代码
 

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

以前喜欢这样写代码:
复制代码
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);
                   。。获取数据库数据处理一些业务逻辑显示到界面。 
                }
            }
复制代码
这种坏习惯,导致数据库链接会根据业务的时间延长了关闭链接,导致并发性能下降,平时看不出来。
改进:
复制代码
MDataRow row;
using (MAction action = new MAction(U_QBlogFileEnum.Blog_File))
            {
                action.SetSelectColumns(Files.ID, Files.Hits, Files.FilePath);
                if (action.Fill(id))
                {
                   row=action.Data;
                }
            }
if(row!=null)
{
Document.Load(action.Data);
。。获取数据库数据处理一些业务逻辑显示到界面。
}
复制代码
把逻辑放到外面,提前关闭链接后再去处理事情,并发时性能会提升不少。

 

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

最后,还有一个招,就是IIS的Web园,通过允许的设置了2个进程,发现能抗到4000并发,虽然CPU接近100%,但仍能正常访问,可见Web园的确是个奇招。
开启Web园,意味着多进程负载,当然Session默认的模式就不能用了。
复制代码
如上所说,同样的硬件配置:从100个并发,到4000个并发,改动并不多,路也并不长,但是常人又知多少。
以上的服务器环境,都是美国VPS 10M带宽CPU双核,配置如下:
 

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

分布式网站负载压力测试工具: 点击下载
 

后话:

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

软件能顶半边天:好的优化机制和架构,穷的服务器也能跑个安安稳稳。
现实时,只有超过了那半边天,你才会去想另一半的重要性。
版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:
http://www.cnblogs.com/cyq1162/archive/2013/05/13/3074980.html
相关文章
|
7月前
|
供应链 数据可视化 数据挖掘
1688运营自学全套流程,新店如何快速获得转化的指南!
新手入驻1688常因缺乏运营框架而难出单。本文系统解析平台搜索机制、流量布局与店铺成长路径,涵盖类目定位、双端差异化运营、产品矩阵搭建及三阶段进阶策略,助力商家快速掌握核心逻辑,实现高效成交。
|
10月前
|
Java 测试技术 Maven
灵码产品演示:Maven 示例工程生成
本演示展示如何通过灵码AI工具,零基础自动生成电商订单Java项目。基于Maven构建,结合SQLite数据库,实现从项目初始化、实体类创建、增删改查逻辑到单元测试的全流程自动化开发,并支持PlantUML架构图生成与企业级代码规范落地。
712 5
|
Shell 索引
shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)
shell变量 shell变量是指用一个特定的字符串去表示不固定的内容 1.变量的类型 1.1自定义变量 一般情况下不怎么使用环境变量,如果需要在其他文件中引入某个文件的变量则在脚本最开始的位置使用source 或者. 执行下该脚本即可
4449 0
shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)
|
存储 Java 数据建模
基于 SpringBoot+Vue 的网上图书商城管理系统(附源码,教程)上
基于 SpringBoot+Vue 的网上图书商城管理系统(附源码,教程)
|
机器学习/深度学习 人工智能 数据安全/隐私保护
Playground AI:免费绘画图像创作工具
Playground AI:免费绘画图像创作工具
3143 0
|
Web App开发
阿里云账号注册流程方法(图文教程)
购买阿里云服务器、域名或者其他云产品都需要阿里云账号,而且账号必须实名认证否则购买不了,云吞铺子分享账号注册流程方法及常见问题解答: 阿里云账号注册流程方法 1. 先打开阿里云官网www.aliyun.com 想要拥有阿里云账号有2中方式,一种是新注册账号,另一种可以使用淘宝、1688、微博、支付宝或者钉钉账号登录,如下图所示: 阿里云支持其他账号登录方式,目前支持:淘宝、1688、微博、支付宝或者钉钉账号登录,使用其他账号登录的好处就是账号好记,不用重新注册,如果使用已经通过实名认证的账号登录阿里云,阿里云会自动调用该账号的认证信息,免去实名认证流程。
6417 0
|
Android开发 Shell
Android--开机自启动(activity或service)
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/78223243 Android手机在启动的过程中会触发一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED(记得只会触发一次呀),在这里我们可以通过构建一个广播接收者来接收这个这个action。
2113 0
|
5天前
|
缓存 人工智能 安全
GPT-5.6 Terra与GPT-5.5性能实测:成本减半后的跑分对比与快速迁移指南
GPT-5.6 Terra 的定价为每百万 token 输入 2.50/输出 15。GPT-5.5 则是 5/ 30。Terra 的每一项费率,包括 $0.25/M 的缓存读取,都恰好是 GPT-5.5 的一半,因此在任何工作负载组合下,Terra 都固定 便宜 2.0x。以每天 10 万次请求、3K token 提示词计算,大约是 Terra 每天 2,000,GPT−5.5每天 4,000,即每月约 60,000对 120,000。问题在于:OpenAI 没有发布任何针对 Terra 的编码基准。那个著名的 91.9% Terminal-Bench 数字是 Sol 在 Ul