缓存

线上nginx proxy buffer导致的性能问题

时光毁灭记忆、已成空白 提交于 2020-04-05 16:31:08
最近有一个项目访问量突然变大,但发现前端的nginx负载会很高,导致出现4xx和5xx的异常,响应时间也变长了。今天有时间,解决了一下。下面记录一下解决思路和方法。 我们这个项目部署在azure。最前端是azure 的负载均衡器(lb),lb后面是2台nginx主机,型号是D2v3(2核8G)。在我们实际使用中,一台nginx主机rpm达到30k,cpu,内存,网络都是没有任何压力的。所以一台主机支持的最大访问量应该远远大于30k。但今天这个项目rpm撑到3k的时候,系统负载就很高了。这个项目后端应用向客户端下发一些数据,所以会比一般的项目流量大上很多。 下面是处理过程: 1、查看监控 通过grafana发现,系统cpu负载已经超过了2,最高的时候都超过了3,并且cpu消耗在io上的时间平均占到了20%左右。通过对比同时段的磁盘读写情况,基本可以断定是磁盘IO不够导致的。 但是磁盘IO为什么会不够呢? 2、磁盘IO慢,首先想到的是不是因为日志写的太多了。所以尝试给nginx设置日志buffer和刷新时间。 给access_log 增加两个参数buffer=512k flush=2s。表示日志攒够512k写一次磁盘。如果buffer没写满,强制2秒写一次磁盘。 修改后,观察效果,发现变化不大。所以断定,应该不是写日志导致的。 3、通过iostat命令来确定是那块磁盘有问题。

缓存穿透、击穿、雪崩区别和解决方案

你说的曾经没有我的故事 提交于 2020-04-05 15:35:26
转自公众号: 自强学堂 文中的cache指缓存,比如redis,db指数据库,比如mysql。 一、缓存的三种模式 这里主要指的是应用代码对 cache 和 db 中数据的维护方式。 1.1 应用代码同时更新 cache 和 db a)数据写入流程 b)数据读取流程 1.2 应用代码只更新 cache,cache 负责同步更新 db 此时可以将 cache 和 db 看成一个整体,db 自己维护 cache。 1.3 应用方代码更新缓存,另外将 cache 中数据定期更新到 db 类似于 Linux 文件系统中的 page cache。 这个可能会导致数据不一致,甚至数据丢失。 二、缓存使用要注意的问题 当缓存使用不当时,可能会导致请求瞬间打到db,db 扛不住挂掉。 常见的有以下三种问题。 2.1 缓存穿透 概念说明:指 cache 和 db 中都没有数据,读完 cache 没有,再读 db 还是没有,每次请求到 cache 和 db。 解决方法: a).拦截非法请求,比如不正常的 id 请求直接拒绝。 b).没有数据时也 cache 下,过期时间可设置短点,不把过多请求打到 db 去。 c).使用 Write Behind Caching 模式,命中不了 cache 不读取 db。这时需要注意 cache 大小,此时的数据都存在了内容。 d).采用布隆过滤器,不存在的 key

volatile 关键字

拟墨画扇 提交于 2020-04-04 17:53:52
摘抄并用于学习笔记 1. volatile 简介   volatile 是并发编程中另一知识点,与 Synchronized 各领风骚。   synchronized 是阻塞式同步,在线程竞争激烈的情况下会升级成重量级锁。而 volatile 就是 java 虚拟机提供的最轻量级的同步机制。Java 内存模型告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进行操作后何时会写到主内存中?这个时机对普通变量是没有规定的,而针对 volatile 修饰的变量给 Java 虚拟机特殊的约定,线程对 volatile 变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的“可见性”。   现在我们有了一个大概的印象就是:被 volatile 修饰的变量能够保证每个线程获取该变量时是新值,从而避免出现数据脏读的现象。 2. volatile 实现原理   在生成汇编代码时会在 volatile 修饰的共享变量进行写操作的时候多出 Lock 前缀的指令。   为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存(L1,L2 或 其他)后再进行操作,但操作完不知道何时会写到内存。如果对声明了 volatile 的变量进行写操作,JVM 就会向处理器发送一条 Lock 前缀的指令

缓存穿透、缓存击穿、缓存雪崩区别和解决方案

做~自己de王妃 提交于 2020-04-04 10:41:28
一、缓存处理流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。 二、缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。 解决方案: 1.接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截; 2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一 个id暴力攻击 三、缓存击穿 描述: 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力 解决方案: 1.设置热点数据永远不过期。 2.加互斥锁,互斥锁参考代码如下: 说明: 1)缓存中有数据,直接走上述代码13行后就返回结果了 2)缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。 3

centos7,yum安装工具报错

限于喜欢 提交于 2020-04-04 09:09:52
1.问题描述:yum安装gcc和其他的工具时一直报错: 2.问题解决: 网上看到有类似文章: No more mirrors to try. 得知这可能是错误的缓存源导致,直接两个命令解决: yum clean all(清理) yum makecache 补充: yum makecache就是把服务器的包信息下载到本地电脑缓存起来 配合yum -C search xxx使用 不用上网检索就能查找软件信息 执行完 yum makecache之后,你可以用 yum search subversion 和 yum -C search subversion 试下,看看二者速度差别有多大。我试的结果,二者差别挺明显的,前者明显比后者慢。 3.执行完成后即可使用 yum install gcc yum install gcc-c++ 安装 分类: 操作系统 1.问题描述:yum安装gcc和其他的工具时一直报错: 2.问题解决: 网上看到有类似文章: No more mirrors to try. 得知这可能是错误的缓存源导致,直接两个命令解决: yum clean all(清理) yum makecache 补充: yum makecache就是把服务器的包信息下载到本地电脑缓存起来 配合yum -C search xxx使用 不用上网检索就能查找软件信息 执行完 yum

