漫画:性能、可用性和锁

简介: 经过了几天的熟悉环境,小鱼开始让飞鸟尝试负责解决一些问题。分配的第一个问题现象是这样的: 接口有偶尔的超时现象。平时的时候接口可以在2s响应调用的上游。但是偶尔会有几次,超时特别严重,有时候20s、30s才返回。但是上游的超时时间是10s。所以这时候上游是拿不到结果的。对上游来说这次请求失败了。 飞鸟通过排查,找到了一些线索,就抱着电脑去找小鱼。

 

   经过了几天的熟悉环境,小鱼开始让飞鸟尝试负责解决一些问题。分配的第一个问题现象是这样的:


   接口有偶尔的超时现象。平时的时候接口可以在2s响应调用的上游。但是偶尔会有几次,超时特别严重,有时候20s、30s才返回。但是上游的超时时间是10s。所以这时候上游是拿不到结果的。对上游来说这次请求失败了。


   飞鸟通过排查,找到了一些线索,就抱着电脑去找小鱼。


1112728-20180622233607240-1158765618.png


   接口超时造成的上游请求失败是一个可用性的问题。为了解决这个问题,就需要优化系统,提高响应速度,这是一个性能的问题。具体到问题里,因为用到了锁,对性能造成了影响。可以通过优化这个锁性能来解决。即:


目标:


       可用性


手段:


       性能优化


抓手:


       优化锁性能

 

     可用性和性能不同的人有不同的理解。


     可用性一般指正常运行时间占总时间的百分比。对上游来说,超时是一种不可用状态。


     性能是指系统或服务在具体事情的时候表现如何。严格来说可用性也是性能的一个指标。


1112728-20180622233648838-234257738.png


对于单接口来说,接口不可用大体分为下面四个方面:


  1. 接口内部异常


这个多为系统bug,如常见的空指针NPE、内存泄漏等。


根据问题解决问题即可。


     b.接口没在限定的时间内返回


如今天的锁等待导致的超时问题。


这个问题解决一般需要依赖监控数据,如各个链路调用的处理时间。根据各个环节耗时情况和处理逻辑进行相应优化。常用优化方式如:异步化、并行化、改造耗时逻辑等。


     c.接口不提供服务


如接口被降级或者系统崩溃。


解决这个问题需要从系统和架构上考虑。


     d.接口响应其他原因没到达调用方


       如被限流、网络不通等。


       解决这个问题系统要做好服务治理和全链路监控。


1112728-20180604092712892-1089009208.png


性能方面,今天就先说一下一些性能参考指标:


  • 执行时间


  一段代码从开始运行到运行结束所使用的时间。


  • CPU时间


  (算法)函数或者线程占用CPU的时间。


  • 内存分配


  程序在运行时占用的内存空间


  • 磁盘吞吐量


  描述I/O的使用情况


  • 网络吞吐量


  描述网络的使用情况


  • 响应时间


  系统对某用户行为或者动作做出响应的时间


1112728-20180604092727098-1911928755.png


最后说一下锁,分布式锁比传统的线程锁和进程锁开销要大很多,但是它解决了跨JVM来进行共享资源的访问问题。目前主要有三种实现:


  1. 基于数据库实现的分布式锁


  1. 基于缓存实现的分布式锁


  1. 基于zookeeper实现的分布式锁


   不管是哪种锁,一旦用到锁,就说明是阻塞式的。所以再并发度上一般来说都会比无锁的情况低一点。锁优化的思路和方法总结一下,有以下几种:


  1. 减少锁持有时间


  1. 减小锁粒度


  1. 锁分离


  1. 锁粗化


  1. 锁消除


1112728-20180622233746873-638459360.png


1112728-20180622233759535-1072844303.png


