偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

我們一起聊聊 SQLServer 的Latch

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
SQLSERVER中并無(wú)此類(lèi)機(jī)制,因此對(duì)于一些重度訪問(wèn)的內(nèi)存結(jié)構(gòu),設(shè)計(jì)了LATCH來(lái)保護(hù),而其他的一些數(shù)據(jù)結(jié)構(gòu),使用spinlock。在SQLSERVER中,總是使用spinlock來(lái)保護(hù)那些訪問(wèn)十分快速的內(nèi)存結(jié)構(gòu)。

昨天聊了下SQLSERVER的spinlock,當(dāng)時(shí)我認(rèn)為spinlock是與Oracle LATCH相對(duì)應(yīng)的結(jié)構(gòu),事實(shí)上碎片化的閱讀會(huì)帶來(lái)一些知識(shí)掌握的不準(zhǔn)確。Oracle的LATCH是通過(guò)spin來(lái)實(shí)現(xiàn)鎖的獲取的,spin是LATCH獲取輕量級(jí)鎖的一種方式。而在SQLSERVER中,LATCH和spinlock被設(shè)計(jì)成兩種輕量級(jí)鎖,分別用于不同的場(chǎng)景。Oracle有shared pool,library cache等結(jié)構(gòu),可以用shared pool閂鎖來(lái)保護(hù)整個(gè)共享池,共享池中新增的一些亂七八糟的數(shù)據(jù)結(jié)構(gòu)可以通過(guò)shared pool閂鎖以及mutex來(lái)實(shí)現(xiàn)串行化訪問(wèn)保護(hù)。

SQLSERVER中并無(wú)此類(lèi)機(jī)制,因此對(duì)于一些重度訪問(wèn)的內(nèi)存結(jié)構(gòu),設(shè)計(jì)了LATCH來(lái)保護(hù),而其他的一些數(shù)據(jù)結(jié)構(gòu),使用spinlock。在SQLSERVER中,總是使用spinlock來(lái)保護(hù)那些訪問(wèn)十分快速的內(nèi)存結(jié)構(gòu)。

LATCH是 SQL Server 的SQL引擎用來(lái)保證內(nèi)存結(jié)構(gòu)的一致性的輕量級(jí)原子操作用來(lái)保護(hù)索引、數(shù)據(jù)頁(yè)和內(nèi)部結(jié)構(gòu)等結(jié)構(gòu),例如 B 樹(shù)中的非葉頁(yè)。LATCH僅存在于SQL引擎內(nèi)部。SQL Server 使用緩沖LATCH來(lái)保護(hù)緩沖池中的頁(yè)面,并使用 I/O LATCH來(lái)保護(hù)尚未加載到緩沖池中的頁(yè)面。每當(dāng)向 SQL Server 緩沖池中的頁(yè)面寫(xiě)入或讀取數(shù)據(jù)時(shí),工作線程必須首先獲取該頁(yè)面的緩沖LATCH。有多種緩沖LATCH類(lèi)型可用于訪問(wèn)緩沖池中的頁(yè)面,包括獨(dú)占LATCH (PAGELATCH_EX) 和共享LATCH(PAGELATCH_SH)。

當(dāng) SQL Server訪問(wèn)一個(gè)尚未加載到緩沖池中的頁(yè)面時(shí),將通過(guò)一個(gè)異步 I/O操作將該頁(yè)面加載到緩沖池中。如果 SQL Server 需要等待 I/O 子系統(tǒng)響應(yīng),它將根據(jù)請(qǐng)求類(lèi)型等待獨(dú)占 (PAGEIOLATCH_EX) 或共享 (PAGEIOLATCH_SH) I/O LATCH;這樣做是為了防止另一個(gè)工作線程使用不兼容的LATCH將同一頁(yè)面加載到緩沖池中。LATCH還用于保護(hù)對(duì)緩沖池頁(yè)面以外的內(nèi)部存儲(chǔ)器結(jié)構(gòu)的訪問(wèn);這些被稱(chēng)為非緩沖LATCH。

