年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
来源:http://www.infoq.com/cn/news/2010/08/top10-server-side-performance
相关推荐
ASP.NET编程十大方法是开发人员在使用微软的ASP.NET框架构建Web应用程序时应当掌握的关键技巧。这十个方法旨在提升开发效率,优化代码性能,并确保应用的健壮性和可维护性。以下是对这些方法的详细解释: 1. **利用...
ASP.NET AJAX扩展了服务器端技术,允许部分页面更新,提供更好的用户体验。`UpdatePanel`和`ScriptManager`等控件使得无需刷新整个页面即可更新内容。 7. **事件模型和生命周期管理** 理解ASP.NET页面生命周期,...
1. **使用控件ID重命名(Control ID Naming)**:在ASP.NET中,控件ID在客户端和服务器端可能会有所不同,为避免混淆,可以使用`ClientIDMode`属性来控制控件ID的生成方式,使其在客户端保持一致,便于JavaScript或...
在.NET Framework中,字符串拼接是一个常见的操作,但使用不当会导致性能问题。传统的字符串连接方式(如使用`+`运算符)在循环中创建了多个临时字符串对象,浪费内存。相比之下,`StringBuilder`类提供了一种更高效...
这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,...
Java以其跨平台特性广泛应用于服务器端和移动应用开发;C++以其高效性能和底层控制深受系统级和游戏开发者的喜爱;C#是微软.NET框架的核心语言,适用于Windows开发;VB.NET简化了.NET编程,适合快速开发。了解并能...
它包括一系列的服务器端组件,如Java Servlets、JavaServer Pages(JSP)、Java Persistence API(JPA)和Enterprise JavaBeans(EJB)等。 6. J2ME:Java 2 Micro Edition(J2ME)则面向嵌入式和移动设备,提供了...
9. **网络编程**:理解和实现套接字编程,包括客户端和服务器端的交互。 10. **操作系统的接口**:命令行接口(CLI)或图形用户界面(GUI)的实现,以及系统调用的理解和使用。 在实际的上机考试中,可能会要求...
在***中提高首页性能是一个十分重要...上述的十大做法涵盖了从服务器端到客户端、从代码逻辑到资源管理的多个方面。在实际开发中,应该根据具体情况选择适合的技术手段,组合使用多种方法,以达到最佳的性能优化效果。
在ASP编程中,这些程序的实现涉及HTML、CSS和JavaScript与服务器端ASP代码的结合。例如,注册系统可能涉及用户界面设计(如按钮和文本框的布局),服务器端处理(如验证和数据插入数据库),以及可能的安全措施(如...
这部分会涉及到AJAX请求、JSON数据交换、服务器端的响应处理,以及前端的反馈展示。 通过这些案例的学习,你可以掌握PHP的核心技术和常用库的使用,从而提升编程能力,为成为PHP大神奠定坚实基础。记得实践是检验...
因此,开发者应该在客户端和服务器端进行双重数据验证,并始终保持警惕,假设每个用户都有可能发起攻击。这样可以有效地防止SQL注入、跨站脚本攻击(XSS)等常见的安全威胁。 第四,应用PHP缓存技术是提升Web应用性能...
在编程世界中,PHP是一种广泛使用的服务器端脚本语言,尤其在Web开发领域,它扮演着至关重要的角色。为了让你的PHP技能更加精准且高效,掌握以下十大要点至关重要: 1. **基础语法**:理解PHP的基本语法是入门的...
Java的Socket编程提供了网络通信的能力,可以创建服务器端和客户端进行数据交换。理解套接字(Socket)和服务器套接字(ServerSocket)的工作原理是进行网络编程的基础。 八、JDBC数据库访问 Java Database ...
- **网络游戏后台**: 多款在线游戏采用Python进行服务器端开发。 - **不适合的领域**: 操作系统开发、移动应用开发(iOS和Android)、高性能图形渲染等。 #### 学习Python的要求 - **目标用户**: - 对编程感兴趣但...
通过审计,可以提前发现潜在的逻辑错误、性能问题和安全风险,避免在生产环境中出现严重后果。同时,它也有助于提高开发人员的编程习惯和安全性意识。 3. 代码审计的方法: 代码审计通常包括静态分析和动态分析两个...
J2ME(Java 2 Micro Edition)针对移动设备和嵌入式系统,J2SE(Java 2 Standard Edition)适用于桌面系统,而J2EE(Java 2 Enterprise Edition)则用于企业级应用开发,提供服务器端支持。 Java语言的主要特性是其...