自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(114)
  • 收藏
  • 关注

原创 JVM调优

1. JVM常用命令行https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.htmljava -XX:+PrintCommandLineFlags HelloGC——执行HelloGC.java同时打印出堆内存分配情况以及压缩指针启用情况;-XX:InitialHeapSize=199014080-XX:MaxHeapSize=3184225280-XX:+PrintCommandLineFlags -XX:

2022-01-06 20:20:52 577

原创 GC 算法与垃圾回收器

一、三种垃圾清理方法标记清除:扫描两边 + 内存碎片 — (优点)效率高,速度快复制:对象移动 + 内存利用率低 — (优点)无内存碎片,清理速度快标记整理:扫描两边 + 对象移动 + 效率低 — (优点)无内存碎片,内存利用率高二、对象的生命周期尝试在栈中分配 — 进入eden区 — 发生GC — 进入survivor1区 — 进入survivor2区 — 交替在survivor区移动 — 进入old区 — FullGC被清理三、对象所在空间栈上分配的对象线程私有的小对象对象不

2021-12-26 20:31:58 695

原创 Linux各类指令

1. 查看一个命令是内部(shell builtin)还是外部命令(path/…/…)type + 命令内部命令用help查看详细信息,外部命令用man查看2. 进程管理 echo $$:打印当前进程号 ps -ef:看出所有进程3. linux利用hash加速外部指令查找第一次使用外部指令时,linux会做两件事1) 从path环境变量中查找该指令并执行命令行;2) 找到该指令后会将该指令映射到hash表中,下次再调用该指令直接从hash表中获取,不需要再通过环境变量查找;

2021-12-23 21:23:34 1177

原创 Java程序执行过程+Class文件解读

学习JVM的目标(可以写到简历上):熟悉GC常用算法,熟悉常见垃圾收集器,具有实际JVM调优实战经验。1. Java程序执行过程:任何语言只要是.class文件,都能被JVM解释执行从而实现跨平台(即时编译得到的是对应操作系统的机器码文件,所以无法跨平台);JVM与java没有关系,只跟.class文件有关系。JVM执行Java语言时是同时有解释执行和即时编译执行的,JVM会对反复执行的热点方法进行即时编译从而提高程序的执行效率。2. Class文件解读用sublime或者IDEA

2021-12-18 21:05:16 1088

原创 springboot集成javax mail第三方邮件功能避坑,javax.mail.MessagingException: Exception reading response

