高并发处理

对以下文章内容我要说明下,在财大气粗的互联网公司或为财大气粗的客户服务的不缺钱的主,请立即绕行,以下内容不适合您。

以下内容为客户计算资源紧缺,预算紧缺,无法通过增大带宽,增多服务器,购买各种高级服务的程序员们进行讨论。

谢谢

对于如何提高应用程序的性能(无论是互联网应用还是企业级应用)我的观点一直是考虑一个核心:IO处理。因为我认为目前的CPU的处理能力已经是非常高了,正常编写的在内存中处理的代码没有太严重的问题都不会对CPU造成很大的影响,性能往往是被IO所限制。由于我和我的团队沟通时间比较长,所以我们之间的一个简单的IO说明往往覆盖了很多的含义,这些IO包括了磁盘IO、网络IO、内存IO以及各种设备的IO处理。我们的团队经验是尽可能的在各种IO处理中寻找出可以提升的效率。

以下,我将从后向前说明我们团队在提升IO处理的经验和认识

1 数据库
数据库是最明显的消耗磁盘IO的组件,提高数据的性能有多种,SQL语句写的好,也是减少了表的扫描(明显是IO动作),设计合理的索引又是提高了IO处理能力,将不在变化的历史数据独立的存储也减少了复杂IO的处理,为表设计冗余的字段也是为了减少IO读写提高性能,将数据表分布在不同的磁盘上也是提升IO效率。还有其他的各种方式,比如查询缓存、连接池神马的,原则同样如此。

总之,减少数据库和磁盘之间过度的活动,能尽可能的提升数据库效率。

2 数据缓存
内存IO的处理效能自然要远高于磁盘IO,数据的缓存就是减少磁盘操作,或至少减少性能更低的数据库操作。对于页面的结果数据缓存我们的通常简单方案是准备两个缓存区:一个内存,一个文件
内存的缓存区,我们直接用HttpRuntime.Cache,在这个缓存区中我们放置特征码和数据(数据往往是页面需要的数据,一般我们放置JSON格式),过期策略上我们自然选择NoAbsoluteExpiration。
当数据需要从内存缓存区中被撤掉时,我们会将这个过期数据再次处理,我们在Cache中有一个集合,这个集合放置了被撤掉的缓存数据的特征码,而对应的数据写入磁盘上的一个文件中。
用户请求数据时,先检查特征码是否在正常的缓存中,如果不在,则检查是否在过期区,如果是过期区,则去读取磁盘文件(至少减少了数据库开销),都没有,那去查数据库吧。

3 对集合的代码处理
无论是页面的javaScript,还是后台的java,C#,在目前的业务中对集合/数组的操作肯定是最频繁的,考虑用一些细节上的优化,也可以提高性能

[csharp] view plain copy

  1. int[] arr = { 1, 3, 6, 7, 3, 6, 7, 3, 5 };
  2. for (int i = 0, max = arr.Length; i < max; i++)
  3. {
  4. System.Console.WriteLine(arr[i]);
  5. }

类似很多技巧都是减少对集合Length/Count的反复确认对高频的集合操作是有益的。当然集合中不能动态的加减数据。数组优先、泛型其次,arrayList最后考虑,这些选取的原因都是减少IO开销。
还有很多代码的细节都是可以提高效率,比如对string的认知什么的。
(林永坚MVP 提示我没有表达清楚以上意思,我的想法是:集合我的测试是,如果反复的判断count会比较慢,不如for的时候吧count先求出来,还有就是尽可能的用数组,因为数组初始化的时候已经赋值完毕了,且又是强类型,不知道我表达的对不)

4 网络传输
后台数据最终要传递给浏览器,减少网络传输的字节也是提高吞吐的重点,简单的说,就是对网络IO处理优化。减少webform中的ViewState信息,或者干脆不用webform,改用MVC,或者直接httpcontext自己来控制所有状态信息。我们采用ashx并且为不同的服务开辟不同的ashx通道提高性能。由于ashx不必做一系列动作、不用经过一连串的事件处理、一大堆的控件状态管理(加载并解析ViewState,还原、更新控件的值、保存ViewState等),直接返回操作结果,也就不用耗费更多的服务器资源,返回的格式也非常好灵活,所有用ashx在基于文档型的网站中我们运用的很好。
另外一点ashx对开发成员的工作隔离也是非常好。
除了编程影响传输,页面需要的图片和css文件,js文件合理的处理减少HTTP请求也能提高网络IO效率:比如将图片合并,js、css压缩等简单的方式虽然改变不多,但并发的时候降低服务器的压力总是好的。

