网站性能优化(二)——应用服务器性能优化策略总结-演道网

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错
接上篇,本篇讲的是网站性能优化在应用服务器端的优化。此处的应用服务器指的是处理网站业务的服务器,网站的业务代码都在这里,所以这里的优化也是网站性能优化中最复杂的一块优化

应用服务器的优化的首选依然是使用缓存,依次是代码优化,异步操作,使用集群。

一 使用缓存

1.1 缓存的原理

缓存是指将信息存储在系统能以相对较快的速度访问到的介质中(如内存),缓存优化速度的原因一方面是访问的速度快,一方面是存在缓存中的数据一般是计算后的的数据所以使用的时候无需重复计算。

缓存主要缓存读写比很高,但是很少变化的数据,比如说网站的菜单,热门词的搜索列表。访问的过程是到缓存中读取,如果读不到或者缓存已经失效,再去数据库中读取并且把新数据更新到缓存中。网站的数据访问经常遵循2,8定律,即80%的访问集中在20%的数据上,如果我们能把这20%的数据做一下缓存会大大提高系统的性能。

1.2 使用缓存的注意事项

1.2.1 缓存中不要存频繁修改的数据

缓存中保存频繁修改的数据就会出现缓存写入还来不及读出使用就已经过期的了情况,浪费缓存资源,徒增系统负担。一般来说缓存至少存一次使用两次才算有价值,道理显而易见。

1.2.2 没有热点的数据无须进缓存

没有热点的数据即用户很少进行读写的数据,因为缓存的数据存在内存中,内存资源成本高,因此将没有热点的数据放在缓存中是一种很大的浪费。

1.2.3 使用缓存会带来数据不一致以及脏读问题

一般来说使用缓存的时候会设置缓存过期时间,所以在缓存过期时间内用户修改了数据,那么缓存中的数据和数据库中的数据会产生不一致的情况导致脏读,大部分的数据可以容忍短期内的数据不一致,但是有的数据是绝对要实时的如电商系统中的库存和价格,读写频率很高但对实时性的要求也非常高,这个时候我们就要综合考虑了,可以采用数据库更新即更新缓存的策略,但这样会增加比较大的系统开销也会带来数据的事务一致性问题。

1.2.4 要保证缓存的可用性

像淘宝,京东,微博这样的大站,倘若有一天他们的缓存服务器突然都挂掉不能用了后果会怎么样?我猜许多高并发大流量的核心数据库服务器会因为一时间无法承受骤增的压力而倒塌。所以缓存一旦用上,数据库服务器已经习惯在有缓存层保护的环境下工作,我们就要尽可能保证缓存服务器的可用性。提高可用性的有效手段是使用缓存服务器集群,一台缓存服务器宕机,我们可以将访问转移到另一台。

1.2.5 要防范缓存穿透问题

假设我们有个功能是统计业务地区的的每日营业额,我们的业务地区集中在上海,北京,天津这几个大城市,这个时候我们只在缓存中缓存这几个地区的数据靠不靠谱?仔细想是不靠谱的,假设你们公司来了个新人,他对业务地区不熟悉,多配置了个湖南,显然按之前的设计湖南是不可能出现在缓存中的,所以这段业务代码会一直去读数据库。如果这样的漏洞被黑客发现了,那就更惨了,写一段恶意攻击代码不断地访问你没缓存的数据,这样会对数据库造成持续性的压力。

改善这种问题的对策是在缓存中将不存在的数据也缓存起来,值设为null。

1.2.6 缓存初建时要预热

缓存中的热点数据按理来说是通过LRU(最近最久未用算法)通过对不断访问的数据筛选出来的,这个过程要耗费较久的时间,而我们的数据库服务器可能扛不了那么久。所以在大系统的缓存层的设计中,最开始一般会手动将热点数据建立。这个过程称为缓存预热。

二 代码优化

我们在工作中经常听到编程菜鸟,编程大神这样的称谓,同样的一个功能何谓大神级实现什么时候又会被吐槽成菜鸟呢?这个问题的答案可能多种多样,但现在放在性能的这个角度来说,优良的代码就是使用更少的资源用更快的速度去处理任务。实现角度如下:

2.1 使用多线程

从资源利用的角度上看,使用多线程的原因有两个:IO阻塞和多CPU。最理想的系统load状态是既没有线程(进程)等待,,也没有CPU空闲。

2.2 资源复用

从编程的角度上来看的资源复用主要是指单例模式和对象池。单例模式是一个系统共用一个对象,对象池也是通过复用对象,来减少对象的创建和资源消耗。比如说对于数据库连接,每次创建数据库服务端都需要创建专门的资源来应对,因此频繁地创建数据连接关闭数据库连接对数据库服务器造成的压力是灾难性的。因此在大型系统中数据库连接往往通过数据池的方式,系统将创建好的数据库连接对象放入数据池,应用服务器需要连接数据库的时候就从对象池中获取一个空闲的连接,使用完毕之后再放回应用池。

2.3 数据结构

这个问题老生常谈了,每次面试基本上都会问的问题,可见他的重要程度。所谓程序就是数据结构+算法,良好的数据结构和算法在节省系统资源和提高程序效率都有裨益。至于如何评判数据结构和算法的优良又是另一个大话题的,此处不赘述。

2.4 垃圾回收

每种语言都有自己的垃圾回收机制,理解垃圾回收机制可以帮助程序优化和参数调优,并且可以减少写出内存泄漏代码的机率。这一方面的知识笔者也仍处于学习理解状态,不做详述,以免误导大家。

三 使用异步

做网站开发的时候有一条原则是可以晚一点做的事情就晚一点做。常见的如用户注册,用户下订单的email以及短信的发送。使用消息队列将调用异步化一方面可以提高网站的扩展性,另一方面可以起到很好的削峰作用以提高网站的响应速度即提高性能

四 使用集群

在网站高并发的情景下使用负载均衡技术搭建由多台服务器组成的集群,通过计算将用户的访问合理分配到多台服务器,这样可以避免单台服务器因压力过大而访问延迟。

转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn

未经允许不得转载:演道网 » 网站性能优化(二)——应用服务器性能优化策略总结-演道网

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册