- 浏览: 361903 次
- 性别:
- 来自: 北京
最新评论
文章列表
Reference: https://time.geekbang.org/column/article/112160
背景
生产环境中可以用生产者消费者模式来实现瞬时高并发的流量削峰,然而这样做虽然缓解了消费方的压力,但生产方则会因为瞬时高并发,而发生大量线程阻塞。面对这样的情况,有什么方式可以优化线程阻塞所带来的性能问题吗?
无论我们的程序优化得有多么出色,只要并发上来,依然会出现瓶颈。虽然生产者消费者模式可以帮我们实现流量削峰,但是当并发量上来之后,依然有可能导致生产方大量线程阻塞等待,引起上下文切换,增加系统性能开销。这时,可以考虑在接入层做限流。
限流的实现方 ...
2PC
是计算机网络尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性而设计的算法。
协议说明
2PC是将事务的提交过程分成了两个阶段进行处理
阶段一:提交事务请求(投票阶段)
阶段二:执行事务提交(执行阶段)
在阶段二中,协调者会根据参与者的反馈情况来决定最终是否可以进行事务提交操作,正常情况下,包含以下两种可能
执行事务提交
中断事务
简单来说,2PC将一个事务的处理过程分为投票和执行两个阶段,其核心是对每个事务都采用先尝试后提交的处理方式,因此可以将2PC看作是一个强一致性的算法。
优缺点
2 ...
线程start和run方法的区别
- 博客分类:
- Concurrent
原创转载请注明出处:https://agilestyle.iteye.com/blog/2442943
start
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程随即终止。
start方法源码示例
一个 Java 线程的创建本质上就对应了一个本地线程(native thre ...
原创转载请注明出处:https://agilestyle.iteye.com/blog/2442929
三种基本状态
运行态:占有CPU,并在CPU上运行
就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行
阻塞态:因等待某一事件而暂时不能运行
进程状态
进程状态转换
原创转载请注明出处:https://agilestyle.iteye.com/blog/2442900
先删缓存还是先更新数据库?
更新缓存的4中设计模式
Cache aside
Read through
Write through
Write behind caching
Cache aside
失效:应用程序先从cache取数据,没有得到,则从数 ...
缓存穿透
缓存穿透是指缓存没有发挥作用,业务系统虽然去缓存中查询数据,但缓存中没有数据,业务系统需要再次去存储系统中查询数据。
通常情况下有两种情况:存储数据不存在,以及生成缓存数据需要耗费大量时间或资源。
缓存雪崩
缓存雪崩是指当缓存失效(过期)后引起系统系统性能急剧下降的情况。
缓存雪崩的常见解决办法有两种:更新锁机制和后台更新机制。
缓存热点
缓存热点指大部分甚至所有的业务请求都命中同一份缓存数据。
缓存热点的解决方案就是复制多份缓存,将请求分散到多个缓存服务器,减轻缓存热点导致的单台缓存服务器压力。
Redis为什么这么快
- 博客分类:
- NoSQL
Redis是单进程单线程的工作模式
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4、使用多路I/O复用模型,非阻塞IO;
5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样, ...
ThreadLocal内存泄漏
- 博客分类:
- Concurrent
原创转载请注明出处:https://agilestyle.iteye.com/blog/2442834
内存泄漏
内存泄漏是指不再使⽤的对象⽆法得到及时的回收,持续占⽤内存空间,从⽽造成内存空间的浪费。
内存溢出
内存溢出则是发⽣了OutOfMemoryException,内存 ...
原创转载请注明出处: https://agilestyle.iteye.com/blog/2442819
CPU利用率:指CPU “忙碌”的时间占总时间的比例
系统吞吐量:指单位时间内完成作业的数量
周转时间:指从作业被提交给系统开始,到作业完成为止的这段时间间隔
等待时间:指进程或作业等待处理机状态时间之和
响应时间:指从用户提交请求到首次产生响应所用的时间
Reference: https://time.geekbang.org/column/article/108139
参考指标
GC频率:⾼频的FullGC会给系统带来⾮常⼤的性能消耗,虽然MinorGC相对FullGC来说好了许多,但过多的MinorGC仍会给系统带来压⼒。
内存:这⾥的内存指的是堆内存⼤⼩ ...
Reference:https://time.geekbang.org/column/article/107396
GC算法
JVM提供了不同的回收算法来实现这⼀套回收机制,通常垃圾收集器的回收算法可以分为以下⼏种:
如果说收集算法是内存回收的⽅法论,那么垃圾收集器就是内存回 ...
原创转载请注明出处:https://agilestyle.iteye.com/blog/2442599
OSI 模型把网络互联的框架分为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层等七层,每个层负责不同的功能。其中,
应用层,负责为应用程序 ...
并发编程常见术语
- 博客分类:
- Concurrent
原创转载请注明出处:https://agilestyle.iteye.com/blog/2442474
并发编程领域可以抽象成三个核心问题:分工、同步、互斥。
并发:指两个或多个事件在同一时间间隔内发生,这些事件宏观上是同时发生的,但微观上是交替发生的。比如:某天上午先约女生A出去玩,再约女生B出去完
并行:指两个或多个事件在同一时刻同时发生。比如:某天上午同时约两个女生出去玩
程序:指的是一个指令序列。
进程控制块PCB:指的是系统为每个运行的程序配置的一个数据结构,用来描述进程的各种信息(如程序代码的存放位置)。
进程实体:由程序段、数据段、PCB三部 ...
协程与线程
- 博客分类:
- Concurrent
Reference:https://time.geekbang.org/column/article/104521
协程的实现原理
协程不只在Go语言中实现了,其实目前大部分语言都实现了自己的一套协程,包括C#、erlang、python、lua、javascript、ruby等。
相对于协程,你可能对进程和线程 ...
Linux命令行工具之pidstat命令
- 博客分类:
- Linux
原创转载请注明出处:https://agilestyle.iteye.com/blog/2442433
pidstat命令就可以帮助我们监测到具体线程的上下文切换
通过pidstat -help命令,可以查看到有以下几个常用参数可以监测线程的性能:
常用参数:
-u:默认参数,显示各个进程的cpu使用情况;
-r:显示各个进程的内存使用情况;
-d:显示各个进程的I/O使用情况;
-w:显示每个进程的上下文切换情况;
-p:指定进程号;
-t:显示进程中线程的统计信息
首先,通过pidstat -w -p pid 命令行,我们可以查看到进程的上下文切换:
cs ...