Database
 sql >> база данни >  >> RDS >> Database

Въведение в ключалките

В някои от предишните ми статии тук относно настройката на производителността обсъдих множество видове изчакване и как те са показателни за различни тесни места в ресурсите. Започвам нова серия за сценарии, при които механизъм за синхронизация, наречен фиксатор, е пречка за производителността, и по-специално ключалки без страници. В тази първоначална публикация ще обясня защо са необходими ключалки, какви всъщност са те и как могат да бъдат пречка.

Защо са необходими ключалки?

Основен принцип на компютърните науки е, че когато структура от данни съществува в многонишкова система, тя трябва да бъде защитена по някакъв начин. Тази защита дава следните условия:

  1. (Гарантирано) Структура на данни не може да бъде променена от нишка, докато друга нишка я чете
  2. (Гарантирано) Структура от данни не може да бъде прочетена от нишка, докато друга нишка я променя
  3. (Гарантирано) Структурата на данните не може да се променя от две или повече нишки едновременно
  4. (По избор) Позволете на две или повече нишки да четат структурата на данните едновременно
  5. (По избор) Разрешаване на нишките да се редят на опашка по подреден начин за достъп до структурата на данните

Това може да стане по няколко начина, включително:

  • Механизъм, който позволява само на една нишка в даден момент да има достъп до структурата на данните. SQL Server прилага този механизъм и го нарича spinlock. Това позволява #1, #2 и #3 по-горе.
  • Механизъм, който позволява на няколко нишки да четат структурата на данните едновременно (т.е. те имат споделен достъп), позволява на една нишка да получи изключителен достъп до структурата на данните (с изключение на всички други нишки) и прилага справедлив начин на опашка за достъп. SQL Server прилага този механизъм и го нарича ключалка. Това позволява и петте условия по-горе.

И така, защо SQL Server използва както спинлокации, така и ключалки? Достъпът до някои структури от данни е толкова често, че ключалката е просто твърде скъпа и затова вместо нея се използва много олекотено заключване. Два примера за такива структури от данни са списъкът със свободни буфери в буферния пул и списъкът с заключвания в мениджъра на заключване.

Какво е ключалка?

Резето е механизъм за синхронизиране, който защитава една структура от данни и има три широки типа заключване в SQL Server:

  1. Заключва защита на страница с файл с данни, докато се чете от диск. Те се показват, докато PAGEIOLATCH_XX чака и ги обсъдих в тази публикация.
  2. Заключвания, защитаващи достъпа до страница с файл с данни, която вече е в паметта (страница от 8 KB в буферния пул наистина е просто структура от данни). Те се показват, докато PAGELATCH_XX чака и ги обсъдих в тази публикация.
  3. Ключки, защитаващи структури от данни извън страници. Те се показват като LATCH_SH и LATCH_EX чака.

В тази серия ще се съсредоточим върху третия вид ключалки.

Резето само по себе си е малка структура от данни и можете да мислите, че има три компонента:

  • Описание на ресурса (на това, което защитава)
  • Поле за състояние, показващо в кои режими се задържа фиксаторът в момента, колко нишки задържат фиксатора в този режим и дали има чакащи нишки (плюс други неща, за които не е нужно да се занимаваме)
  • Опашка от нишки, които чакат за достъп до структурата от данни, и кои режими на достъп чакат (наречена чакаща опашка)

За ключалки без страници ще се ограничим само до разглеждане на режимите на достъп SH (споделяне) за четене на структурата на данните и EX (изключително) за промяна на структурата на данните. Има и други по-екзотични режими, но те се използват рядко и няма да се появяват като спорни точки, така че ще се преструвам, че не съществуват до края на тази дискусия.

Някои от вас може би знаят, че има и по-дълбоки усложнения около суперблокировките/подразделянето и разделянето с ключалка за мащабируемост, но не е нужно да отиваме в тази дълбочина за целите на тази серия.

Придобиване на ключалка

Когато нишка иска да получи ключалка, тя разглежда състоянието на фиксатора.

Ако нишката иска да получи ключалката в режим EX, тя може да го направи само ако няма нишки, държащи резето в който и да е режим. Ако случаят е такъв, нишката придобива фиксатора в режим EX и задава състоянието, за да посочи това. Ако има една или повече нишки, които вече държат ключалката, нишката задава състоянието, за да покаже, че има чакаща нишка, влиза в долната част на опашката за изчакване и след това е спряна (в списъка на сервитьорите на планировчика е включена ) чака LATCH_EX.

