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

简介:

前言:


很久前,在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。

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

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

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

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

3:关掉不常用的Modules:

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

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

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

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

05179.jpg

关掉也很简单,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双核,配置如下:

49176.jpg

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

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

后话:

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

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

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






     本文转自cyq1162 51CTO博客,原文链接:http://blog.51cto.com/cyq1162/1198761 ,如需转载请自行联系原作者







相关文章
|
2月前
|
机器学习/深度学习 数据采集 人工智能
揭秘!47页文档拆解苹果智能,从架构、数据到训练和优化
【8月更文挑战第23天】苹果公司发布了一份47页的研究文档,深入解析了其在智能基础语言模型领域的探索与突破。文档揭示了苹果在此领域的雄厚实力,并分享了其独特的混合架构设计,该设计融合了Transformer与RNN的优势,显著提高了模型处理序列数据的效能与表现力。然而,这种架构也带来了诸如权重平衡与资源消耗等挑战。苹果利用海量、多样的高质量数据集训练模型,但确保数据质量及处理噪声仍需克服。此外,苹果采取了自监督与无监督学习相结合的高效训练策略,以增强模型的泛化与稳健性,但仍需解决预训练任务选择及超参数调优等问题。
137 66
|
24天前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
2天前
|
安全 调度 虚拟化
探索现代操作系统的架构与优化
本文将深入探讨现代操作系统的核心架构和优化技术。从操作系统的基本定义入手,逐步解析其内核结构、进程管理、内存管理和I/O系统。同时,还将讨论现代操作系统在多核处理器支持、虚拟化技术和安全性方面的创新与优化措施。通过这些内容,读者可以全面了解操作系统的工作原理及其在实际应用中的表现与改进。
|
3天前
|
开发者 Docker 微服务
利用Docker Compose优化微服务架构
在微服务架构中,Docker Compose提供了一种简便有效的方法来定义和运行多容器Docker应用程序,通过YAML文件配置服务、网络和卷,实现一键创建和启动。这不仅确保了开发、测试和生产环境的一致性,还简化了团队协作和维护工作,大幅提升了开发效率。本文将详细介绍Doker Compose的核心优势、基本使用方法及高级功能,帮助你更好地管理和优化微服务架构。
|
7天前
|
存储 算法 Linux
探索现代操作系统的架构与优化
本文深入探讨了现代操作系统的核心架构及其性能优化策略。通过对主流操作系统架构的分析,揭示其在多任务处理、内存管理和文件系统等方面的特点。同时,针对当前技术趋势,提出一系列优化措施,旨在提升系统的运行效率和用户体验。通过实例分析,展示如何在实际场景中应用这些优化技术,确保系统在高负载下的稳定运行。
|
3天前
|
安全 数据安全/隐私保护 UED
优化用户体验:前后端分离架构下Python WebSocket实时通信的性能考量
在当今互联网技术的迅猛发展中,前后端分离架构已然成为主流趋势,它不仅提升了开发效率,也优化了用户体验。然而,在这种架构模式下,如何实现高效的实时通信,特别是利用WebSocket协议,成为了提升用户体验的关键。本文将探讨在前后端分离架构中,使用Python进行WebSocket实时通信时的性能考量,以及与传统轮询方式的比较。
16 2
|
5天前
|
存储 安全 数据安全/隐私保护
探究现代操作系统的架构与优化策略
本文旨在深入探讨现代操作系统的核心架构及其性能优化方法。通过分析操作系统的基本组成、关键技术和面临的挑战,揭示如何通过技术手段提升系统效率和用户体验。不同于传统的技术文章摘要,这里不罗列具体研究方法和结果,而是以简明扼要的语言概述文章的核心内容和思考方向,为读者提供宏观视角和技术深度。 生成
11 3
|
12天前
|
缓存 算法 安全
探索现代操作系统的架构与优化
本文旨在深入探讨现代操作系统的核心架构,并详细分析其性能优化策略。通过对操作系统的基本功能、主要组件以及它们之间的交互进行剖析,帮助读者理解操作系统在提高硬件资源利用率和用户体验方面所发挥的关键作用。此外,文章还将介绍几种常见的性能优化方法,包括进程调度算法、内存管理技术和I/O系统优化等,并通过实际案例展示这些优化技术的应用效果。
|
17天前
|
消息中间件 弹性计算 运维
云消息队列RabbitMQ 版架构优化评测
云消息队列RabbitMQ 版架构优化评测
33 6
|
14天前
|
人工智能 算法 安全
探索现代操作系统的架构与优化
本文深入探讨现代操作系统的核心架构及其性能优化技术。通过分析操作系统的基本功能和设计原则,阐述其在资源管理、内存分配及多任务处理方面的创新方法。进一步,文章将聚焦于如何通过内核调优、算法改进等手段提升系统效率,确保在高负载环境下的稳定性和响应速度。最后,讨论未来操作系统可能面临的挑战与发展趋势,为相关领域的研究和实践提供参考。