【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

  • 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:598615
用户头像

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

关注

评论

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

霸榜Github三个月的「架构师成长手册」!成为架构师竟然也有捷径

Java你猿哥

Java 分布式 架构设计 架构师 SSM框架

ES6中的Proxy

格斗家不爱在外太空沉思

JavaScript ES6 三周年连更

带你浅谈下Quartz的简单使用

Java你猿哥

Java SSM框架 quartz

劲爆!阿里巴巴面试参考指南(嵩山版)开源,程序员面试必刷

做梦都在改BUG

Java 程序员 面试

2023春招、金三银四,面试官必问的1000道Java面试题及答案整理

架构师之道

Java 面试

我给大家免费公开五份阿里Java架构师学习手册!助力金三银四

Java你猿哥

Java 架构 算法 高并发 Java性能调优

如果有一天当你的Redis 内存满了,该怎么办?

会踢球的程序源

Java redis 后端

【Java技术专题】「盲点追踪」突破知识盲点分析Java安全管理器(SecurityManager)

洛神灬殇

Java 安全管理器 SecurityManager

🔥🔥🔥热乎的前端面试题(昨天)

控心つcrazy

JavaScript 面试 Vue 前端面试

测试需要写测试用例吗?

老张

软件测试 质量保障 测试用例

从初学者角度聊一聊socket到底是什么?

会踢球的程序源

Java 后端 socket

Java的访问修饰符

Java你猿哥

Java oop SSM框架

WebGPU 令人兴奋的 Web 发展

devpoint

WebGL webgpu #WebGPU 三周年连更

工赋开发者社区 | MES/MOM数据采集系统需求分析和总体设计

工赋开发者社区

让算力普惠、释放技术红利,阿里云让开发者成为创新主体

阿里巴巴云原生

阿里云 Serverless 云原生 函数计算

硬核!阿里P8自爆春招面试核心手册,Github上获赞65.7K

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

FastDFS收藏起来,现在开始用Minio吧

会踢球的程序源

Java fastdfs

MySQL索引15连问,你扛得住吗?

做梦都在改BUG

Java MySQL 数据库 索引

2023最NB的JVM基础到调优笔记,光图文就超清晰,吃透阿里P6小case

Java你猿哥

Java JVM Java虚拟机 jvm调优

SpringBoot中如何解决Redis的缓存穿透、缓存击穿、缓存雪崩?

做梦都在改BUG

好用的pdf格式转换器:PDF to Word Document Converter 激活版

真大的脸盆

Mac PDF Mac 软件 PDF格式转换

多线程&高并发(全网最新:面试题+导图+笔记)面试手稳心不慌

Java你猿哥

Java 多线程 面试题 高并发 多线程与高并发

限时开源!阿里京东架构师出品亿级高并发系统设计手册

会踢球的程序源

Java 架构 后端 java架构师

分布式事务的21种武器 - 1

俞凡

架构

CNStack 云服务&云组件:打造丰富的云原生技术中台生态

阿里巴巴云原生

阿里云 云原生 CNStack

fabric.js开发图片编辑器可以实现哪些功能?多图

秦少卫

h5编辑器 FabricJS Fabric.js 海报编辑器 图片编辑

2023年超全前端面试题-背完稳稳拿offer(欢迎补充)

肥晨

三周年连更

阿里巴巴灵魂一问:说说触发HashMap死循环根因

会踢球的程序源

hashmap Java1

Amazon 中国区配置 PingIdentity 身份集成实现 Redshift 数据库群集单点登录

亚马逊云科技 (Amazon Web Services)

Golang负载均衡器Balancer的源码解读

骑牛上青山

Go 负载均衡

面试官:类是如何加载的?

做梦都在改BUG

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