二、服务预热 所谓服务预热,就是在服务启动完成到对外提供服务之前,针对特定场景提供一些初始化准备操作,比如线程池预热、缓存预热、数据库预热、web预热和jvm预热等等,需要注意的是,预热操作需要在应用真正对外提供服务之前完成 @Component @Slf4j public class PreheatHotData implements ApplicationListener<ApplicationReadyEvent> { @Component @Slf4j public class PreheatHotData implements ApplicationListener<ApplicationReadyEvent> { 但是dubbo服务预热和线程池预热的目的虽然一样,但是做的事情和达到的效果却还是有所不同,比方说服务刚启动路由进来了1%的流量进来,但是这1%可能是1个调用也可能是1000个调用,请求进来的时候对于dubbo 服务端的线程池模型来说,还是要经历创建核心线程的步骤,RT多多少少也会受到影响,所以开启服务预热和开启线程池预热并不是互斥的,相互协同工作会把服务短时间内达到最佳状态。
背景 随着流量增长,服务的节点越来越多,对服务性能要求也越来越大,在服务启动时经常会发现存在抖动,针对这些服务抖动,就需要采取一些预热措施,下面就简单介绍下系统相关的服务预热、中间件预热、数据库预热等 预热场景 服务预热 在《springcloud线上发布超时》系列文章中已经描述了一些微服务需要预热的服务资源, 连接池 线程池 限流池 grpc连接 jit 池资源相关预热我这里就不描述了,参考我的发布预热系列文章 我现在就是采用流量录制以及回放预热,如下图: 方案三 定制路由策略,通过tag配置来路由 这里的方案就是需要定制化路由策略,刚启动的服务注册时带上一些配置信息,网关或者服务调用段获取到配置后来根据配置来路由 ,先路由少量流量,慢慢增加直到路由100%,这样可以达到针对jit的预热效果 中间件预热 redis预热 先在很多服务为了提高吞吐量而使用redis,这就会导致服务启动后或者redis数据丢失后,会导致请求都打到 CDN预热 CDN经常是也承担了入口缓存,那么这里也会需要预热,可以录制生产流量回放来达到预热效果。
一、背景 1.1 什么是服务预热 所谓服务预热,就是在服务启动完成到对外提供服务之前,针对特定场景提供一些初始化准备操作。 比如线程池预热、缓存预热、数据库预热、web预热和JVM预热等。 我们常用的连接池Druid提供了比较方便的连接池预热能力。常见的配置方式: 4.JVM预热 大家都知道,Java语言是解释执行和编译执行共同存在的。 三、预热的问题及解决 3.1 时长 既然在服务启动阶段加入了预热逻辑,就会产生损耗,最直接的体现就是服务启动时间变长,可能几分钟到十几分钟不等。 问题定位之后,我们降低了入参数量,减少了循环次数,从而减少了服务自请求次数,问题得以修复。 四、总结 以上是服务预热的一些常见方式,服务预热是把双刃剑,在使用之前,需要搞清楚哪些服务需要预热。 对于需要预热的服务,需要搞清楚具体需要预热哪些内容,不能盲目预热,容易适得其反。 在预热之后,也需要观察相关的指标,检查预热是否生效,确保服务运行稳定正常
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @Component @Slf4j
本文主要介绍了如何通过腾讯云对象存储(Cloud Object Storage,COS)和 云函数服务(Serverless Cloud Function,SCF)实现 EdgeOne 自动预热资源,预热的功能和原理介绍请参考 步骤1:创建 EdgeOne 自动预热的云函数并部署1. 登录 云函数服务控制台,在左侧菜单栏中,单击函数服务。2. 在函数服务页面,单击新建,选择使用模板创建,在模糊搜索中输入 EdgeOne 自动预热并选中,单击下一步。3. 在“函数配置”页面,如下配置为必填项,其他配置项建议保持使用默认配置即可。 4. 单击完成,即可完成 EdgeOne 自动预热函数的创建。步骤2:验证生效1. 登录 对象存储 COS 控制台,在左侧菜单栏中,单击存储桶列表。2. 4. 单击上传文件,首次上传一个文件,例如:v2_src.apk,单击上传。5. 文件上传成功后,在 云函数 SCF 控制台 中,单击 步骤1 创建的函数名称。6.
127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0//告诉服务器把客户端的信息 Connection: keep-alive Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 • User-Agent:使得服务器能够识别客户使用的操作系统 • Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号 普通注入 普通注入指直接可以用工具进行注入的漏洞,相对简单,手工union联合查询就直接查询的漏洞,如下所示 我们常见的漏洞方式有两种 "13@163.com"); Query OK, 1 row affected mysql> INSERT INTO user(id,username,password,email)VALUES(4, values()指与上方对应的数据运行语句 INSERT INTO admin.user(id,username,password,email)VALUES(4,"admin4","123546",
1.4延迟暴露 很多时候,我们的服务需要依赖一些其他内容才可以正常提供服务,比如缓存预热、线程池预热等等,所以,在服务真正就绪之后再注册到配置中心是很有必要的。 预热转发是针对服务节点的负载均衡来说的。 因为在服务刚启动的时候,如果请求过多可能会影响机器性能和正常业务,如果将处于预热期的机器的请求转发到集群内其它机器,过了预热期之后再恢复正常,则可以保证服务节点的性能和服务整体的可用性。 这样,按照上述计算方式,权重小的服务节点被选到的几率就相对小,以此达到权重随机的效果。 那么,为什么刚发布的服务需要预热呢?预热可以起到什么作用呢? Part4总结 本篇从RPC的预热转发功能,引出了其背后的理论依据--JIT优化。阐述了JIT的基本概念,并用一个实例说明了代码编写风格对JIT优化的实际影响。
缓存预热是一个比较常见的概念,相信很多小伙伴都有所了解。对于 JuiceFS 来说,缓存预热就是将需要操作的数据预先从对象存储拉取到本地,从而获得与使用本地存储类似的性能表现。 缓存预热 JuiceFS 缓存预热是一种主动缓存手段,它可以将高频使用的数据预先缓存到本地,从而提升文件的读写效率。 使用 warmup 子命令预热缓存: juicefs warmup [command options] [PATH ...] --background 或 -b:后台运行 只能预热已经挂载的文件系统中的文件,即预热的路径必须在本地挂载点上。 预热一个目录 例如,将文件系统挂载点中的 dataset-1 目录缓存到本地: juicefs warmup /mnt/jfs/dataset-1 预热多个目录或文件 当需要同时预热多个目录或文件的缓存时
什么是流量预热 我们都知道在做运动之前先得来几组拉伸之类的动作,给身体做个热身,让我们的身体平滑过渡到后面的剧烈运动中。 流量预热也是一样的道理,对限流组件来说,流量预热就类似于一种热身运动,它可以动态调整令牌发放速度,让流量变化更加平滑。 如果在下一秒突然涌入100个请求,这些请求会迅速消耗令牌,对服务的瞬时冲击会比较大。 流量预热的做法 我们以Guava中的RateLimiter为例,看看流量预热在RateLimiter中是如何运作的,我们用下面的状态转换图来展示整个过程: 横坐标是令牌桶的当前容量,纵坐标是令牌发放速率 核心代码 理解了预热模型的运作流程之后,我们来看一下具体代码是如何实现的。
CDN预热即是模拟用户发起请求到CDN,如果没有缓存,则回源拉取,如果有缓存是直接命中不会刷新也不会进行回源。 经常会有用户咨询预热失败的原因,预热失败原因可通过API接口查询预热记录,有返回预热失败原因,这里梳理了下CDN预热失败的一些常见场景: 预热失败.png URL中有空格 例如请求http://range2 .bigmen.cn/aa bb.txt 如果是浏览器上来进行请求,浏览器会将空格进行编码,请求的URL是:http://range2.bigmen.cn/aa%20bb.txt CDN预热,并不会进行编码
1.4延迟暴露 很多时候,我们的服务需要依赖一些其他内容才可以正常提供服务,比如缓存预热、线程池预热等等,所以,在服务真正就绪之后再注册到配置中心是很有必要的。 预热转发是针对服务节点的负载均衡来说的。 因为在服务刚启动的时候,如果请求过多可能会影响机器性能和正常业务,如果将处于预热期的机器的请求转发到集群内其它机器,过了预热期之后再恢复正常,则可以保证服务节点的性能和服务整体的可用性。 这样,按照上述计算方式,权重小的服务节点被选到的几率就相对小,以此达到权重随机的效果。 那么,为什么刚发布的服务需要预热呢?预热可以起到什么作用呢? Part4总结 本篇从RPC的预热转发功能,引出了其背后的理论依据--JIT优化。阐述了JIT的基本概念,并用一个实例说明了代码编写风格对JIT优化的实际影响。
序本文主要研究一下线程池的预热prestartCoreThreadjava/util/concurrent/ThreadPoolExecutor.java /** * Starts a core
JUC学习之预热知识 进程与线程 进程 线程 二者对比 并行与并发 应用 应用之异步调用(案例1) 应用之提高效率(案例2) 案例---验证多核cpu对效率的提升,单核cpu无法提升 环境搭建 结论 进程与线程 最后加上汇总时间只会花费 12ms 注意 需要在多核 cpu 才能提高效率,单核仍然时是轮流执行 案例—验证多核cpu对效率的提升,单核cpu无法提升 环境搭建 基准测试工具选择,使用了比较靠谱的 JMH,它会执行程序预热 = 0; i < 250_000_00;i++) { sum += array[500_000_00+i]; } return sum; }); FutureTask<Integer> t4 return sum; }); new Thread(t1).start(); new Thread(t2).start(); new Thread(t3).start(); new Thread(t4) ) { sum += array[0+i]; } return sum; }); new Thread(t1).start(); return t1.get(); } } 双核 CPU(4个逻辑
这就是我们常提到的缓存预热。官方一点的解释是这样的:缓存预热是一种在程序启动或缓存失效之后,主动将热点数据加载到缓存中的策略。 这样,在实际请求到达程序时,热点数据已经存在于缓存中,从而减少了缓存穿透和缓存击穿的情况,也缓解了SQL服务器的压力。那shigen结合业务系统,加上自己的设计,写出了这样的设计代码。 :这里的key比较少,采用的是直接删除;但是针对key较多的情况,建议使用游标或者lua脚本删除;服务关闭的时候清除缓存,这里是为了节约资源图片接口类测试这里就是随便写的一个接口,测试一下是否实现了效果 我们启动服务测试一下效果:图片相关的时间段redis的日志是这样的:在服务启动之后,缓存中就有了数据,接口测试可以直接拿到数据;当服务关闭之后,缓存数据也一并的清空。 图片好了,以上就是《redis如何实现缓存预热》的全部内容了。需要注意的是:这种设计方式仅适用于单机模式,对于多实例、分布式服务需要考虑数据的同步问题!
CDN提供了预热功能,可以主动将源站服务器的资源缓存至节点上,当客户端来访问时直接命中缓存而不需要回到源站拉取,在业务高峰期的时候非常适用,建议在业务高峰期的前几个小时开始做预热。 下面来测试看看,CDN预热是如何访问源站服务器的,步骤如下 1、在源站服务器部署tcpdump抓包 image.png 2、在CDN控制台提交URL预热 image.png 3、分析抓包文件 image.png CDN的预热请求也是标准的GET请求,有个别特殊的请求Header,通过判断存在以下Header就可以知道是不是预热请求了 User-Agent: TencentCdn X-Cdn-Prefetch:
Warmup是在ResNet论文中提到的一种学习率预热的方法,它在训练开始的时候先选择使用一个较小的学习率,训练了一些epoches或者steps(比如4个epoches,10000steps),再修改为预先设置的学习率来进行训练 由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps 内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。 .3f--learning_rate:%.3f" % ( train_steps+1,warmup_steps,learning_rate))2.上述代码实现的Warmup预热学习率以及学习率预热完成后衰减 (四)总结使用Warmup预热学习率的方式,即先用最初的小学习率训练,然后每个step增大一点点,直到达到最初设置的比较大的学习率时(注:此时预热学习率完成),采用最初设置的学习率进行训练(注:预热学习率完成后的训练过程
文件预热 文件预热的时候需要了解的知识点 操作系统的 Page Cache 和 内存映射技术 mmap 。 Page Cache Page Cache 叫做页缓存,而每一页的大小通常是4K,在Linux系统中写入数据的时候并不会直接写到硬盘上,而是会先写到Page Cache中,并打上dirty标识,由内核线程 可以将文件在磁盘位置的地址和在虚拟内存中的虚拟地址通过映射对应起来,之后就可以在内存这块区域进行读写数据,而不必调用系统级别的read,wirte这些函数,从而提升IO操作性能,另外一点就是mmap后的虚拟内存大小必须是内存页大小(通常是4K this.fileName, this.fileSize, ret, System.currentTimeMillis() - beginTime); } } 该方法主要是实现文件预热后 ,防止把预热过的文件被操作系统调到swap空间中。
在运行于物理硬件上的传统应用中,服务实例的网络位置是相对静态的。例如,您的代码可以从偶尔更新的配置文件中读取网络位置。 然而,在现代基于云的微服务应用中,这是一个更难解决的问题,如图 4-1 所示。 之后,客户端利用负载均衡算法选择一个可用的服务实例并发出请求。 图 4-2 展示了该模式的结构 ? 服务实例的网络位置在服务注册中心启动时被注册。当实例终止时,它将从服务注册中心中移除。 4.3、服务端发现模式 服务发现的另一种方式是服务端发现模式。图 4-3 展示了该模式的结构: ? 客户端通过负载均衡器向服务发出请求。负载均衡器查询服务注册中心并将每个请求路由到可用的服务实例。 4.6、自注册模式 当使用自注册模式时,服务实例负责在服务注册中心注册和注销自己。此外,如果有必要,服务实例将通过发送心跳请求来防止其注册信息过期。 图 4-4 展示了该模式的结构。 ? 图 4-5 展示了该模式的结构: ? 开源的 Registrator 项目是一个很好的服务注册器示例。它可以自动注册和注销作为 Docker 容器部署的服务实例。
需要做缓存预热(项目启动前,先加载缓存)操作。3.提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。 缓存预热 vs 缓存热备缓存热备即当一台服务器不可用时能实时切换到备用缓存服务器,不影响缓存使用。集群模式下,每个主节点都会有一个或多个从节点来当备用,一旦主节点挂掉,从节点立即充当主节点使用。 代码@DependsOn+@Component@DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中,因为缓存预热这是必须的 class CacheEventSource { public CacheEventSource(){ System.out.println("缓存事件驱动..."); }}@Slf4j 所以需要设计一套通用的预热系统。所谓预热,其实就是提前请求数据,使缓存生效。缓存和预热有关联,但是可以设计成独立的两套系统,此时就可以考虑集成SpringCache或者再起一个项目了。
函数计算有冷启动的问题,如果启用VPC,还有VPC的启动时间,为了避免冷启动问题,可以通过预热程序来避免函数实例被销毁。 此预热程序示例使用Cloudflare Worker,正好同时用预热程序支持Wordpress的定时任务。