如何减小行锁对性能的影响 – Jrient

标签: | 发表时间:2020-09-04 20:47 | 作者:
出处:http://blog_wp.jrient.cn

mysql的行锁是在引擎层由各个引擎自己实现的,但并不是所有的引擎都支持行锁。
比如MyISAM就不支持行锁。不支持行锁就意味着并发控制只能使用表锁,这就会影响并发处理的效率。

两阶段锁

在Innodb事务中,行锁是在需要的时候才加上的,在事务结束的时候才会去释放。这就是两阶段锁协议。
因此,如果你的事务中需要锁多个行,要把最可能赵成锁冲突、最有可能影响并发度的锁尽量往后放。

死锁和检测

当并发系统中不同线程出现循环资源依赖,涉及的线程都在相互等待别的线程释放资源时,就会导致这几个线程进入无限等待的状态,称之为死锁。
当出现死锁之后,我们有两种策略进行处理:
1. 直接进入等待状态,知道超时。超时时间可以通过参数 innodb_lock_wait_timeout来设置
2. 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一事务,让其他事务得意继续执行。设置参数 innodb_deadlock_detect设置为 on,来开启这个功能。

在innodb中, innodb_lock_wait_timeout的默认值是50s,意味着如果采用第一个策略,当出现死锁以后,第一个被锁住的线程要过50s才会超时退出,其他线程才有可能继续执行。
对于这么长的等待时间,对业务来说往往是不能接受的,但是将等待时间设置过短,又会导致误伤正常的所等待。因此我们还是尽量采用第二种策略。
默认 innodb_deadlock_detecton。主动死锁检测在发生死锁的时候是可以快速的发现并处理,但是它也会有额外的负担。一旦被死锁的行是热点行,对于时间复杂度是O(n)的死锁检测来说,将会小号大量的cpu资源。
因此我们就需要讨论如何解决由于这种热点行更新导致的性能问题。
一种方案是,如果能确保业务一定不会出现死锁,那就可以临时把死锁检测关掉。但是这种操作本身带有一定的风险,一旦出现死锁就会带来大量的请求超时,这是业务有损的。
另一种方案是控制并发度。比如同一行同时最多只有10个线程在更新,那么死锁检测的成本就很低。但是一旦用户量比较大的时候,是无法保证并发数的。因此可以考虑在数据库服务端,采用中间件的形式操作,对于相同行的更新,进入引擎之前进入队列排队。
还有一种方案是通过业务设计的角度来优化这个问题。可以考虑通过将一行改成逻辑上多行来减少行锁的冲突,更新操作随机命中其中一行,这样就可以减少死锁检测的CPU消耗。

相关 [性能 jrient] 推荐:

如何减小行锁对性能的影响 – Jrient

- -
mysql的行锁是在引擎层由各个引擎自己实现的,但并不是所有的引擎都支持行锁. 不支持行锁就意味着并发控制只能使用表锁,这就会影响并发处理的效率. 在Innodb事务中,行锁是在需要的时候才加上的,在事务结束的时候才会去释放. 因此,如果你的事务中需要锁多个行,要把最可能赵成锁冲突、最有可能影响并发度的锁尽量往后放.

MySQL 性能

- - 谁主沉浮
这里罗列了一些基本的 MySQL 性能提示,但不是放之四海而皆准,需要根据实际的应用情况而决定. 使用标准化设计(数据库三范式),记住表的联合查询(join)性能不会差. 选择合适的字符集,虽然UTF16无所不能,但需要两倍的存储;UTF8适合各种字符,但比latin1慢,尽可能选用latin1(此条不适合中文).

性能监控

- - 互联网 - ITeye博客
一旦你的服务器是在控制台模式下运行,你就可以开始我们接下来的内容. iostat  iostat 命令用来显示存储子系统的详细信息,通常用它来监控磁盘 I/O 的情况. 要特别注意 iostat 统计结果中的 %iowait 值,太大了表明你的系统存储子系统性能低下. meminfo 和 free  Meminfo 可让你获取内存的详细信息,你可以使用 cat 和 grep 命令来显示 meminfo 信息: 1 cat /proc/meminfo  另外你可以使用 free 命令来显示动态的内存使用信息,free 只是给你大概的内存信息,而 meminfo 提供的信息更加详细.

高性能mysql 之 性能剖析

- - 数据库 - ITeye博客
1 定义性能优化 mysql服务器性能,此处定义为 响应时间. 在解释性能优化之前,先来消除一个误解,很多人认为,性能优化就是降低cpu的利用率或者减少对资源的使用. 资源时用来消耗并用来工作的,所以有时候消耗更多的资源能够加快查询速度,保持cpu忙绿,这是必要的. 很多时候发现 编译进了新版本的InnoDB之后,cpu利用率上升的很厉害,这并不代表性能出现了问题.

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

HBase性能调优

- - 学着站在巨人的肩膀上
我们经常看到一些文章吹嘘某产品如何如何快,如何如何强,而自己测试时却不如描述的一些数据. 其实原因可能在于你还不是真正理解其内部结构,对于其性能调优方法不够了解. 本文转自TaoBao的Ken Wu同学的博客,是目前看到比较完整的HBase调优文章. 原文链接:HBase性能调优. 因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.

mongodb性能测试

- - 数据库 - ITeye博客
1) Mongodb的非安全插入方式,在一开始插入性能是非常高的,但是在达到了两千万条数据之后性能骤减,这个时候恰巧是服务器24G内存基本占满的时候(随着测试的进行mongodb不断占据内存,一直到操作系统的内存全部占满),也就是说Mongodb的内存映射方式,使得数据全部在内存中的时候速度飞快,当部分数据需要换出到磁盘上之后,性能下降很厉害.

JDBC性能小贴

- - 开源软件 - ITeye博客
本文收集了一些用于提升JDBC性能的方法. Java应用或者JavaEE Web应用的性能是很重要的,尤其是数据库后端对应用的性能影响. 不知你是否经历过Java、JavaEE web应用非常慢的案例没有(处理一个简单的请求都要花上好几秒的时间用于数据库访问,分页、排序等). 下面这些贴士也许能提升Java应用的性能.

hbase性能调优

- - 数据库 - ITeye博客
   1)、hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB,比如大的put、使用缓存的scans)的时候,如果该值设置过大则会占用过多的内存,导致频繁的GC,或者出现OutOfMemory,因此该值不是越大越好.

中断与性能

- - 并发编程网 - ifeve.com
中断,会导致正在运行的CPU要停下手头的工作去响应,这需要工作任务的切换,就带来了我们熟知的上下文切换,而频繁上下文切换,是对系统性能的重要影响因素. 那怎么减少中断带来的影响呢. 现在CPU往往是多核,如16、32核,是否可以把中断绑定到其中一个CPU上,再把其他剩余的cpu用于应用的计算. 因为之前是单核的原因,传统的很多做法是会把中断扔给cpu0处理,在linux下,可执行mpstat -P ALL 1,查看各个cpu上的中断情况.