位置: 编程技术 - 正文

简单介绍SQL Server中的自旋锁(简单介绍春节的风俗)

编辑:rootadmin

推荐整理分享简单介绍SQL Server中的自旋锁(简单介绍春节的风俗),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:简单介绍自己的名字由来,简单介绍自己的句子,简单介绍自己的名字由来,简单介绍中秋节,简单介绍一种植物,简单介绍春节的风俗,简单介绍一下自己,简单介绍春节的风俗,内容如对您有帮助,希望把文章链接给更多的朋友!

为什么我们需要自旋锁?用闩锁同步多个线程间数据结构访问,在每个共享数据结构前都放置一个闩锁没有意义的。闩锁与此紧密关联:当你不能获得闩锁(因为其他人已经有一个不兼容的闩锁拿到),查询就会强制等待,并进入挂起(SUSPENDED)状态。查询在挂起状态等待直到可以拿到闩锁,然后就会进入可执行(RUNNABLE)状态。对于查询执行只要没有可用的CPU,查询就一直在可执行(RUNNABLE)状态。一旦CPU有空闲,查询会进入运行(RUNNING)状态,最后成功获取到闩锁,用它来保护访问的共享数据结构。下图展示了SQLOS对协调线程调度实现的状态机。

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_db.png" alt="查看图片" />

因为太多关联的闩锁,对“忙碌”数据结构使用闩锁保护没有意义。因此SQL Server实现所谓自旋锁(Spinlocks)。自旋锁就像一个闩锁,存储引擎使用的一个轻量级同步对象,用来同步对共享数据结构线程访问。和闩锁的主要区别是你积极等待自旋锁——不离开CPU。在自旋锁上的“等待”总会发生在运行(RUNNING)状态的CPU。在你闭合循环里旋转直到获得自旋锁。这就是所谓的忙碌等待(busy wait)。自旋锁的最大优点是当查询在自旋锁上等待时,不会涉及到上下文切换。另一方面忙碌等待浪费CPU周期,其他查询也许能对它们更有效的使用。

为了避免太多的CPU周期浪费,SQL Server R2及后续版本实现所谓的指数补偿机制(exponential backoff mechanism),那里在CPU上一些时间的休眠后,线程停止旋转。在线程进入休眠期间,增加了尝试获得自旋锁的超时。这个行为可以降低对CPU性能的影响。

(补充说明:Spinlock中文可以称为自旋锁。它是一个轻量级的,用户态的同步对象,和critical section类似,但是粒度比前者小多了。它主要用来保护某些特定的内存对象的多线程并发访问。Spinlock是排他性的。一次只能一个线程拥有。

简单介绍SQL Server中的自旋锁(简单介绍春节的风俗)

Spinlock的设计目标是非常快和高效率。Spinlock内部如何工作呢?它首先试图获得某个对象的锁,如果目标被其它线程占有,就在那里轮询(spin)一定时间。如果还得不到锁,就sleep一小会,然后继续spin。反复这个过程直到得到对象的占有权。)

自旋锁与故障排除对自旋锁故障排除的主要DMV是 sys.dm_os_spinlock_stats。这个DMV里返回的每一行都代表SQL Server里的一个自旋锁。SQL Server 实现了个不同自旋锁。我们来详细看下这个DMV里的各个列:

name:自旋锁名称collision:当尝试访问保护的数据结构时,被自旋锁阻塞的线程次数spins:在循环里尝试获得自旋锁的自旋锁线程次数spins_per_collision:旋转和碰撞之间的比率sleep_time:因为退避线程休眠时间backoffs:为了其他线程在CPU上继续,线程退避次数在这个DMV里最重要的列是backoffs,对于特定的自旋锁类型,这列告诉你退避发生频率。高频率的退避会屈服于CPU消耗引起SQL Server里的自旋锁竞争(Spinlock Contention)。我就见过一个核的SQL Server服务器,CPU运行在%而不进行任何工作——典型的自旋锁竞争症状。

对自旋锁问题进行故障排除你可以使用扩展事件提供的sqlos.spinlock_backoff。当退避(backoff)发生时,就会触发这个扩展事件。如果你捕获了这个事件,你还要保证你使用非常好的选择性谓语,因为在SQL Server里退避会经常发生。一个好的谓语可以是特定的自旋锁类型,通过刚才提到的DMV你已经看到。下列代码给你展示了如何创建这样的扩展事件会话。

从代码里可以看到,这里我在调用堆栈(callstack)上使用了直方图(histogram)目标来bucktize。因此对于特定的自旋锁,你可以可能到SQL Serve里生成的最高退避(backoffs)代码路径。你甚至可以通过启用跟踪标记(trace flag)来标识调用堆栈。这里你可以看到来自这个扩展会话的输出:

