cpu缓存

前端性能优化

邮差的信 提交于 2019-11-30 00:09:00
转自: http://blog.itpub.net/69917606/viewspace-2643472/ 浏览器访问优化 减少 HTTP 请求 - HTTP 请求需要建立通信链路,进行数据传输,开销高昂,所以减少 HTTP 请求数可以有效提高访问性能。减少 HTTP 的主要手段是合并 Css、JavaScript、图片。 使用浏览器缓存 - 因为静态资源文件更新频率低,可以缓存浏览器中以提高性能。设置 HTTP 头中的 Cache-Control 和 Expires 属性,可以设定浏览器缓存。 启用压缩 - 在服务器端压缩静态资源文件,在浏览器端解压缩,可以有效减少传输的数据量。由于文本文件压缩率可达 80% 以上,所以可以对静态资源,如 Html、Css、JavaScrip 进行压缩。 CSS 放在页面最上面,JavaScript 放在页面最下面 - 浏览器会在下载完全部的 Css 后才对整个页面进行渲染,所以最好的做法是将 Css 放在页面最上面,让浏览器尽快下载 Css;JavaScript 则相反,浏览器加载 JavaScript 后立即执行,可能会阻塞整个页面,造成页面显示缓慢,因此 JavaScript 最好放在页面最下面。 减少 Cookie 传输 - Cookie 包含在 HTTP 每次的请求和响应中,太大的 Cookie 会严重影响数据传输。 2.2. CDN

JDK学习笔记

爱⌒轻易说出口 提交于 2019-11-29 23:46:13
jdk学习笔记 类加载 classloader classloader就是负责加载类的一种对象。ClassLoader是抽象类。classloader通过Class的binary name定位和生成定义该类所需要的数据。经典的策略是将binary name转换成文件名,然后从文件系统读取.class文件 每个Class对象都包含一个classLoader引用,指向定义了该Class对象的类加载器 数组的Class对象不是由类加载器创建的,是由Java runtime自动创建 调用数组Class对象的getClassLoader方法返回的是其元素类型的类加载器,如果元素类型是基本类型,那么数组对象就没有类加载器 许多应用通过继承ClassLoader扩展了JVM动态加载类的方式 类加载器还负责定位资源。 类加载器通过委派模型取寻找class文件和资源文件。每个类加载器实例都有父类加载器,当类加载器被要求去搜索某个class或资源时,它会先维护父类加载器去找,找不到的话再自己找 并发加载类 内置类加载器 运行时内置的类加载器: 1.Bootstrap class loader 虚拟机内置的类加载器,通常是null,且没有父 2.Platform class loader 所有platform classes对于platform class loader都是可见的

并发之初章Java内存模型

谁都会走 提交于 2019-11-29 18:21:20
》》》》》》 博客地址 《《《《《《 》》》》》》 首发博客 《《《《《《 前言 首先我们在了解java内存模型之前先看一下计算机内存模型,理解了计算机内存模型的话后面在看JMM就会简单的多,上篇文章我是直接写的。 计算机内存 计算机是由CPU、主存、磁盘等组成的(简单引出问题熬)我们都知道计算机执行程序的指令都是由CPU来执行的,执行的时候是要处理数据的,这些数据通常存储在主存中。 如图所示,这时候问题来了,CPU的执行速度越来越快,然后内存倒是没什么进展,这样的话CPU的读写操作就会非常耗时,效率不就很低了? 所以这个时候就出现了高速缓存(Cache)来解决这个问题,那么缓存是什么呢?缓存其实就是保存的数据备存,特点是快。所以这个时候程序的执行过程就变成了这个样子:首先在运行的时候会把数据从主存中赋值一份放在缓存中,然后CPU在运算的时候就直接去缓存中读写数据,等执行结束后在把数据刷新到主存中。这样一来就大大的提高了执行的速度。我们来看一下流程图: 可以看出,运行的时候L1缓存先把数据从主存中读取出来,然后CPU操作的数据是从缓存中读取,当数据执行完毕,在从缓存中刷新到主存中。随着CPU的执行能力越来越强,一层缓存已经满足不了需求了,这时候就出现了2级缓存(L2Cache)3级缓存(L3Cache),每级缓存都存储的是下一级缓存的一部分数据。

Java8的@sun.misc.Contended注解