springboot集成javax mail使用第三方发送邮件时存在各种各样的异常,正常流程大概如下:1. 邮箱开通smtp功能(以126邮箱为例)2. 项目pom文件导入依赖导入以下几个依赖时会报错Exception in thread "main" java.lang.NoSuchMethodError: com.sun.mail.util.TraceInputStream.<init>(Ljava/io/OutputStream;Lcom/sun/mail/util/MailLo

2021-11-14 20:24:26 3222 1

原创 JMH基准测试 & Disruptor单机最快MQ

一、JMH:Java Microbenchmark Harness(java微基准测试)实操步骤新建Maven项目,导入JMH依赖jmh-core / jmh-generator-annprocess编写测试类以及要测试的方法在test包下新建测试类写一个测试方法,导入要测试的方法并加上注解运行测试方法得到测试报告public class JMHTestDemo { @Benchmark /** 预热,让JVM完成即时编译优化 */ @Warmup(iterati

2021-10-22 21:48:04 241

原创 并发容器与线程池

一、容器分类Collection是一个个元素的加到容器;Map是一对对元素的加入容器;Queue主要是为高并发提高服务;物理上只有两种分类:连续存储的数组 + 非连续存储的链表Vector、HashTable是最早期的容器,每个方法都自带Sychronized,基本不用,只需要了解其数据结构;Map高并发时使用ConcurrentHashMap主要是因为它读取数据的速度快,插入数据的速度未必会比HashTable、SychronizedHashMap快;(发展历程:HashTable —

2021-10-22 21:35:24 202

原创 ThreadLocal与涉及的弱引用/虚引用

一、ThreadLocal每个线程拥有一个独有的ThreadLocalMap对象,线程需要自己往里面设值,之后才能读到自己设置的变量值,线程对他们各自拥有的ThreadLocal对象做更改操作时,其他线程是获取不到这些改动的;结合下图分析:线程中set ThreadLocal对象Object o时:是在当前线程的一个map中加入一个K-V,K是一个ThreadLocal,V是我们往这个ThreadLocal容器中加入的一个对象。(也就是说map中一个entry对应一个TreadLocal对象(Key

2021-10-18 17:10:59 2337

原创 Sychronized & Volatile & Atomic& ReentrantLock工具类 & AQS底层实现

一、SynchronizedSynchronized保障的有序性是指多个线程依次执行同步代码块或者同步方法,对于代码块中的多条指令无法保障有序性;Sychronized的对象在new时要加上final(final Object o = new Object; sychronized(o){}),防止该对象被有些线程篡改,因为锁是加在对象头上的,如果o被指向了新的一个对象,那么其他线程就可以重新在该新的对象头上加锁,导致多线程同时访问某个程序块或者方法。Sychronized重量级的体现:锁是由操作系统

2021-10-05 17:54:19 118

原创 线程的三大特性(可见性、有序性、原子性)

一、可见性L1、L2、L3级缓存:缓存中有变量时,如果不加限制,CPU直接从当前最近的缓存读取变量值,不会去内存中读,所以多核并发执行的线程之间可能同一个变量同一时间有不同的值(初始时刻缓存中没有的变量会从内存中读取,然后一级级的保存到缓存中,下次CPU使用时会从最近的缓存中读取该变量)另外,不加限制的话,CPU什么时候将计算好的变量新值写入内存中也是无法预知的。缓存行:为了减少从内存读数据的次数,每次操作系统访问内存空间都会一次性读取64Byte大小的数据,在缓存中以一行的形式存放该64字节数据

2021-10-05 17:03:16 2738

原创 线程基础补充

一、线程切换(上下文切换)当一个线程需要切换到另一个线程时,将该线程在CPU寄存器中的资源放入缓存中,将另一个线程需要的资源从缓存中取出放入CPU寄存器并开始执行。二、线程分类CPU密集型:线程大多数时间在执行CPU运算;IO密集型:线程大多数时间在执行IO;混合型:大多数线程既有CPU运算和又有IO;三、线程数量选择计算公式:N_thread = N_cpu * U_cpu *(1+W/C)W:线程等待时间C:线程利用CPU计算时间(特例:线程运行时间与等待时间相等,所以发挥

2021-10-05 16:34:50 74

原创 系统调用与计算机CPU工作模式

一、系统调用创建进程需要由老的进程执行fork系统调用得到新的子进程;fork:子进程拷贝一份父进程一模一样的数据结构,内存,程序代码等;(先拷贝,再修改)进程的私有内存每个进程启动后都会在内存中分配一块空间;(放程序的代码段 + 进程运行时产生的数据段)进程数据段内存分配局部变量==》栈中;手动回收的数据==》堆中;只有当进程要向内存中写入数据的时候,发现没有对应的物理内存,才会触发中断,被分配一块物理内存(brk系统调用方法会划出少量的内存空间并紧挨着原来的进程数据段;当请求

2021-09-30 10:31:08 512

原创 Linux入门常用命令

一、查看文件列表ls -l# ls -ldrwxr-xr-x 6 root root 4096 Oct 20 2017 apt-rw-r--r-- 1 root root 211 Oct 20 2017 hosts第一个字符是文件类型,d表示目录,-表示普通文件;后面9个字符是三组(三个一组rwx)权限位,依次表示所属用户,所属组以及其他用户对该文件是否有读、写、执行的权限(可以用chmod 711 hosts改变权限);二、安装删除软件rpm -i 文件名.rpm d

2021-09-29 11:04:47 75

原创 JVM循环优化与向量化优化

即时编译器针对循环程序块的编译优化,生成的IR图会改变原有的循环程序块内容 — 外提与展开。(外提就是提取公因式,展开就是减少判断次数)优化一:无关代码外提 — 减少某些程序的重复执行即时编译器会将常值放到循环体外,并且计算一次后会将这些常值放入缓存,每次循环直接从缓存中取数据。int foo(int x, int y, int[] a) { int sum = 0; for (int i = 0; i < a.length; i++) { sum += x * y + a[i]

2021-09-23 21:56:45 387

原创 DNS工作流程(递归查询、迭代查询)、ARP协议

记录一下DNS是怎么根据一个网址查找对应的ip地址的:

2021-09-22 22:49:34 665

原创 JVM字段访问优化

都是通过即时编译器优化生成的IR图来精简最后的机器码(在生成机器码前就好像人浏览了一遍代码,通过前后关联情况手动消除了一些重复或无效的代码),去掉无效代码,减少在code cache中存储的机器码的大小,节省内存,提高程序运行速度。主要包括:缓存读取、去除重复操作、分支优化、不可达分支消除一、对象字段读取优化优化一:缓存读取static int bar(Foo o, int x) { int y = o.a + x; // 将o.a存入缓存 return o.a + y; // 直接从缓

2021-09-22 11:03:12 250

原创 即时编译器的逃逸分析及优化

一、概念逃逸分析:指的是对象是否会逃逸出当前方法,进入堆内存中或者作为参数传入被未知方法引用。如果在堆中那么该对象会被所有线程看见并引用,未知方法包括虚方法,对象传入虚方法中就算逃逸。逃逸分析可以根据逃逸范围实现以下多个编译优化的好处,缺点是分析本身需要消耗一定的CPU资源;逃逸:因为当对象被多个线程引用或者被虚方法引用时,编译器无法定位对象的位置,所以被认为是逃逸了;逃逸范围:(范围由小到大)不逃逸:只在一个方法中被引用(支持同步消除、标量替换、栈上分配优化)方法逃逸:在同一个线程内的多个方法

2021-09-21 13:53:26 131

原创 Java泛型、即时编译JIT、方法内联

一、 泛型泛型的作用就是程序员不用手动进行类型强转了,但是类型转化是不能少的,只不过交给了编译器来做。ArrayList< Object >没有泛型前,在ArrayList中存入String时,编译后元素会被转化成Object,当程序中取用元素时得到的也是Object类型变量,所以要手动向下转化成String类型。有了泛型后编译后字节码中仍然为Object类型(泛型擦除),只不过程序中取用元素时,编译器会帮我们进行类型转化,得到的就直接是String类型元素了。泛型擦除的目的:泛型擦除是为

2021-09-20 17:08:17 297

原创 MyBatis一级二级缓存以及执行sql语句的过程

一、MySQL缓存一级缓存:一次访问数据库的请求会建立一个sqlSession,这个sqlSession会有多条sql语句,MyBatis会将执行过后的数据放到一级缓存,如果该sqlSession执行范围内,前后出现了相同的sql语句,后面的可以直接从缓存拿到数据。注意:同一个事务中的sql语句属于同一个sqlSession,当期间执行了数据库的update操作后,之前的一级缓存会被清空。二级缓存:一次数据库访问请求结束后sqlSession不会被清理,每个nameSpace下都会保留有一份sq

2021-09-20 16:41:58 319

原创 synchronized实现线程同步以及多线程堆栈空间(ThreadLocal内存分配)

一、sychronized实现线程同步底层是将Java代码编译成字节码时添加一条monitorenter和两条monitorexit指令(保证任何情况下锁都能退出),修饰代码块时字节码显式的含有这两条语句,修饰方法时字节码中用一条ACC_SYNCHROZIED声明使用以上两条指令。sychronized的锁对象(类/对象锁):修饰静态方法则获取类锁,加锁的对象是该类的所有对象(因为所有对象共享静态方法);修饰动态方法则获取对象锁,加锁的是该类的当前对象(每个对象有独立的动态方法)—由此可以实现J

2021-09-17 14:01:49 330

原创 Java指令重排与多线程安全

单线程内以及多线程之间的happens-before原则保证线程安全;一、volatile保证线程安全(非原子性)有序性(单线程内有序 / 多线程之间有序) + 可见性(一致性)单线程内:单线程中指令重排不会影响线程处理结果,但是可以使用volatile关键字禁止指令重排(volatile的单线程有序性性质,因为会在方法执行过程中相应程序行处加入内存屏障,会实时刷新缓存空间,即时编译器在寄存器中会按照顺序执行缓存行程序);多线程之间:多线程中指令重排会导致最终结果不一致,可以使用volat

2021-09-16 21:22:39 448

原创 JVM GC垃圾回收

GC Root:由堆外指向堆内的引用方法栈帧中的局部变量已加载类的局部变量JNI handles已启动且未暂停的Java线程一、GC Root可达性分析的问题多线程环境下,某些线程可能会将某对象的引用误置为null(误报,其他线程中这个对象正在被引用),或者没有将自己引用过的对象设置为被引用(漏报),可以用以下STW解决。二、Stop the World(老年代回收有时会出现卡顿)停止所有其他非GC的线程的工作,直至完成本次垃圾回收(本质上其他线程并不一定都被挂起暂停,只要运行在安全.

2021-09-15 11:20:24 65

原创 Spring Bean加载机制中的循环依赖

首先放上Bean加载过程:可以简要概括为几个阶段:Bean的实例化属性赋值初始化使用Bean销毁Bean以上getEarlyBeanReference()的过程简要如下:由于实例化和属性赋值是分开的两个阶段,所以我们可以将Bean先实例化,然后将所有实例化完成的Bean放入第三级缓存中(提前暴露);等到属性赋值时,再从缓存中查找该Bean自身依赖的其他Bean,每当一个Bean被其他Bean从三级缓存中找到后,就会被放入到第二级缓存;最终一个Bean从缓存中找到了

2021-09-14 14:47:31 171

原创 Java对象的内存布局

注:子类构造器需要调用父类的构造器,直到Object类,所以子类实例在建立时会同时在内存中分配它的父类的一些实例字段。16字节对象的对象头 = 8字节标记字段(hashcode、GC、Lock)+8字节类型指针(指向该对象的类)12字节压缩对象头 = 8字节标记字段(hashcode、GC、Lock)+4字节压缩指针(指向该对象的类,将原本的64指针压缩至32位)对象内存布局的三点特性:特性一:内存对齐一个字段未填满规定大小的内存空间时系统会自动填充缺失的字节数(非有效数据),造成内存

2021-09-14 11:28:11 97

原创 Redis 6新特性以及与Memcached、RocksDB比较

1. 多线程网络IO采用epoll的机制,实现一个Redis服务端接收多个客户端的并发网络IO请求(避免有时候Redis服务端处理速度快,而网络IO传输客户端请求慢,造成Redis CPU空闲),网络IO多线程连接,处理请求的还是单线程。2. 客户端缓存Redis服务端一次读取一定数据,将这些key-value缓存在客户端,下次客户端可以直接在自己内存中获取数据(当Redis中某些缓存在客户端的key-value值改变后会以广播形式通知相应的客户端,使得客户端内的数据缓存失效,客户端需要向Redis注

2021-09-08 12:25:54 694

原创 Redis秒杀 + 数据倾斜

一、秒杀秒杀活动主要分为三个阶段:秒杀前:尽量将活动页面静态化,因为此时用户会频繁刷新页面,使用CDN以及浏览器缓存进行加速;秒杀时:查询库存 — 扣减库存 — 支付订单(只有查到库存数据的人才能进行后两步操纵)Redis主要支持原子性的查询库存和扣减库存操作(Lua脚本或者分布式锁),因为并发访问量大,不能交给后端数据库处理,而且上述原子性操作可以保证不会出现库存信息更新延迟导致实际用户查到超额的库存量并完成下单操作(避免超额销售)秒杀后:用户刷新频率变低,并发压力小。建议:

2021-09-06 14:15:39 264

原创 一个互联网行业准就业生写给未来的自己的一封信

写在2021年9月5日,一个社会节奏飞快的时代,特别是在互联网行业,过去百年一变的事物在互联网行业也许只需要十年、一年甚至一个月就会迎来新生。作为即将跨入该行业的准毕业生,滚滚秋招洪流中的一朵小浪花,本人也是一头扎进大江大河中,与所有行业从事者一起角逐,奔跑。就像是一块上了发条的手表,不能停止也不敢停止,因为一旦停下,你将成为永远落后他人的一根秒针。年初三月开始,各个大厂开始招今年暑期的实习生,这个消息对我来说好比一个晴天霹雳,因为我突然意识到周围的同学都已经全副武装在备战实习招聘了,而我似乎还沉浸在对

2021-09-05 13:47:09 210

原创 Redis主从读写分离存在的问题

对比Mysql主从分离问题,数据库的主从分离大概可以从两方面考虑:A) 数据读不一致问题 MySQL:采用事务位点标记的方法,在从库中无法读取到未执行的事务中的数据 + 加速同步措施(多线程刷binlog…) Redis:主从同步延迟监控机制 + 同步删除 + 加速同步措施(RDB大小限制…)B) 主从切换问题 MySQL:主从事务同步位点机制 Redis:哨兵跨服务器访问 + 调整心跳响应上限以下分析Redis中的主从分离问题1. 主从不同步—从库读到旧数据Redi.

2021-09-04 12:26:36 649

原创 Redis的原子操作(SET NX PX,Lua,单、多实例分布式锁 )

摘要:1. 单原子性指令2. Lua脚本原子性执行多指令3. Redis实现分布式锁3.1 单Redis实例保证锁的可靠性和高效性3.1.1 加锁:A) SET NX指令作为加锁的单原子性指令B) 设置锁自动释放的有效时间,看门狗C) 加锁释放锁操作对应唯一的客户端3.1.2 释放锁:A) 使用Lua脚本判断是否是加锁的同一个客户端3.2 Redis master集群保证锁的可靠性+可用性3.2.1 Redlock算法:N/2 +1 条件以及重计算锁有效时间机制ps: 所有并..

2021-09-03 13:44:40 6356

原创 操作系统如何保证一致性、有序性、原子性(Unsafe类以下)

首先放总结图:一、问题引入:Java中广泛使用的CAS技术底层源码都是使用的Unsafe类,而这是一个native方法,本质上绕过了JVM,是由C/C++语言编写的,直接与操作系统底层相关,所以可以实现操作的原子性。那么操作系统底层是如何保证操作的数据一致性、有序性、原子性的呢?一致性:总线窥探原理 + 缓存一致性协议(硬件层面)有序性:解决指令重排问题,内存屏障(软件层面,使用barrier编译器告诉计算机要按照顺序执行这段指令)原子性:缓存一致性协议二、cpu处理数据的过程:每

2021-09-02 16:18:51 1002

原创 静态代理与动态代理

静态代理:真实对象类;代理类;真实对象的方法抽象的接口;代理类与真实类都实现该接口,那么代理类中传入真实类的对象,由代理类调用该接口方法就可以执行真实类的对象中该方法,而且代理类对象可以在调用该抽象方法前、中、后阶段加入自己的执行语句。动态代理:(代理类不绑定真实对象与抽象接口方法)真实对象还是要绑定抽象接口方法;代理类不绑定真实类的对象,而且不具体实现某个抽象接口的方法;在调用代理类时,通过反射获取要代理的真实类对象,然后调用该代理对象的invoke方法时,传入真实类实现的接口方法,

2021-09-01 17:03:14 44

原创 Redis缓存(三)缓存异常的四个方面:数据同步、缓存雪崩、击穿、穿透

先放总结图:异常一:缓存与数据库数据要保持实时一致性如果Redis为只读模式,更新数据时直接更新MySQL里的数据,同时删除Redis里的旧数据;如果Redis为读写模式,更新数据时Redis和MySQL中都要更新,存在两个问题。1. Redis与数据库中各自操作成功/失败的原子性 ------ 成功/失败问题解决方案: 消息队列,更新失败后可以再次从消息队列读取更新信息,再次更新;2. 高并发时,Redis与数据库更新操作间隔时间内有客户端请求,此时得到的数据是旧数据(旧数据可能会

2021-09-01 11:11:39 106

原创 网络IO(BIO,NIO,AIO,Selector,epoll)

内核与用户空间传输数据时的两处阻塞:内核与用户线程传输数据时先建立一条socket连接,之后存在两处阻塞:第一处就是内核要从磁盘读取数据,然后才能进行传输(BIO);第二处就是当内核与用户线程有很多socket连接时,需要判断哪条连接上已经准备好传输数据了(NIO)。一、BIO:只适用于连接数少的情况两处阻塞都存在,用户线程与内核建立连接后,用户线程阻塞等待内核从磁盘获取数据,然后等待内核与用户线程间的socket链路完成数据传输。二、NIO:适用于连接数多,每条连接传输的数据量少的情况s

2021-08-31 22:19:15 224

原创 Redis缓存(二)缓存淘汰策略,脏数据/脏页,缓存污染

一、应该给Redis分配多少内存空间八二原则:80%的请求都是访问数据库中同样的20%的数据(热点数据只占20%),所以一般给Redis分配15% - 30%数据总量的内存空间(只保存热点数据,冷数据被访问少,直接到数据库访问)二、Redis八种内存淘汰机制三、LRU算法传统LRU算法:底层维护一个双向链表,每个节点存放一个数据,当某个数据被访问时,该节点会被放到链表头部(MRU端),当触发内存淘汰时会先删除链表的尾部(LRU端)。缺点:每个数据都要一个链表节点维护,内存开销大,频繁移动链表,

2021-08-31 12:46:18 1196

原创 ReentrantLock(AQS内部结构以及加锁过程),Synchronized与Volatile

可重入锁的内部结构,源码以及程序中是如何重复加锁的,简要总结如下图,方便以后自己回顾

2021-08-30 22:12:23 132

原创 Redis缓存(一):缓存机制与读写策略

一、缓存的两大特点快速父系统中存放慢速子系统的部分高频访问数据,以免快速运行的CPU被慢速的磁盘、内存读写拖累性能(CPU缓存:存放部分内存数据; 内存缓存:存放部分磁盘数据)。缓存只占据父系统存储空间的一部分(约高级的父系统所拥有的存储空间越小)。二、 旁路缓存就是指Redis作为缓存,只能被动的被调用(程序中通过redisTemplate来读写redis内存中的数据,需要显示的手写调用内存的程序块,而其他内存空间可以直接被CPU访问,无需程序员显示调用)。三、 Redis与MySQL配合

2021-08-30 11:12:32 1247

原创 Redis变慢的五大原因以及排查方法

一、 慢操作五大原因如下图所示,主要分为与操作系统相关以及与Redis集群实例之间与内部相关两个方面1. Redis实例之间以及内部数据传输阻塞(客户端、磁盘、主从通信、切片集群通信)解决方法 — 主从集群时,限制主库RDB文件大小。2. 多CPU多核架构(绑核,绑CPU)解决方法—绑核绑CPU。3. sql语句执行阻塞(慢查询、过期key)解决方法—避免慢查询指令、客户端做聚合、对key设置不同的过期时间、使用异步线程删除bigkey。4. AOF文件系统,RDB大内存页(A

2021-08-29 12:33:12 12781

原创 Redis内存空间与缓冲区

一、内存空间删除数据后释放的内存会交给内存分配器,并不会直接返还给操作系统—导致Redis仍然持有这些内存,但实际不能使用。(跟MySQL一样明明删除了数据还是没有显示释放内存,需要经过内存整理操作系统才能获得该部分内存)1. 内存碎片产生的原因操作系统分配内存机制:操作系统每次都是按照固定大小分配内存,8、16、32字节等,会预分配一些内存给程序(为了减少内存分配操作次数);Redis业务复杂,每次增删改查的数据所需内存空间不一致,数据删除修改时会导致内存空间的移动。2. Redis碎片自动

2021-08-28 18:19:51 431

原创 Redis五大影响性能原因(三四五):慢操作

一、慢操作排查处理步骤判断当前情况是否属于慢操作(基线性能);系统性排查慢操作的原因(Redis本身、AOF文件操作磁盘IO、操作系统内存swap磁盘IO);从应对方案中选择合适的方法加快Redis响应速度。二、 如何判断是否是慢操作:用指令查询当前环境下Redis的基线性能,再查询当前应用Redis的延迟,如果达到两倍以上基线性能说明当前是慢操作。三、 排查慢操作3.1 针对Redis本身A) sql语句慢造成延迟:可以用 Redis日志查看sql语句的执行情况,判断是否变慢了(类似

2021-08-27 21:12:28 738

原创 Redis五大影响性能原因(二):多CPU多核架构

一、先放结论:影响原因一(同CPU不同核,多核架构影响):程序在不同核之间切换运行时会有上下文切换(context switch),也就是要将程序原来放在核1上的数据迁移到核2上,影响程序指令执行速度。解决方案:将Redis与某个核绑定,防止Redis进程在不同核之间切换。影响原因二(不同CPU不同核,多CPU架构影响):程序执行时需要通过网络中断程序得到网络数据,当网络中断程序与本程序在不同的CPU上执行时,需要“走远端内存访问”,有通信延迟。解决方案:将网络中断程序与Redis程序

2021-08-26 13:57:48 947 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除