免费注册!6月19-20日,「亚马逊云科技中国峰会」重磅来袭! 了解详情
写点什么

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

  • 2010-08-27
  • 本文字数:2086 字

    阅读完需:约 7 分钟

今年 5 月底,瑞士计算机世界杂志刊登了 Web 性能诊断专家 Bernd Greifeneder 的一篇文章,文章列举了其在过去几年工作中所遇到的服务器端编程的十大性能问题。Andreas Grabner 则在自己的博客上对这些性能问题给出了进一步阅读的链接。希望这些问题与相关的延伸阅读能为广大的 InfoQ 读者带来一定的启示。

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

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

  • 在一次事务上下文中所请求的数据比实际需要的数据多出很多。比如说:请求所有的账户信息而不是仅仅查询出当前需要显示的信息。
  • 多次请求同样的数据。这种情况通常发生在相同事务中的不同组件之间是彼此独立的,而每个组件都会请求同样的数据。我们并不清楚当前上下文中已经加载了哪些数据,最后只得多次发出同样的查询。
  • 发出多个查询语句以获得某一数据集。通常这是由于没有充分利用到复杂的 SQL 语句、存储过程等在一次批处理中获取需要的数据所导致的。

延伸阅读: Blog on Linq2Sql Performance Issues on Database Video on Performance Anti-Patterns

问题二:过多地使用同步

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

延伸阅读: How to identify synchronization problems under load

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

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

延伸阅读: Performance Considerations in Distributed Applications

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

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

延伸阅读: Understanding Hibernate Session Cache Understanding the Query Cache Understanding the Second Level Cache

问题五:内存泄漏

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

延伸阅读: Understanding and finding Memory Leaks

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

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

延伸阅读: Top SharePoint Performance Mistakes

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

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

延伸阅读: Resource Leak detection in .NET Applications

问题八:膨胀的 Web 前端

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

延伸阅读: How Better Caching would help speed up Frankfurt Airport Web Site Best Practices on Web Performance Optimization

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

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

延伸阅读: Java Memory Problems Identify GC Bottlenecks in Distributed Applications

问题十:间歇性问题

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

延伸阅读: Tracing Intermittent Errors by Lucy Monahan from Novell How to find invisible performance problems

2010-08-27 00:598789
用户头像

发布了 88 篇内容, 共 267.9 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

刷了LeetCode的链表专题,我发现了一个秘密!

Simon郎

Java 面试 链表

Linux高级编程常用的系统调用函数汇总

哒宰的自我修养

Linux 线程 网络编程 进程 MySQL数据库

【原创】Spring Boot终极篇《上》

田维常

springboot

Polkadot系列(二)——混合共识详解

QTech

区块链 polkadot

追风人与笃行者:云手机的2020风云录

脑极体

Redis-缓存雪崩,缓存击穿,缓存穿透

topsion

redis

vivo 云服务海量数据存储架构演进与实践

vivo互联网技术

数据库 架构 云服务 数据存储

5G时代的到来对直播的影响

anyRTC开发者

5G 音视频 WebRTC 直播 RTC

【原创】Spring Boot 过滤器、监听器、拦截器的使用

田维常

springboot

送你4句口诀 云存储选型不再犯难

京东科技开发者

云存储

一期二班 - 吴水金 - 第五课作业

吴水金

如何将MySQL查询优化到极致?

冰河

MySQL sql 性能优化 查询优化 查询

看完这篇你还能不懂C语言/C++内存管理?

C语言与CPP编程

c c++ C语言 内存管理 编程开发

推进AI融合 2020 LF AI & DATA DAY(AI开源日)即将召开

【原创】Spring Boot 如何手写starter

田维常

springboot

面经手册 · 第16篇《码农会锁,ReentrantLock之公平锁讲解和实现》

小傅哥

Java 面试 小傅哥 ReentrantLock 公平锁

TensorFlow 篇 | TensorFlow 数据输入格式之 TFRecord

Alex

tensorflow keras dataset tfrecord

开源技术够用了么?我的 NAS 选型与搭建过程

LeanCloud

开源 NAS

JDK8中的新时间API:Duration Period和ChronoUnit介绍

程序那些事

java8 jdk8 新特性 程序那些事 时间API

社会正在惩罚不读书的人!这份程序员进阶书单,值得收藏~

田维常

程序员 电子书

设置Vmware中的Ubuntu为桥接模式

jiangling500

ubuntu vmware 桥接

C++中的vector和Java中的ArrayList的构造函数的区别

jiangling500

Java c++ ArrayList vector

【原创】SpringBoot快速整合Thymeleaf模板引擎

田维常

springboot

【原创】Spring Boot终极篇《下》

田维常

springboot

高防服务器是什么?

德胜网络-阳

国内外互联网大厂工程师联合推荐:程序员三门课+151个建议

小Q

Java 学习 编程 程序员 开发

第一届“多模态自然语言处理研讨会”精彩回顾(免费获取PPT)

京东科技开发者

人工智能 自然语言处理

甲方日常 44

句子

工作 随笔杂谈 日常

Spring Boot 如何快速实现定时任务

田维常

springboot

面试官:Java装箱与拆箱的区别?

田维常

springboot

23张图!万字详解「链表」,从小白到大佬!

王磊

Java 数据结构与算法

服务器端编程的十大性能问题_Java_张龙_InfoQ精选文章