HTML5学习(16)应用程序缓存

╄→尐↘猪︶ㄣ 提交于 2020-04-04 07:32:21
什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。 应用程序缓存为应用带来三个优势: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载得更快 减少服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。 Cache Manifest 基础 如需启用应用程序缓存,请在文档的<html> 标签中包含 manifest 属性: <!DOCTYPE HTML> <html manifest="demo.appcache"> ... </html> manifest 文件的建议的文件扩展名是:".appcache"。 请注意,manifest 文件需要配置正确的 MIME-type,即 "text/cache-manifest"。必须在 web 服务器上进行配置。 Manifest 文件 manifest 文件是简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容)。 manifest 文件可分为三个部分: CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存 NETWORK - 在此标题下列出的文件需要与服务器的连接,且不会被缓存 FALLBACK - 在此标题下列出的文件规定当页面无法访问时的回退页面(比如 404 页面)

了解Kafka生产者

不打扰是莪最后的温柔 提交于 2020-04-03 23:01:12
了解Kafka生产者 ​ 之前对kafka的整体架构有浅显的了解,这次正好有时间,准备深入了解一下kafka,首先先从数据的生产者开始吧。 生产者的整体架构 ​ 可以看到整个生产者进程主要由两个线程进行协调工作,其中一个是主线程,首先由KafkaProducer创建消息,然后通过拦截器、消息序列化器、分区器的处理后,缓存到消息累加器中。另一个是Sender线程,负责从消息累加器中获取消息,并发送至Kafka集群中。 ​ 下面来具体分析各个组件的作用,以便加深了解。 拦截器 : 从名字就可看出是按照一定规则对消息进行过滤。这个具体的规则可以自己去重写kafka中的ProducerInterceptorPrefix类中的onSend方法来实现。之后在KafkaProducer的配置参数 interceptor.classes中指定该拦截器来进行使用。还可以指定多个拦截器,组成拦截链。 序列化器 :生产者需要使用它将消息对象转化为字节数组发送给kafka集群。消费者端进行反序列化还原消息对象。kafka中自带序列化器StringSerializer可对String、VyteArray、ByteBuffer等等类型进行序列化。kafka支持自定义序列化器,实现Serializer,重写serialize方法,即可实现自定义序列化器。修改配置文件中的value

小程序清除缓存功能如何实现

家住魔仙堡 提交于 2020-04-03 22:07:14
小程序清除缓存功能如何实现 Wxml: <button type="primary" class="clear" bindtap="clearStorage" loading="{{loading}}" disabled="{{disabled}}">清空缓存</button> Js: clearStorage: function(){ var that = this; that.setData({ loading:true, disabled:true }); that.update(); wx.clearStorage({ success:function(){ that.setData({ loading:false, disabled:false, toast1Hidden:false }); that.update(); } }); }, 文章来源: 刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言、评论。 来源: https://www.cnblogs.com/lovebing/p/9474308.html

HTTP 缓存

♀尐吖头ヾ 提交于 2020-04-03 16:05:55
通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本。因此,缓存和重用以前获取的资源的能力成为优化性能很关键的一个方面。 Contents 使用 ETag 验证缓存的响应 Cache-Control 定义最优 Cache-Control 策略 废弃和更新已缓存的响应 缓存检查表 好消息是每个浏览器都实现了 HTTP 缓存! 我们所要做的就是,确保每个服务器响应都提供正确的 HTTP 头指令,以指导浏览器何时可以缓存响应以及可以缓存多久。 如果在应用中使用 Webview 来获取和显示网页内容,可能需要提供额外的配置标志,以确保启用了 HTTP 缓存,并根据用途设置了合理的缓存大小,同时,确保缓存持久化。查看平台文档并确认您的设置! 服务器在返回响应时,还会发出一组 HTTP 头,用来描述内容类型、长度、缓存指令、验证令牌等。例如,在上图的交互中,服务器返回了一个 1024 字节的响应,指导客户端缓存响应长达 120 秒,并提供验证令牌( x234dff ),在响应过期之后,可以用来验证资源是否被修改。 使用 ETag 验证缓存的响应 TL;DR 服务器通过 ETag HTTP 头传递验证令牌 通过验证令牌可以进行高效的资源更新检查:如果资源未更改,则不会传输任何数据。

前端性能优化(十一)

南楼画角 提交于 2020-04-03 16:05:32
HTTP 缓存 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本。因此,缓存和重用以前获取的资源的能力成为优化性能很关键的一个方面。 好消息是每个浏览器都实现了 HTTP 缓存! 我们所要做的就是,确保每个服务器响应都提供正确的 HTTP 头指令,以指导浏览器何时可以缓存响应以及可以缓存多久。 如果在应用中使用 Webview 来获取和显示网页内容,可能需要提供额外的配置标志,以确保启用了 HTTP 缓存,并根据用途设置了合理的缓存大小,同时,确保缓存持久化。查看平台文档并确认您的设置! 服务器在返回响应时,还会发出一组 HTTP 头,用来描述内容类型、长度、缓存指令、验证令牌等。例如,在上图的交互中,服务器返回了一个 1024 字节的响应,指导客户端缓存响应长达 120 秒,并提供验证令牌( x234dff ),在响应过期之后,可以用来验证资源是否被修改。 使用 ETag 验证缓存的响应 让我们假设在首次获取资源 120 秒之后,浏览器又对该资源发起了新请求。首先,浏览器会检查本地缓存并找到之前的响应,不幸的是,这个响应现在已经’过期’,无法在使用。此时,浏览器也可以直接发出新请求,获取新的完整响应,但是这样做效率较低,因为如果资源未被更改过