5 页面渲染和体验
优化页面的html结构,有时候为了加快渲染,不必完全符合W3C的规范,减少div嵌套,使用固定宽度,主要javaScript的细节可以提高很好的体验。我在chrome中的测试结果可以发现,很多情况下网络的速度远远高于渲染的速度,所以能提高页面的处理,对个体用户的体验是很有效的。

4 数据提交
在可靠的情况下,多考虑异步模式或多线程。对数据库的提交,web服务的访问都可以使用异步模型,当然是在可靠的情况下。
页面的ajax自然也是异步的一种方式,另外js文件的加载也可以异步的方式。

5 锁

太累了,先不写了

时间: 2024-10-02 07:22:09

高并发处理的相关文章

Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <纲要> Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理 UDP服务器 客户端最小模型,处理字符转大写 TCP 多进程并发服务器模型,为每个客户端开启一个进程: TCP 多线程服务器模型,使用wrap函数封装 作业: ---------------------------------------------------- UDP服务器 客户端最小模型,处理字符转大写 [em

java web开发 高并发处理

java web开发 高并发处理 java 高并发 java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不

被神化的海量数据处理和高并发处理

http://blog.csdn.net/hawksoft/article/details/7192207 实任何简单的问题,只要规模大了都会成为一个问题,就如中国人口多,很多小问题都会变成大问题一样.但处理这种海量数据的方法无非就是分治和”人海”战术.使用人海战术的前提是问题的划分能够支持这种人海战术,其手段无非是切割(纵向,横向)和负载均衡.纵向分隔主要是按业务(功能)来分,也就是所谓面向服务架构,横向分隔方式比较多,主要依赖于所处理的对象属性,比如时间属性或者特定业务数据属性划分(比如铁路

淘宝双11促销背后高并发处理之淘宝网采用什么技术架构来实现网站高负载

转自:http://china-chill.blog.163.com/blog/static/2049210522012101782432304/ 时间过得很快,来淘宝已经两个月了,在这两个月的时间里,自己也感受颇深.下面就结合淘宝目前的一些底层技术框架以及自己的一些感触来说说如何构建一个可 伸缩,高性能,高可用性的分布式互联网应用. 一 应用无状态(淘宝session框架) 俗 话说,一个系 统的伸缩性的好坏取决于应用的状态如何管理.为什么这么说呢?咱们试想一下,假如我们在session中保存

C# 多线程与高并发处理并且具备暂停、继续、停止功能

原文:C# 多线程与高并发处理并且具备暂停.继续.停止功能 --近期有一个需要运用多线程的项目,会有并发概率,所以写了一份代码,可能有写地方还不完善,后续有需求在改 1 /// <summary> 2 /// 并发对象 3 /// </summary> 4 public class MeterAsyncQueue 5 { 6 public MeterAsyncQueue() 7 { 8 MeterInfoTask = new MeterInfo(); 9 } 10 11 publi

高并发处理方案(转)

时常看到高并发的问题,但高并发其实是最不需要考虑的东西.为何,他虚无缥缈,很少有网站真的需要这些东西,而且其中很多技术,其实你已经在用了.有这个意识就够了,不需要时刻盯着这个问题.只有很少的网站真的能达到高并发. 简单做一个归纳,从低成本.高性能和高扩张性的角度来说有如下处理方案:   1.HTML静态化   2.图片服务器分离   3.数据库集群和库表散列   4.缓存    5.镜像    6.负载均衡;一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种

mysql大数据高并发处理(转)

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须

mysql大数据高并发处理

公布于2013-5-14 一.数据库结构的设计 假设不能设计一个合理的数据库模型,不仅会添加client和server段程序的编程和维护的难度,并且将会影响系统实际执行的性能.所以,在一个系统開始实施之前.完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,由于数据量较小.负荷较低.我们往往仅仅注意到功能的实现,而非常难注意到性能的薄弱之处,等到系统投入实际执行一段时间后.才发现系统的性能在减少,这时再来考虑提高系统性能则要花费很多其它的人力物力,而整个系统也不可避免的形成了一个打补丁p

高并发处理方法总结

首先要了解高并发的的瓶颈在哪里,根据不同的情况,解决思路也不同. 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能. 用jprofiler等工具找出性能瓶颈,减少额外的开销. 优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化). 优化数据库结构,多做索引,提高查询效率. 统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能. 能使用静态页面的地方尽量使用,减少容器的解析(尽量

&lt;转&gt;WCF实例化模式与高并发处理

WCF实例化模式与高并发控制 1.实例化模式InstanceModel 1.1 PerCall:单调模式 每次调用都会产生一个实例 例[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 1.2 PerSession会话模式 每次调用都有同一个服务进行处理 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] 1.3 SingleT