Ако нишката иска да получи ключалката в режим SH, тя може да го направи само ако нито една нишка не държи фиксатора или единствените нишки, държащи фиксатора, са в SH режим *и* няма нишки, които чакат да придобият резето. Ако случаят е такъв, нишката придобива фиксатора в режим SH, задава състоянието, за да посочи това, и увеличава броя на нишките, държащи фиксатора. Ако фиксаторът е задържан в режим EX или има една или повече чакащи нишки, тогава нишката задава състоянието, за да покаже, че има чакаща нишка, влиза сама в долната част на опашката за изчакване и след това е спряна в очакване на LATCH_SH.

Проверката за чакащи нишки се извършва, за да се гарантира справедливост към нишка, която чака за фиксатор в режим EX. Ще трябва да изчака само нишки, държащи ключалката в режим SH, които са придобили ключалката, преди да започнат да чакат. Без тази проверка може да възникне термин в компютърните науки, наречен „глад“, когато постоянен поток от нишки, придобиващи фиксатора в режим SH, пречи на нишката в режим EX някога да успее да придобие ключалката.

Освобождаване на ключалка

Ако нишката държи фиксатора в режим EX, тя отменя състоянието, показващо, че фиксаторът се държи в режим EX, и след това проверява дали има чакащи нишки.

Ако нишката държи фиксатора в режим SH, тя намалява броя на нишките в режим SH. Ако броят вече е различен от нула, освобождаването на резбата се извършва с резето. Ако броят *е* сега е нула, той отменя състоянието, показващо, че ключалката се държи в режим SH и след това проверява дали има чакащи нишки.

Ако няма чакащи нишки, освобождаването се извършва с ключалката.

Ако главата на чакащата опашка чака за режим EX, освобождаващата нишка прави следното:

  • Задава състоянието, за да покаже, че ключалката се държи в режим EX
  • Премахва чакащата нишка от главата на опашката и я задава като собственик на ключалката
  • Сигнализира чакащата нишка, че е собственик и вече може да се изпълнява (чрез концептуално преместване на чакащата нишка от списъка на сервитьори в нейния планировчик към опашката за изпълнение в планировчика)
  • И това е направено с резето

Ако главата на чакащата опашка чака в режим SH (което може да бъде само ако освобождаващата нишка е била в режим EX), освобождаващата нишка прави следното:

  • Задава състоянието, за да покаже, че ключалката се държи в режим SH
  • За всички нишки в опашката за изчакване, които чакат режим SH
    • Премахва чакащата нишка от главата на опашката
    • Увеличава броя на нишките, държащи резето
    • Сигнализира за чакащата нишка, че е собственик и вече може да се изпълнява
  • И това е направено с резето

Как ключалките могат да бъдат точка на спор?

За разлика от ключалките, ключалките обикновено се задържат само по време на операцията за четене или промяна, така че са доста леки, но поради несъвместимостта на SH срещу EX, те могат да бъдат също толкова голям спор, колкото и ключалките. Това може да се случи, когато много нишки се опитват да придобият фиксатор в режим EX (само една по една може) или когато много нишки се опитват да придобият фиксатор в режим SH и друга нишка държи фиксатора в режим EX.

Резюме

Колкото повече нишки в системата се борят за „горещо“ заключване, толкова по-голямо е спорът и толкова по-отрицателен ще бъде ефектът върху пропускателната способност на натоварването. Вероятно сте чували за добре познати проблеми със съревнованието с ключалката, например около растерните карти за разпределение на tempdb, но може да възникне спор и за ключалки извън страници.

Сега ви дадох достатъчно информация, за да разберете ключалките и как те работят, в следващите няколко статии ще разгледам някои реални проблеми със споровете за ключалки извън страници и ще обясня как да ги предотвратите или заобиколите.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Практическа употреба на функцията SQL COALESCE

  2. Форматиране на данни в Power BI Desktop Visualizations

  3. Въведение в API за сигурност на Java

  4. Бивш изпълнителен директор на Capgemini, Сунита Рей, се присъединява към ScaleGrid DBaaS, за да разшири корпоративните продажби

  5. Ръководство за внедряване на TimescaleDB с Docker