一曲冷凌霜 提交于 2019-11-29 17:43:51
@sun.misc.Contended 介绍 @sun.misc.Contended 是 Java 8 新增的一个注解,对某字段加上该注解则表示该字段会单独占用一个 缓存行 (Cache Line)。 这里的缓存行是指 CPU 缓存(L1、L2、L3)的存储单元,常见的缓存行大小为 64 字节。 (注:JVM 添加 -XX:-RestrictContended 参数后 @sun.misc.Contended 注解才有效) ​ @sun.misc.Contended 的作用——避免伪共享 那么单独使用一个缓存行有什么作用? 为了性能和节省空间,一个缓存行可能不止一个变量,里面还会存储着其他变量,即 伪共享 。但是这对于共享变量,会造成性能问题: CPU 修改某共享变量 A 时会先 锁定 A 所在的缓存行,并且把其他 CPU 缓存上相关的缓存行设置为 无效 。如果被锁定或失效的缓存行里,还存储了其他不相干的变量 B,则会造成不必要的 开销 ,因为其他线程此时会访问不了 B,或者由于缓存行失效需要重新从内存中读取加载到缓存。而如果 A 单独使用一个缓存行就可以避免此问题。 ​ Java 8 之前的方案 在 Java 8 之前,是通过代码里手动添加属性的方式解决的,如: class LongWithPadding { long value; long p0, p1, p2, p3, p4,

redis缓存 面试总结

喜你入骨 提交于 2019-11-29 15:19:01
缓存的收益和成本 1、缓存带来的回报 高速读写 :缓存加速读写速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果 降低后端负载 :后端服务器通过前端缓存降低负载: 业务端使用Redis降低后端MySQL负载等 2、缓存带来的代价 数据不一致: 缓存层和数据层有时间窗口不一致,和更新策略有关 代码维护成本:原本只需要读写MySQL就能实现功能,但加入了缓存之后就要去维护缓存的数据,增加了代码复杂度。 堆内缓存可能带来内存溢出的风险影响用户进程,如ehCache、loadingCache: 堆内缓存是由jvm分配的缓存 jvm运行时数据区:堆、java虚拟机栈、方法区、本地方法栈、程序计数器 堆内缓存和远程服务器缓存redis的选择 堆内缓存一般性能更好,远程缓存需要套接字传输 用户级别缓存尽量采用远程缓存 大数据量尽量采用远程缓存,服务节点化原则 redis的特性 redis有哪些特性 丰富的数据类型 可用于缓存,消息按key设置过期时间,过期后自动删除 setex set expire时间 支持持久化方式rdb和aof 主从分布式,redis支持主从支持读写分离 redis cluster,动态扩容方式。 你用过redis的哪几种特性 用sorted Set实现过排行榜项目

CPU缓存

ぐ巨炮叔叔 提交于 2019-11-29 15:08:31
原创转载请注明出处: https://www.cnblogs.com/agilestyle/p/11520840.html 由于CPU发展的速度远快于内存的发展,CPU的处理速度就比内存的访问速度快得多。这样,CPU在访问内存的时候,免不了要等待内存的响应。为了协调这两者巨大的性能差距,CPU缓存(通常是多级缓存)就出现了。 CPU缓存的速度介于CPU和内存之间,缓存的是热点的内存数据。根据不断增长的热点数据,这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中 L1 和 L2 常用在单核中, L3 则用在多核中。从 L1 到 L3,三级缓存的大小依次增大,相应的,性能依次降低(当然比内存还是好得多)。而它们的命中率,衡量的是CPU缓存的复用情况,命中率越高,则表示性能越好。 Reference https://time.geekbang.org/column/article/72685 来源: https://www.cnblogs.com/agilestyle/p/11520840.html

计算机及操作系统原理笔记

半城伤御伤魂 提交于 2019-11-29 11:48:18
CPU :运算器、 控制器、寄存器。(三大核心部件) RAM :内存设备 一个字节为一个存储单元 cell NorthBridge : 32bit 2^32=4GB 32位的CPU最多只能理解4G的物理内存空间 64bit 4GB*4GB CPU------(线路复用)寻址------RAM PAE: 物理地址扩展(physical Address Extension)--给32bit的寻址总线上有添加了4bit 32bit,+4bit =64G (使32位的操作系统CPU最大寻址到64G的内存空间) -前提:内核必须支持额外4bit寻址总线的能力。 现在:当你的内存大于4G时,会直接使用64bit操作系统。 64G的内存:单进程的寻址能力仍为3G,另外1G交给内核了。 拓展:Mysql为单进程多线程的模型 CPU的存取频率远大于RAM,两者速度不匹配,这就需要提供缓存了。 缓存器:比原始存储设备快,但内存很小 , 置换策略:可以保证一旦缓存中没有足够的空间可用而后续的数据又需要载入的时候,能够将缓存空间按序腾出来。 空间局部性:如果一个数据被访问到,那么理他很近的数据也会快被访问到。(提高命中率) 时间局部性:如果一段数据被访问到过一次,那么很快它还可能会被访问一次。 引入缓存后,弥补了CPU和RAM速度的巨大差异。 多级缓存:缓存级别越小离CPU越近。速度也越接近CPU速度。

缓存IO和直接IO

人盡茶涼 提交于 2019-11-29 11:25:42
缓存IO和直接IO 缓存IO: 数据先从磁盘通过DMA copy到内核空间,再从内核空间copy到用户空间。 直接IO: 数据直接从磁盘通过DMA copy到用户空间。 3.1 缓存IO 缓存IO又被称为标准的I/O,大多数文件系统的默认I/O操作都是缓存IO 。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后再从内核空间的缓冲区复制到应用程序的地址空间。 读操作:操作系统检查内核空间的缓冲区有没有需要的数据,如果有就直接从缓存区返回;否则从磁盘中读取,然后再缓存在操作系统的缓存中。 写操作:将数据从用户空间复制到内核空间的缓冲区中。这时候对用户程序来说,写操作已经完成,至于什么时候把数据写到磁盘中是由操作系统决定,除非显示调用sync同步命令( linux 同步IO: sync、fsync与fdatasync ) 缓存IO优点:减少了磁盘读写,提高了系统性能;在一定程度上分离了用户空间和内核空间,保护系统本身运行安全。 缓存IO缺点:在缓存I/O机制中,DMA方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回磁盘上,而不能直接在应用程序的地址空间(用户空间)和缓存(内核空间)之间进行数据传输。这样,数据在传输过程中就需要在应用程序地址空间和缓存之间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU及内存开销是非常大的。 3.2 直接IO

MySQL高级特性四:查询缓存

会有一股神秘感。 提交于 2019-11-29 10:58:07
很多数据库产品都能够缓存查询的执行计划,对于相同类型的SQL就可以跳过SQL解析和执行计划生成截断。MySQL在某些场景下也可以实现,但是MySQL还有另一种不同的缓存类型:缓存完整的select查询结果,也就是查询缓存。 MySQL查询缓存保存查询返回的完整结果。当查询命中该缓存,MySQL会like返回结果,跳过了解析、优化和执行截断。 查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有的缓存数据都将失效。这种机制效率看起来比较低,因为数据表变化时很有可能对应的查询结果没有变更,但是这种简单实现代价很小,而这点对于一个非常繁忙的系统来说非常重要。 查询缓存对应用程序是完全透明的。应用程序无需关心MySQL是通过查询返回的还是实际执行返回的结果。事实上,这两种方式执行的结果是完全相同的。换句话说,查询缓存无需使用任何语法。无论是MySQL开启或关闭查询缓存,对程序都是透明的。 随着现在的通用服务器越来越强大,查询缓存被发现是一个影响服务器扩展性的因素。它可能成为整个服务器的资源竞争单点,在多核服务器上还可能导致服务器僵死。所以大部分时候应该默认关闭查询缓存,如果查询缓存作用很大的话,可以配置个几十兆的小缓存空间。 1 MySQL如何判断缓存命中 MySQL判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括了如下因素:

利用系统缓存优化程序的运行效率

对着背影说爱祢 提交于 2019-11-29 10:16:20
准备知识 Buffer 和Cache 的设计目的,是为了提升系统的 I/O 性能。它们利用内存,充当起慢速磁盘与快速 CPU 之间的桥梁,可以加速 I/O 的访问速度 buffers是内核缓存区用到的内存,对应的是/pro/meminfo中的buffers值 cache是内核页缓存和Slab用到的内存,对应的是/proc/meminfo中的cached和SReclaimable的和 Buffer 和 Cache 分别缓存的是对磁盘和文件系统的读写数据。 缓存命中率 直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比 ,命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。 工具 cachestat 提供了整个操作系统缓存的读写命中情况。 cachetop 提供了每个进程的缓存命中情况 这两个工具都是 bcc 软件包的一部分,它们基于 Linux 内核的 eBPF(extended Berkeley Packet Filters)机制,来跟踪内核中管理的缓存,并输出缓存的使用和命中情况 ubuntu 安装bcc-tools sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD echo "deb https://repo.iovisor.org/apt