相关文章
|
9月前
|
消息中间件 前端开发 NoSQL
腾讯面试:什么锁比读写锁性能更高?
在并发编程中,读写锁 ReentrantReadWriteLock 的性能已经算是比较高的了,因为它将悲观锁的粒度分的更细,在它里面有读锁和写锁,当所有操作为读操作时,并发线程是可以共享读锁同时运行的,这样就无需排队执行了,所以执行效率也就更高。 那么问题来了,有没有比读写锁 ReentrantReadWriteLock 性能更高的锁呢? 答案是有的,在 Java 中,比 ReentrantReadWriteLock 性能更高的锁有以下两种: 1. **乐观锁**:乐观锁是一种非阻塞锁机制,它是通过 Compare-And-Swap(CAS)对比并替换来进行数据的更改的,它假设多个线程(
78 2
|
5月前
|
缓存 NoSQL 程序员
高并发下的生存之道:如何巧妙化解热Key危机?
本文详细探讨了互联网高并发场景下的热Key问题及其解决方案。热Key即因频繁访问导致缓存压力激增,影响系统稳定性。作者小米介绍了多种应对策略,包括Redis集群、主从复制、本地缓存、限流及Key加随机值等技术手段,旨在帮助读者有效分散负载,确保服务稳定。此外,还提供了兜底逻辑如降级处理和预热机制,以应对突发流量。希望本文能帮助大家更好地理解和解决热Key问题。
81 1
高并发下的生存之道:如何巧妙化解热Key危机?
|
6月前
|
架构师 NoSQL 中间件
挑战架构师极限:分布式锁的四种实现方式,优劣对比让你一目了然!
【8月更文挑战第29天】在2024年软考架构师考试中,掌握分布式锁的实现方法极其重要。本文详细介绍了基于数据库、Redis及ZooKeeper三种常见分布式锁方案。数据库锁简单易懂但性能低;Redis锁性能优越且支持自动续期,但需引入中间件;ZooKeeper锁可靠性高,适用于分布式环境,但实现复杂。通过对比各方案优缺点,帮助考生更好地应对考试,选择最适合业务场景的分布式锁策略。
523 0
|
6月前
|
存储 缓存 NoSQL
进程内缓存助你提高并发能力!
进程内缓存助你提高并发能力!
|
6月前
|
缓存 关系型数据库 MySQL
MySQL调优秘籍曝光!从索引到事务,全方位解锁高可用秘诀,让你的数据库性能飞起来!
【8月更文挑战第6天】MySQL是顶级关系型数据库之一,其性能直接影响应用的高可用性与用户体验。本文聚焦MySQL的高性能调优,从索引设计到事务管理,逐一解析。介绍如何构建高效索引,如联合索引`CREATE INDEX idx_order_customer ON orders(order_id, customer_id);`,以及索引覆盖查询等技术。
94 0
|
8月前
|
缓存 并行计算 安全
【并发编程系列一】并发编年史:线程的双刃剑——从优势到风险的全面解析
【并发编程系列一】并发编年史:线程的双刃剑——从优势到风险的全面解析
|
8月前
|
算法 Java 开发者
深入理解死锁的原因、表现形式以及解决方法,对于提高Java并发编程的效率和安全性具有重要意义
【6月更文挑战第10天】本文探讨了Java并发编程中的死锁问题,包括死锁的基本概念、产生原因和解决策略。死锁是因线程间争夺资源导致的互相等待现象,常由互斥、请求与保持、非剥夺和循环等待条件引起。常见死锁场景包括资源请求顺序不一致、循环等待等。解决死锁的方法包括避免嵌套锁、设置锁获取超时、规定锁顺序、检测与恢复死锁,以及使用高级并发工具。理解并防止死锁有助于提升Java并发编程的效率和系统稳定性。
446 0
|
消息中间件 缓存 NoSQL
面试官:如何设计一个高并发系统?我:就这?
说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了。为啥?因为你没看到现在很多公司招聘的D里都是说啥,有高并发就经验者优先。 如果你确实有真才实学,在互联网公司里干过高并发系统,那你确实拿 offer基本如探囊取物,没啥问题。面试官也绝对不会这样来问你,否则他就是蠢。
|
缓存 NoSQL 安全
并发-分布式锁质量保障
并发问题是电商系统最常见的问题之一,例如库存超卖、抽奖多发、券多发放、积分多发少发等场景;之所以会出现上述问题,是因为存在多机器多请求同时对同一个共享资源进行修改,如果不加以限制,将导致数据错乱和数据不一致性;解决并发问题的方式有很多,例如:队列、异步、响应式、锁都可以;由于当前互联网都是分布式系统,因此本文只针对使用较为广泛的分布式锁的方式来进行叙述如何进行质量保障
|
NoSQL 测试技术 Linux
并发-分布式锁质量保障总结
并发问题是电商系统最常见的问题之一,例如库存超卖、抽奖多发、券多发放、积分多发少发等场景;之所以会出现上述问题,是因为存在多机器多请求同时对同一个共享资源进行修改,如果不加以限制,将导致数据错乱和数据不一致性;解决并发问题的方式有很多,例如:队列、异步、响应式、锁都可以;由于当前互联网都是分布式系统,因此本文只针对使用较为广泛的分布式锁的方式来进行叙述如何进行质量保障。
并发-分布式锁质量保障总结

相关实验场景

更多