Peter(Tse-Hsun)Chen,Queen’sUniversity,Canada
原文编辑:SarahNadi,UniversityofAlberta,Canada
中文编辑:邢颖(北京邮电大学)
校正:白晓颖(清华大学)
现今的开发人员常采用应用级的缓存框架,如Ehcache[1],将面向对象语言中的对象缓存在内存。对象经过缓存后,应用程序服务器就不必从类似数据库服务器的外部设备中检索对象数据,这可以显著提升应用程序的性能。
警告:只有明确知道缓存的内容时,应用级缓存框架才有用。然而,确定这种缓存框架的最佳使用方式并非易事。大规模Web应用程序可能有数百种不同类型的对象。那么,问题来了:我们如何知道应该缓存哪些类型的对象?
开发人员需要手动配置缓存框架,以便为每种类型的对象启用缓存(例如,为Students对象启用缓存)。因此,很难知道最佳缓存配置是什么,特别是要考虑到:缓存所能发挥的作用与用户的应用模式是直接相关的。例如,对频繁修改的对象启用缓存,不仅不会提高应用程序的性能,反而会由于对缓存的频繁更新而降低性能。
那么,我们应该如何优化缓存配置,改善Web应用程序的性能呢?
CacheOptimizer-通过DevOps查找最佳缓存配置。DevOps试图将开发者和管理者这两个领域结合起来,进而改进软件开发。因此,DevOps的一个主要思想,便是通过了解用户行为(例如,了解应用程序的实际使用方式)来辅助软件开发。然而,为了再现用户行为,可以分析哪些数据呢?有一个可能的方法是在应用程序中插桩,记录我们需要的信息。但是,这个方案对于实际运行的应用程序来说是不可行的,因为插桩的额外开销较大。
因而,我们提出了一个名为CacheOptimizer的框架,来分析已有的应用程序运行日志,以帮助开发人员在使用应用级缓存框架时,自动优化缓存配置。
将静态代码分析和运行日志结合起来了解用户行为。CacheOptimizer分析Web访问日志以了解用户如何访问应用程序。这样的访问日志是由像Tomcat这样的Web服务器自动生成的,所以我们并没有为应用程序增加任何额外的开销。然后,CacheOptimizer便使用静态代码分析将日志链接到数据访问。例如以下日志行:.0.0.1/user/getDetails/peter
日志行包含有关用户请求的信息。这里,表示HTTP状态码,.0.0.1表示用户的IP。通过静态代码分析,我们可以找到代码中处理这个特定用户请求的方法。我们还可以找到在这个请求处理方法中调用的数据访问类型(例如,访问数据库中的用户数据)。然后,把日志中的信息和从代码中获得的信息结合起来,我们就知道用户请求为从数据库中读取有关用户Peter的详细信息。在这个简单的例子中,由于我们只从数据库中读取用户对象,所以可以在User类上启用缓存以优化缓存配置。
简而言之,基于用户日志,CacheOptimizer可以分析用户实际应用行为,并为应用程序建议最佳的缓存配置。
CacheOptimizer带来了显著的性能提升。将CacheOptimizer应用于三个开源应用程序,结果显示CacheOptimizer可以显著提高应用程序的吞吐量(每秒可以处理更多的请求)!
我们将CacheOptimizer与几种不同的缓存配置进行比较:CacheAll,在所有对象上启用缓存;DefaultCache,实验研究的应用程序中已存在的默认缓存配置;NoCache,禁用所有缓存。下图(译者:来自参考文献[2])来自其中一个实验,图中使用不同记号标记了不同缓存配置的累积吞吐量。可以看出,与其他所有配置相比,通过使用CacheOptimizer可以实现更大的吞吐量。
采用生产数据协助开发。优化缓存配置只是利用实际数据来协助软件开发的一种方式。鉴于现代软件开发的敏捷特性,许多软件设计和开发的决策直接受用户应用模式所影响。所以DevOps的思路带来了一系列新的研究挑战和有趣的问题。那么,作为软件从业者和研究人员,我们能否通过DevOps找到新途径来辅助软件开发呢?
CacheOptimizer的更多详细信息参见研究论文[2]。
参考文献
[1]Ehcache.