PAGELATCH的爭(zhēng)用在多 CPU 系統(tǒng)十分常見(jiàn)。當(dāng)多個(gè)線程同時(shí)嘗試獲取相同內(nèi)存結(jié)構(gòu)的不兼容LATCH時(shí),就會(huì)發(fā)生LATCH爭(zhēng)用。閂鎖是一種內(nèi)部并發(fā)控制機(jī)制,SQL 引擎會(huì)自動(dòng)確定何時(shí)使用它們。因?yàn)殚V鎖的行為是確定性的,數(shù)據(jù)庫(kù)SCHEMA的設(shè)計(jì),表、索引等的設(shè)計(jì)會(huì)影響閂鎖爭(zhēng)用。

非緩存頁(yè)的閂鎖名稱(chēng)為L(zhǎng)ATCH_XX,其中“_XX”后綴表示了閂鎖的模式(PAGEIOLATCH/PAGELATCH也使用后綴表示模式)。SQL Server 的閂鎖模式可以總結(jié)如下:

lKP——保持LATCH,確保引用的結(jié)構(gòu)不會(huì)被破壞。當(dāng)線程想要查看緩沖區(qū)結(jié)構(gòu)時(shí)使用。因?yàn)?KP LATCH兼容除銷(xiāo)毀(DT)之外的所有LATCH,因此 KP 閂鎖被認(rèn)為是“輕量級(jí)”的,這意味著使用它時(shí)對(duì)性能的影響最小。由于 KP 閂鎖與 DT 閂鎖不兼容,它會(huì)阻止任何其他線程破壞引用的結(jié)構(gòu)。KP 閂鎖將防止它引用的結(jié)構(gòu)被lazywriter 進(jìn)程破壞(臟塊寫(xiě)盤(pán)并釋放緩沖);

lSH -- 共享閂鎖,需要讀取引用的結(jié)構(gòu)(例如讀取數(shù)據(jù)頁(yè))。多個(gè)線程可以同時(shí)訪問(wèn)共享閂鎖下的資源以進(jìn)行讀取。

lUP——更新閂鎖,與 SH(共享閂鎖)和 KP 兼容,但不兼容其他閂鎖,因此不允許 EX 閂鎖寫(xiě)入引用的結(jié)構(gòu)。

lEX——獨(dú)占閂鎖,阻止其他線程寫(xiě)入或讀取引用的結(jié)構(gòu)。一個(gè)使用示例是修改頁(yè)面內(nèi)容以保護(hù)頁(yè)面損壞。

lDT -- 銷(xiāo)毀閂鎖,必須在銷(xiāo)毀引用結(jié)構(gòu)的內(nèi)容之前獲取。例如,lazywriter 進(jìn)程必須獲取一個(gè) DT 閂鎖以釋放一個(gè)干凈的頁(yè)面,然后再將其添加到可供其他線程使用的空閑緩沖區(qū)列表中。

圖片

上面的描述中關(guān)于閂鎖兼容性的描述,可以用上表來(lái)表示。如果我們看到一個(gè)閂鎖,可以通過(guò)”_”之后的后綴來(lái)區(qū)分其模式。比如PAGEIOLATCH_EX是一個(gè)獨(dú)享的PAGEIOLATCH,LATCH_DT是一個(gè)非緩沖區(qū)保護(hù)的銷(xiāo)毀閂鎖。

和Oracle的子閂鎖類(lèi)似,SQLSERVER也存在類(lèi)似的結(jié)構(gòu),稱(chēng)為superlatch或者sublatch。目的是使用多個(gè)子閂鎖來(lái)提高閂鎖的并發(fā)性能。SQLSERVER使用多線程結(jié)構(gòu),并采用緩沖區(qū)動(dòng)態(tài)擴(kuò)展的方式。因此superlatch機(jī)制與NUMA架構(gòu)做了一些優(yōu)化,使之更好的適應(yīng)NUMA。

