性能优化

缓存功能 分享链接

作者:刚哥 最后编辑:刚哥 于 2024-12-19 15:46:01 浏览量:86

禅道21.2版本对缓存功能做了较大的调整,以下是相关说明。

一、名词解释

SQL查询结果缓存:把SQL查询的结果放到缓存中。

整表数据缓存:把整张表的数据放到缓存中。

计算结果缓存:把业务逻辑计算出的结果放到缓存中。

二、缓存内容及更新策略

21.2版本之前的缓存底层使用PHP-APCu扩展实现,只缓存了SQL查询的结果,默认缓存生命周期为1个月。当SQL查询的表的内容发生增删改时缓存失效。

21.2版本开始,缓存底层同时支持PHP-APCu和Redis。缓存内容除了SQL查询结果外,增加了整表数据缓存和计算结果缓存。其中SQL查询结果的默认缓存生命周期调整为1周,当SQL查询的表的内容发生增删改时缓存失效。整表数据缓存和计算结果缓存默认生命周期为永久,即永不失效。整表数据缓存和计算结果缓存会记录关联的表,当这些表发生增删改时,整表数据缓存会自动更新内容,计算结果缓存会被标记为失效,由业务逻辑重新对计算结果数据进行缓存。

三、性能测试

1. 测试数据

数据库容量 9.4G
项目集数量 182
项目数量   874
迭代数量   3594
产品数量   129
需求数量   67873
任务数量   131879
Bug数量    67873
用例数量   10890
模块数量   11255
日志数量   2317479

2. 测试对象

使用10个常用页面作为测试对象,分别为我的地盘、项目集列表、产品列表、项目列表、执行列表、需求列表、任务列表、测试仪表盘、Bug列表、用例列表。

3. 测试结果

使用JMeter对上述10个页面进行读取测试,开启缓存后的吞吐量提升从26%-100%不等,同时CPU使用率下降了40%-80%,下面为详细数据。

四、APCu和Redis的差异

APCu是PHP扩展直接操作内存,而Redis是网络服务,需要建立网络连接,因此APCu缓存的性能高于Redis。下面说明两者的差异,用户可根据自己的实际场景选择。

  • APCu不支持分布式,不能设置缓存淘汰策略。当分配的内存不足时,APCu会清空所有缓存内容再写入,此时会对性能有较大影响。APCu可以自动处理复杂数据类型如数组、对象等,无需应用层序列化。
  • Redis支持分布式,可以设置缓存淘汰策略。推荐的缓存淘汰策略为volatile-lru: 从设置了过期时间的缓存中选择最近最久未使用的进行淘汰,即内存不足时会优先淘汰SQL查询结果缓存 。Redis需要应用层把复杂数据类型序列化为字符串后存储(Hash类型可以存储对象但不适用于禅道的应用场景)。

五、禅道缓存配置

禅道中的缓存配置功能在【后台】=>【系统设置】=>【缓存】页面。

如果用APCu做缓存服务只需要选择服务范围并填写命名空间即可,如果用Redis则还需要填写Redis相关配置。下面对几个特殊配置进行说明。

1. 服务范围

缓存作为基础设施可以同时提供给多个应用使用,如果该缓存服务只有禅道使用可以选择【本应用独享】,否则选择【多应用共享】。这两个选项的区别在于清除缓存时采用不同的机制,性能略有差异,使用方面没有差异。

【本应用独享】清除缓存时调用缓存服务自身提供的清除机制,APCu为apcu_clear_cache(),Redis为flushDB

【多应用共享】清除缓存时对缓存的内容遍历,清除以【命名空间】中设置的值为前缀的缓存键。

2. 命名空间

命名空间主要用于【多应用共享】场景下区分禅道和其他应用的缓存数据,要求确保唯一性,默认值为禅道连接的数据库名。

3. Redis序列化器

因为Redis存储复杂数据类型需要序列化为字符串后存储,私有需要选择序列化器。PHP内置序列化器即内置的serialize()方法,igbinary序列化器为PHP-igbinary扩展提供。由于igbinary序列化的性能和空间占用优于内置序列化器,因此作为默认值。

六、缓存服务配置

1. APCu

APCu配置较简单,对禅道来说仅设置内存使用限制即可。

apc.shm_size=2G

2. Redis

Redis推荐的配置如下,主要是内存使用限制、缓存淘汰策略、禁用持久化。

# TCP连接队列长度,高并发环境建议增大此值
tcp-backlog 511
# 客户端连接空闲超时时间,0表示不超时
timeout 0
# 禁用持久化
save ""
# 最大客户端连接数
maxclients 10000
# 最大内存使用限制
maxmemory 2gb
# 内存达到限制时的淘汰策略:
maxmemory-policy volatile-lru
# 是否启用AOF持久化
appendonly no
返回顶部
刘斌
高级客户经理
17685869372
526288068
统一服务热线 4006-8899-23
我要提问提问有任何问题,您都可以在这里提问。 问题反馈反馈点击这里,让我们聆听您的建议与反馈。