服务器端编程的十大性能问题

开发
文章作者Andreas Grabner根据自己的工作经验,列举了过去他曾遇到过的服务器端编程的十大性能问题,希望这些问题能给广大读者带来一定的启示。

51CTO之前曾报道过《“杀死”你的服务器的6种方法》,分析了在网站后台重构过程中容易让服务器宕机的六种情况,本文作者则列举了其在过去几年工作中所遇到的服务器端编程的十大性能问题。

问题一:过多的数据库调用

我们发现经常出现的一个问题就是在每次请求/事务中存在过多的数据库查询。有如下三个场景作为佐证:

◆在一次事务上下文中所请求的数据比实际需要的数据多出很多。比如说:请求所有的账户信息而不是仅仅查询出当前需要显示的信息。

◆多次请求同样的数据。这种情况通常发生在相同事务中的不同组件之间是彼此独立的,而每个组件都会请求同样的数据。我们并不清楚当前上下文中已经加载了哪些数据,最后只得多次发出同样的查询。

◆发出多个查询语句以获得某一数据集。通常这是由于没有充分利用到复杂的SQL语句、存储过程等在一次批处理中获取需要的数据所导致的。

问题二:过多地使用同步

毫无疑问,同步对于应用中共享数据的保护来说是至关重要的举措。但有很多开发者却过度使用同步,比如在超大段的代码中使用同步。在低负载的情况下,这么做倒没什么问题;但在高负载或是产品环境下,过度的同步会导致严重的性能与可伸缩性问题。

问题三:过度使用远程调用

很多库都使用了远程通信。对于开发者来说,远程调用与本地调用似乎没什么区别,但如果不清楚远程调用的本质就会铸成大错,因为每一次远程调用都会涉及到延迟、序列化、网络堵塞以及内存使用等问题。如果没有经过深思熟虑而盲目使用这些远程技术就会导致严重的性能与可伸缩性问题。

问题四:错误地使用对象关系映射

对象关系映射为开发者解决了很多负担,比如从数据库中加载对象以及将对象持久化到数据库中。但与其他任何框架一样,对象关系映射也有很多配置选项需要优化,只有这样才能适应于当前应用的需要。错误的配置与不正确的使用都会导致始料不及的性能问题。在使用对象关系映射框架前,请务必保证熟悉所有的配置,如果有机会,请深入到所用框架的内核,这样使用起来才有保障。

问题五:内存泄漏

托管的运行时环境(如Java和.NET)可以通过垃圾收集器进行内存管理。但垃圾收集器无法避免内存泄漏问题。“被遗忘”的对象依旧会占据着内存,最终将会导致内存泄漏问题。当对象不再需要时,请尽快释放掉对象引用。

问题六:使用有问题的第三方代码/组件

没有人会从头编写应用的全部功能。我们都会使用第三方程序库来加快开发进程。这么做不仅会加速产出,也增加了性能上的风险。虽然大多数框架都具有良好的文档并且经过了充分的测试,但没人能够保证这些框架在任何时候都会像预期的那样好。因此,在使用这些第三方框架时,事先一定要做好充分的调研。

问题七:对稀缺资源的使用存在浪费的情况

内存、CPU、I/O以及数据库等资源属于稀缺资源。在使用这些资源时如果存在浪费的情况就会造成严重的性能与可伸缩性问题。比如说,有人会长时间打开数据库连接而不关闭。连接应该只在需要的时候才使用,使用完毕后就应该放回到连接池中。我们经常看到有人在请求一开始就去获取连接,直到最后才释放,这么做会导致性能瓶颈。

问题八:膨胀的Web前端

由于现在的Web速度越来越快,用户的网络体验也越来越好。在这个趋势下,很多应用的前端都提供了太多的内容,但这么做会导致差劲的浏览体验。很多图片都太大了,没有利用好或是错误地使用了浏览器缓存、过度地使用JavaScript/AJAX等,所有这一切都会导致浏览器的性能问题。

问题九:错误的缓存策略导致过度的垃圾收集

将对象缓存在内存中可以避免每次都向数据库发出请求,这么做可以提升性能。但如果缓存了太多的对象,或是缓存了很多不常使用的对象则会将缓存的这种优势变成劣势,因为这会导致过高的内存使用率及过多的垃圾收集活动。在实现缓存策略前,请想好哪些对象需要缓存,哪些对象不需要缓存,进而避免这类性能与可伸缩性问题。

问题十:间歇性问题

间歇性问题很难发现。通常这类问题与特定的输入参数有关,或是发生在某个负载条件下。完全的测试覆盖率及负载与性能测试能在这些问题产生前就发现他们。

原文作者:Andreas Grabner

原文链接:http://blog.dynatrace.com/2010/06/15/top-10-performance-problems-taken-from-zappos-monster-and-co/

作者介绍

Andreas Grabner,是一名具有10年以上编程经验的Java/.Net开发工程师,他目前是职位是dynaTrace软件公司技术团队的负责人。

【编辑推荐】 

  1. “杀死”你的服务器的6种方法
  2. 大型B2C网站高性能可伸缩架构技术探秘
  3. 世界最大的PHP站点 Facebook后台技术探秘
  4. 更好的选择 细数Apache服务器的四个替代者

 

责任编辑:王晓东 来源: InfoQ
相关推荐

2010-11-18 16:23:33

2020-06-02 14:57:06

Linux服务器架构

2009-08-26 09:09:46

服务器维护错误

2009-07-29 15:48:45

2010-10-15 08:57:15

PHP多进程

2021-07-27 06:14:32

服务器端移动端性能测试

2016-01-05 16:29:23

服务器虚拟化

2021-09-09 10:40:12

服务器虚拟化数据中心

2010-01-08 13:54:17

JSON 性能

2010-02-22 10:35:05

服务器虚拟化

2013-08-01 10:07:37

服务器虚拟化虚拟化

2015-10-27 09:40:31

TCPIP网络协议

2013-12-25 11:01:16

JavaScript

2010-07-27 09:16:49

2011-07-26 11:07:08

JavaScript

2014-01-15 10:06:30

vFlash

2012-10-15 13:40:15

IBMdw

2009-08-26 09:44:18

2010-11-11 09:51:38

服务器虚拟化

2013-07-25 14:56:37

JavaEE 性能
点赞
收藏

51CTO技术栈公众号