SuperLatches 可以提高訪問(wèn)共享頁(yè)面的性能,其中多個(gè)并發(fā)運(yùn)行的工作線程需要 SH 閂鎖。為此,SQL Server 引擎會(huì)將此類(lèi)頁(yè)面上的閂鎖動(dòng)態(tài)提升為 SuperLatch。

在為大型服務(wù)器設(shè)計(jì)的高吞吐量系統(tǒng)上,必定會(huì)出現(xiàn)高并發(fā)的閂鎖爭(zhēng)用,在此類(lèi)系統(tǒng)中存在閂鎖爭(zhēng)用是十分正常的現(xiàn)象。但是當(dāng)閂鎖爭(zhēng)用和閂鎖等待類(lèi)型等待時(shí)間大到足以降低 CPU 利用率的情況下,系統(tǒng)的整體吞吐量會(huì)嚴(yán)重下降。識(shí)別和識(shí)別閂鎖爭(zhēng)用的跡象很重要,所以讓我們必須有能力來(lái)分析這種情況。SQL Server 閂鎖的預(yù)期行為(與每秒事務(wù)數(shù)相關(guān))是每秒事務(wù)數(shù)將隨著平均 SQL Server 閂鎖等待時(shí)間的增加而增加,其本身以緩慢的速度增加。如果數(shù)據(jù)庫(kù)并發(fā)增長(zhǎng)的趨勢(shì)與閂鎖等待的趨勢(shì)十分接近,那么閂鎖爭(zhēng)用并沒(méi)有產(chǎn)生額外的負(fù)面影響。如果閂鎖等待幅度遠(yuǎn)遠(yuǎn)超過(guò)數(shù)據(jù)庫(kù)負(fù)載的增長(zhǎng),那么就說(shuō)明閂鎖出現(xiàn)了嚴(yán)重的爭(zhēng)用。這個(gè)判斷原則在大多數(shù)情況下是有效的。

我已經(jīng)比較長(zhǎng)時(shí)間沒(méi)有仔細(xì)閱讀數(shù)據(jù)庫(kù)廠商官方的白皮書(shū)了,通過(guò)這兩天的學(xué)習(xí),我學(xué)到了一個(gè)分析數(shù)據(jù)的方法。實(shí)際上有些指標(biāo)之間是存在較為同步的關(guān)聯(lián)關(guān)系的,通過(guò)上升或者下降的幅度(可以通過(guò)統(tǒng)計(jì)學(xué)方法計(jì)算出一個(gè)可評(píng)估的度量)之間的對(duì)比,可以發(fā)現(xiàn)一些系統(tǒng)的性能問(wèn)題。以前我們做了一個(gè)指標(biāo)關(guān)聯(lián)性分析工具,用于發(fā)現(xiàn)數(shù)據(jù)庫(kù)某個(gè)指標(biāo)異常可能存在的問(wèn)題。實(shí)際上用這種更為簡(jiǎn)單的算法,也可以發(fā)現(xiàn)系統(tǒng)中存在的一些背離預(yù)期行為的場(chǎng)景,并用于告警。

圖片

責(zé)任編輯:武曉燕 來(lái)源: 白鱔的洞穴
相關(guān)推薦

2023-04-26 07:30:00

promptUI非結(jié)構(gòu)化

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-09-10 21:42:31

2023-06-30 08:18:51

敏捷開(kāi)發(fā)模式

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-03-07 07:05:29

生產(chǎn)數(shù)據(jù)庫(kù)運(yùn)維

2021-07-31 11:40:55

Openresty開(kāi)源

2024-02-26 00:00:00

Go性能工具

2022-11-12 12:33:38

CSS預(yù)處理器Sass

2023-12-28 09:55:08

隊(duì)列數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)

2022-07-29 08:17:46

Java對(duì)象內(nèi)存

2022-10-28 07:27:17

Netty異步Future

2022-06-26 09:40:55

Django框架服務(wù)

2023-07-27 07:46:51

SAFe團(tuán)隊(duì)測(cè)試

2022-12-07 13:12:15

2022-04-06 08:23:57

指針函數(shù)代碼

2022-01-04 12:08:46

設(shè)計(jì)接口
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)