sqldk.dll!XeSosPkg::spinlock_backoff::Publish+0xsqldk.dll!SpinlockBase::Sleep+0xc5sqlmin.dll!Spinlock<,7,1>::SpinToAcquireWithExponentialBackoff+0xsqlmin.dll!lck_lockInternal+0xsqlmin.dll!XactWorkspaceImp::GetSharedDBLockFromLockManager+0xdsqlmin.dll!XactWorkspaceImp::GetDBLockLocal+0xbsqlmin.dll!XactWorkspaceImp::GetDBLock+0x5asqlmin.dll!lockdb+0x4a sqlmin.dll!DBMgr::OpenDB+0x1ecsqlmin.dll!sqlusedb+0xebsqllang.dll!usedb+0xb3sqllang.dll!LoginUseDbHelper::UseByMDDatabaseId+0xsqllang.dll!LoginUseDbHelper::FDetermineSessionDb+0x3e1sqllang.dll!FRedoLoginImpl+0xa1bsqllang.dll!FRedoLogin+0x1c1sqllang.dll!process_request+0x3ecsqllang.dll!process_commands+0x4a3sqldk.dll!SOS_Task::Param::Execute+0xesqldk.dll!SOS_Scheduler::RunTask+0xa8sqldk.dll!SOS_Scheduler::ProcessTasks+0xsqldk.dll!SchedulerManager::WorkerEntryPoint+0xcsqldk.dll!SystemThread::RunWorker+0x8fsqldk.dll!SystemThreadDispatcher::ProcessWorker+0x3absqldk.dll!SchedulerManager::ThreadEntryPoint+0x

使用提供调用堆栈,不难找出自旋锁竞争发生的地方。在那个指定的笤俑堆栈里竞争发生在LOCK_HASH自旋锁类型里,它是保护锁管理器的哈希表。每次在锁管理器里加锁或解锁被执行时,自旋锁必须在对应的哈希桶里获得。如你所见,在调用堆栈里,当从XactWorkspacelmp类调用GetSharedDBLockFromLockManager函数时,自旋锁被获得。这表示当竞争到数据库时,共享数据库锁被尝试获取。最后在用很高的退避(backoffs)的LOCK_HASH自旋锁里,这屈服于自旋锁竞争。

标签: 简单介绍春节的风俗

本文链接地址:https://www.jiuchutong.com/biancheng/347418.html 转载请保留说明!

上一篇:自增长键列统计信息的处理方法(主键自增长的数据如何导入)

下一篇:简单介绍SQL Server里的闩锁(简单介绍清明上河图)

  • 劳务公司怎么交税,都有哪些税
  • 长期股权投资在哪个报表里
  • 车间停止生产时间怎么计算
  • 机械租赁属于什么分类
  • 执行企业会计准则第21号租赁的企业
  • 收回个人社会保险费是否可以冲红管理费用
  • 印花税退税流程怎么操作
  • 汇算清缴交了税怎么做分录
  • 发票可用时间
  • 企业资产核算不包括哪些
  • 货运增值税发票抵扣条件
  • 收入转本年利润的会计分录
  • 更正申报所得税流程
  • 网上纳税申报怎么填
  • 开的是全额发票但是有分包如何做账务处理?
  • 税务系统勾了为什么还能认证?
  • 三证合一不需要税务登记情况说明
  • 工业企业水电费需要计提吗
  • 增值税进项发票网上勾选平台
  • 现金福利需要发票吗
  • 无车承运业务如何开展
  • 申请办理银行承兑流程
  • 一般纳税人企业所得税税率多少
  • 管理费用如何分摊到产品成本
  • 认证未抵扣的发票购买方能开红字信息表吗
  • 广告业进项都能开什么票
  • Win11/Win10 21H2 正式版发布前,微软再次推送可靠性补丁更新 KB4023057
  • 收到退回多付款现金流量支付购买商品支付
  • 已抵扣的进项税额红冲的账怎么做
  • 工商年检需准备什么资料
  • mtask.exe - mtask是什么进程 有什么用
  • 提前支付的费用记账
  • PHP:mdecrypt_generic()的用法_Mcrypt函数
  • 全资子公司取得注册证可以免临床
  • 借银行存款贷预收账款
  • 先开票后发货合法吗
  • java代理有几种方式
  • php ajax
  • linux rdp客户端
  • 应交税费会计分录怎么做明细科目
  • 微信收款怎么记录怎么删除
  • 外贸企业代理出口退税给谁
  • 再生资源回收企业现状
  • 企业向合伙企业转让股权
  • wordpress编辑文章
  • 帝国cms移动端
  • 辞退福利为什么不计入产品成本
  • 低值易耗品摊销计入什么科目
  • 应收账款收不回来了应怎么做会计分录
  • 小规模印花税有减免政策吗
  • 上年度漏提折旧
  • 递延所得税资产是什么意思
  • 本年利润的借方科目
  • 注册资本金到位证明
  • 投资性房地产摊销从什么时候开始
  • sqlserver全文索引ndf文件丢失
  • mysql主键冲突但数据不存在
  • winxp如何禁用u盘
  • win7找回删除的文件
  • macos终端命令
  • win7系统怎么设置不休眠
  • win8硬盘占用100%
  • 密钥升级win10专业版有问题吗
  • windows7 usb
  • win7怎么样激活
  • opengl入门教程(精)
  • javascript程序代码
  • 个人简历
  • linux分区类型默认的是什么
  • svn报错禁止访问
  • 怎么在html中调用js的函数
  • jquery的插件
  • sql命令语句
  • shell脚本-lt
  • uleb128、sleb128和uleb128p1编码格式介绍
  • 收藏一些不常用的图片
  • 重庆市国税12366
  • 税务局房屋评估怎样做低
  • 江苏专家库申报在哪个网站
  • 零申报的企业残保金怎么申报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设