Rajat dba’ s Blog

jest to Kopia Notki referencyjnej Metalink 22908.1, dla tych, którzy nie mają do niej dostępu.

  1. co to jest zatrzask?
    zatrzaski są niskopoziomowymi mechanizmami serializacji używanymi do ochrony współdzielonych struktur danych w SGA. Implementacja zatrzasków jest zależna od systemu operacyjnego, szczególnie w odniesieniu do tego, czy proces będzie czekał na zatrzask i jak długo.

zatrzask to rodzaj zamka, który można bardzo szybko zdobyć i zwolnić. Zatrzaski są zwykle używane, aby uniemożliwić więcej niż jednemu procesowi wykonanie tego samego fragmentu kodu w danym czasie. Z każdym zatrzaskiem związana jest procedura czyszczenia, która zostanie wywołana, jeśli proces umrze podczas trzymania zatrzasku. Zatrzaski mają powiązany poziom, który jest używany do zapobiegania martwym blokadom. Gdy proces nabywa zatrzask na pewnym poziomie, nie może następnie nabywać zatrzasku na poziomie równym lub niższym od tego poziomu (chyba że nabywa go teraz).

2.Zatrzaski vs. Enqueues

Enqueues są innym rodzajem mechanizmu blokującego używanego w Oracle.
enqueue jest bardziej wyrafinowanym mechanizmem, który pozwala kilku jednoczesnym procesom na różny stopień współdzielenia “znanych” zasobów. Każdy obiekt, który może być jednocześnie używany, Może być chroniony za pomocą enqueues. Dobrym przykładem są Zamki na stołach. Pozwalamy na różne poziomy udostępniania w tabelach, np. dwa procesy mogą zablokować tabelę w trybie udostępniania lub w trybie aktualizacji udostępniania itp. Jedną z różnic jest to, że zapytanie jest uzyskiwane za pomocą mechanizmu blokującego specyficznego dla systemu operacyjnego. Zapytanie pozwala użytkownikowi na zapisanie wartości w zamku, tj. trybu, w którym go żądamy. Menedżer blokad systemu operacyjnego śledzi zablokowane zasoby. Jeśli procesowi nie można przyznać blokady, ponieważ jest niezgodny z żądanym trybem i blokada jest żądana za pomocą wait, system operacyjny umieszcza proces żądający w kolejce wait, która jest obsługiwana w FIFO.

kolejna różnica między zatrzaskami a enqueues polega na tym, że w zatrzaskach nie ma uporządkowanej kolejki kelnerów jak w enqueues. Kelnerzy zatrzaskowi mogą używać timerów do przebudzenia i ponowienia próby lub wirowania (tylko w wieloprocesorach). Ponieważ wszyscy kelnerzy jednocześnie próbują (w zależności od harmonogramu), każdy może dostać zatrzask i prawdopodobnie pierwszy, który spróbuje, może być ostatnim.

  1. kiedy musimy uzyskać zatrzask?

proces uzyskuje zatrzask podczas pracy ze strukturą w SGA (System Global Area). Nadal utrzymuje zatrzask przez okres, w którym współpracuje ze strukturą. Zatrzask jest upuszczany po zakończeniu procesu z konstrukcją. Każdy zatrzask chroni inny zestaw danych, identyfikowany nazwą zatrzasku.

Oracle używa atomowych instrukcji, takich jak “testuj i ustaw” do obsługi zatrzasków. Procesy oczekujące na wykonanie części kodu, dla której zatrzask został już uzyskany przez inny proces, będą czekać, aż zatrzask zostanie zwolniony. Przykładami są zatrzaski alokacji, zatrzaski kopiowania, zatrzask sterowania Archiwum itp. Podstawową ideą jest blokowanie współbieżnego dostępu do współdzielonych struktur danych. Ponieważ instrukcje ustawiania i zwalniania zatrzasków są atomowe, system operacyjny gwarantuje, że tylko jeden proces je otrzyma. Ponieważ jest to tylko jedna instrukcja, jest dość szybka. Zatrzaski są utrzymywane przez krótki czas i zapewniają mechanizm czyszczenia w przypadku, gdy uchwyt umiera nienormalnie podczas trzymania go. Czyszczenie odbywa się przy użyciu usług PMON.

  1. Zamki żądają trybów?

żądanie zatrzasków może być wykonane w dwóch trybach: “willing-to-wait” lub “no wait”. Normalnie, zatrzaski będą wymagane w trybie” chetny-to-wait”. Żądanie w trybie” willing-to-wait ”
będzie zapętlać, czekać i żądać ponownie, aż zatrzask zostanie uzyskany. W trybie” no wait ” proces żąda zatrzasku. Jeśli jeden nie jest dostępny, zamiast czekać, inny jest żądany. Tylko w przypadku awarii proces serwera musi czekać.

przykładami zatrzasków ” chętnych do oczekiwania “są: wspólna Pula i zatrzaski pamięci podręcznej biblioteki
przykładem zatrzasków” nie czekaj ” jest zatrzask kopiowania.

5. Co powoduje niezgodność zatrzasku?Jeśli wymagany zatrzask jest zajęty, proces żądający go obraca się, próbuje ponownie, a jeśli nadal nie jest dostępny, obraca się ponownie. Pętla jest powtarzana do maksymalnej liczby razy określonej przez parametr inicjalizacyjny _spin_count. Jeśli po tej całej pętli zatrzask nadal nie jest dostępny, proces musi wydać procesor i przejść w stan uśpienia. Początkowo jest to jedna centysekunda. Czas ten podwaja się w każdym kolejnym śnie.

powoduje to spowolnienie i powoduje dodatkowe zużycie procesora, dopóki zatrzask nie będzie dostępny. Użycie procesora jest konsekwencją “wirowania” procesu. “Przędzenie” oznacza, że proces nadal szuka dostępności zatrzasku po pewnych odstępach czasu, podczas których śpi.

  1. jak rozpoznać zatrzaski wewnętrzne?

odpowiednie widoki słownika danych do zapytania:

V$LATCH
V$LATCHHOLDER
V$LATCHNAME

każdy wiersz tabeli V$LATCH zawiera statystyki dla innego typu zatrzasku. Kolumny tabeli odzwierciedlają aktywność dla różnych typów żądań zatrzasku. Różnica między tymi typami żądań polega na tym, czy proces żądający nadal żąda zatrzasku, jeśli jest on niedostępny:

chetny-to-wait jeśli zatrzask żądany z żądaniem chetny-to-wait
nie jest dostępny, proces żądający
czeka krótko i ponownie żąda zatrzasku.
proces kontynuuje oczekiwanie i żądanie, aż
zatrzask będzie dostępny.

nie czekaj jeśli zatrzask żądany z natychmiastowym żądaniem jest
niedostępny, proces żądający nie czeka
, ale kontynuuje przetwarzanie.

V$LATCHNAME kluczowe informacje:

pobiera liczbę udanych żądań dla
zatrzasku.

liczba razy nie powiodła się początkowa Prośba o gotowość do oczekiwania
.

SLEEPS liczba razy proces czekał na żądanie zatrzasku
po początkowym żądaniu “wiling-to-wait”.

IMMEDIATE_GETS Liczba pomyślnych natychmiastowych żądań dla każdego zatrzasku.

IMMEDIATE_MISSES liczba nieudanych natychmiastowych żądań dla każdego zatrzasku.

obliczanie współczynnika trafienia zatrzasku

aby uzyskać współczynnik trafienia dla zatrzasków, zastosuj następującą formułę:

“willing-to-wait” Współczynnik trafienia=(GETS-MISSES)/GETS
“no wait” Współczynnik trafienia=(IMMEDIATE_GETS-IMMEDIATE_MISSES)/IMMEDIATE_GETS

ta liczba powinna być bliska 1. Jeśli nie, dostrajaj zgodnie z nazwą zatrzasku

  1. przydatne skrypty SQL, aby uzyskać informacje o zatrzasku

/*
** Wyświetlanie statystyk zatrzasków w całym systemie.
*/
nazwa kolumny format A32 przyciąć nagłówek “nazwa zatrzasku”
kolumna PID nagłówek “uchwyt PID”
wybierz c.name, a. addr,a.gets,a.misses, a.sleeps,
a.immediate_gets,a.immediate_misses, B.pid
from v$latch a, v$latchholder b, V$latchname c
where a.addr = B.laddr(+)
and a.latch# = C.latch#
order by a. latch#;

/*
** podaj adres zatrzasku, dowiedz się, jak się nazywa zatrzask.
*/
nazwa kolumny format A64 nagłówek “Nazwa”
wybierz a.name from v$latchname a, V$latch B
where B.addr = ‘&addr’
and B. latch# = a. latch#;

/*
** wyświetla statystyki zatrzasku według nazwy zatrzasku.
*/
nazwa kolumny format A32 nagłówek “nazwa zatrzasku”
kolumna PID nagłówek “uchwyt PID”
wybierz c.name, a. addr,a.gets,a.misses, a.sleeps,
a.immediate_gets,a.immediate_misses, B.pid
from V$latch a, v$latchholder b, V$latchname c
where a.addr = B. laddr(+) and a. latch# = C. latch#
and c.name jak’ &latch_name% ‘ Zamów przez. latch#;

  1. Lista wszystkich zatrzasków

wersje Oracle mogą się różnić w zatrzasku# przypisanym do istniejących zatrzasków.
poniższe zapytanie pomoże Ci zidentyfikować wszystkie zatrzaski i przypisany numer.

format nazwy kolumny A40 nagłówek “nazwa zatrzasku”
wybierz zatrzask#, Nazwa od v$nazwa zatrzasku;

  1. lista zatrzasków, które są najbardziej niepokojące dla DBA
  • zatrzaski bufora: istnieją dwa główne zatrzaski, które chronią bloki danych w buforze. Spór o te dwa zatrzaski jest zwykle widoczny, gdy baza danych ma wysokie wskaźniki We/Wy. Możemy zmniejszyć niezgodność na te zatrzaski i dostroić je, dostosowując pewne init.parametry ora.

zatrzask łańcuchów buforów pamięci podręcznej:

ten zatrzask jest nabywany za każdym razem, gdy blok w buforze pamięci podręcznej jest dostępny (przypięty).

zmniejszenie zapotrzebowania na łańcuchy buforów pamięci podręcznej zwykle wymaga zmniejszenia logicznych szybkości we/wy poprzez strojenie i zminimalizowanie wymagań We/Wy danego SQL. Wysokie wskaźniki We / Wy mogą być oznaką gorącego bloku (co oznacza blok o wysokim dostępie).

Zobacz Notkę 163424.1 Jak zidentyfikować gorący Blok w bazie danych, aby poprawnie zidentyfikować ten problem.

bufory bufora LRU Chain latch:

bufor bufora LRU Chain latch jest nabywany w celu wprowadzenia nowego bloku do bufora bufora i podczas pisania bufora z powrotem na dysk, szczególnie podczas próby skanowania łańcucha LRU (ostatnio używanego) zawierającego wszystkie brudne bloki w buforze bufora.

możliwe jest zmniejszenie zatrzasku łańcucha bufora bufora lru poprzez zwiększenie rozmiaru bufora bufora, a tym samym zmniejszenie szybkości wprowadzania nowych bloków do bufora bufora. Dwa parametry określają rozmiar bufora, DB_BLOCK_SIZE i DB_BLOCK_BUFFERS. W rzeczywistości tylko DB_BLOCK_BUFFERS można zmienić bez ponownego odtwarzania bazy danych. Uwaga: podczas strojenia puli buforów należy unikać używania dodatkowych buforów, które w niewielkim stopniu lub w ogóle przyczyniają się do wskaźnika trafień bufora. Częstym błędem jest dalsze zwiększanie wartości DB_BLOCK_BUFFERS. Takie zwiększenie nie ma wpływu, jeśli wykonujesz Pełne skanowanie tabeli lub inne operacje, które nie używają bufora bufora. Wiele pul buforów może pomóc zmniejszyć niezgodność na tym zatrzasku.Można utworzyć dodatkowe zatrzaski łańcucha bufora LRU dostosowując parametr konfiguracyjny DB_BLOCK_LRU_LATCHES. Możesz zmniejszyć obciążenie zatrzasków łańcucha bufora pamięci podręcznej poprzez zwiększenie parametru konfiguracyjnego _DB_BLOCK_HASH_BUCKETS

  • zatrzaski bufora REDOLOG: istnieją dwa zatrzaski bufora Redo, zatrzask alokacji redo i zatrzask kopiowania redo. W celu przydzielenia miejsca w buforze należy nabyć zatrzask alokacji ponowienia. Jeśli wpis dziennika ponowienia jest większy niż parametr konfiguracyjny LOG_SMALL_ENTRY_MAX_SIZE, sesja, która przejmuje zatrzask alokacji ponowienia, może skopiować wpis do bufora ponowienia natychmiast, trzymając zatrzask alokacji. Jeśli wpis dziennika jest większy niż LOG_SMALL_ENTRY_MAX_SIZE, wtedy sesja zwolni zatrzask alokacji ponowienia i przejmie zatrzask kopiowania ponowienia w celu skopiowania wpisu. Istnieje tylko jeden zatrzask alokacji ponowienia, ale może być do zatrzasków alokacji LOG_SIMULTANEOUS_COPIES.

zatrzask Redo alokacji:

ten zatrzask steruje przydzielaniem miejsca na wpisy redo w buforze dziennika redo. Istnieje jeden zatrzask alokacji ponowienia na instancję.

twierdzenie o tym zatrzasku w Oracle7 można zmniejszyć przez zmniejszenie wartości LOG_SMALL_ENTRY_MAX_SIZE w systemach wieloprocesorowych, aby wymusić użycie zatrzasku kopiowania
. W Oracle8i ten parametr jest przestarzały, więc należy rozważyć zwiększenie rozmiaru bufora LOG_BUFFER lub zmniejszenie obciążenia bufora logów za pomocą funkcji NOLOGGING, jeśli to możliwe.

zatrzask ponownego kopiowania:

ten zatrzask służy do zapisu rekordów ponownego kopiowania do bufora redolog. Ten zatrzask jest oczekiwany zarówno w systemach jedno -, jak i wieloprocesorowych.

w systemach wieloprocesorowych twierdzenie można zmniejszyć poprzez zwiększenie wartości LOG_SIMULTANEOUS_COPIES (ukrytej w Oracle8i) i/lub zwiększenie LOG_ENTRY_PREBUILD_THRESHOLD (nieudokumentowanej w Oracle7).

  • pamięć podręczna biblioteki

zatrzask pamięci podręcznej Biblioteki:

zatrzaski pamięci podręcznej biblioteki chronią buforowane instrukcje SQL i definicje obiektów przechowywane w pamięci podręcznej biblioteki w ramach udostępnionej puli. Zatrzask pamięci podręcznej biblioteki musi zostać nabyty w celu dodania nowej instrukcji do pamięci podręcznej biblioteki. Podczas analizy Oracle przeszukuje bufor biblioteki w poszukiwaniu pasującej instrukcji. Jeśli nie zostanie znaleziony, to Oracle przeanalizuje instrukcję SQL, uzyska zatrzask pamięci podręcznej biblioteki i wstawi nowy SQL.

pierwszym zasobem, który zmniejsza niezgodność na tym zatrzasku, jest zapewnienie, że aplikacja ponownie wykorzystuje jak najwięcej reprezentacji instrukcji SQL. Używaj bind variables w miarę możliwości w aplikacji. Chybienia na tym zatrzasku mogą być również oznaką, że aplikacja analizuje SQL z dużą szybkością i może cierpieć z powodu zbyt dużego obciążenia procesora.Jeśli aplikacja jest już dostrojona, SHARED_POOL_SIZE może zostać zwiększony. Należy pamiętać, że jeśli aplikacja nie używa odpowiednio pamięci podręcznej biblioteki, twierdzenie może być gorsze przy większej strukturze do obsługi.

parametr _kgl_latch_count kontroluje liczbę zatrzasków pamięci podręcznej biblioteki. Wartość domyślna powinna być odpowiednia, ale jeśli nie można rozwiązać problemu zatrzasku pamięci podręcznej biblioteki, wskazane może być zwiększenie tej wartości. Domyślną wartością _kgl_latch_count jest następna liczba pierwsza po CPU_COUNT. Wartość ta nie może przekraczać 66 (Patrz:).

zatrzask Pina pamięci podręcznej Biblioteki:

zatrzask Pina pamięci podręcznej biblioteki musi zostać uzyskany, gdy polecenie w pamięci podręcznej biblioteki jest ponownie aktywowane. Chybienia na tym zatrzasku występują, gdy jest bardzo wysoka wydajność SQL.

niewiele można zrobić, aby zmniejszyć obciążenie zatrzasku pin pamięci podręcznej biblioteki, chociaż używa się prywatnych zamiast publicznych synonimów lub bezpośrednich odniesień do obiektów, takich jak właściciel.Stół może pomóc.

  • zatrzaski związane z pulą współdzieloną

zatrzask puli współdzielonej:

zatrzask pamięci podręcznej biblioteki chroni operacje z pamięcią podręczną biblioteki, natomiast zatrzask puli współdzielonej służy do ochrony krytycznych operacji podczas przydzielania i zwalniania pamięci w Puli współdzielonej.
jeśli aplikacja korzysta z dosłownego (nie udostępnionego) SQL, może to poważnie ograniczyć skalowalność i przepustowość. Koszt parsowania nowej instrukcji SQL jest kosztowny zarówno pod względem wymagań procesora, jak i liczby przypadków, w których może być konieczne nabycie i zwolnienie pamięci podręcznej biblioteki i zatrzasków puli współdzielonej. Przed Oracle9, istnieje tylko jeden taki zatrzask do całej bazy danych, aby chronić alokację pamięci w pamięci podręcznej biblioteki. W Oracle9 wprowadzono wiele dzieci, aby złagodzić spory dotyczące tego zasobu.

sposoby na zmniejszenie zatrzasku wspólnej puli to, unikaj twardych Parsów, jeśli to możliwe, parsuj raz, wykonuj wiele. Eliminacja dosłownego SQL jest również przydatna, aby uniknąć zatrzasku wspólnej puli. Rozmiar shared_pool i użycie MTS (shared server option) również znacznie wpływa na zatrzask wspólnej puli. Uwaga 62143.1 wyjaśnia, jak identyfikować i naprawiać problemy ze wspólną pulą i zatrzaskiem wspólnej puli.

zatrzask obiektów pamięci podręcznej wiersza:

ten zatrzask wchodzi w grę, gdy procesy użytkownika próbują uzyskać dostęp do wartości słownika danych buforowanych.

to nie jest powszechne, aby mieć zastrzeżenia w tym zatrzasku i jedynym sposobem, aby zmniejszyć zastrzeżenia dla tego zatrzasku jest zwiększenie rozmiaru wspólnej puli (SHARED_POOL_SIZE).

  1. Tuning _spin_count (_latch_spin_count w Oracle7)

SPIN_COUNT kontroluje, ile razy proces będzie próbował ponownie uzyskać zatrzask przed wycofaniem się i pójściem w stan uśpienia. Zasadniczo oznacza to, że proces jest w ciasnej pętli procesora, nieustannie próbując uzyskać zatrzask dla prób SPIN_COUNT. Na pojedynczym systemie CPU jeśli proces Oracle próbuje uzyskać zatrzask, ale jest on trzymany przez kogoś innego, proces zwolni procesor i przejdzie w stan uśpienia na krótki okres, zanim spróbuje ponownie. Jednak w systemie wieloprocesorowym (SMP) możliwe jest, że proces trzymający zatrzask jest uruchomiony na jednym z innych procesorów, a więc potencjalnie zwolni zatrzask w następnych kilku instrukcjach (zatrzaski są zwykle trzymane tylko przez bardzo krótki czas).

wydajność można dostosować, zmieniając wartość SPIN_COUNT. Jeśli używana jest wysoka wartość, zatrzask zostanie osiągnięty wcześniej niż w przypadku użycia niskiej wartości. Możesz jednak użyć więcej czasu CPU wirowania, aby uzyskać zatrzask, jeśli używasz wysokiej wartości SPIN_COUNT. Prawdopodobieństwo uśpienia sesji można zmniejszyć poprzez zwiększenie wartości parametrów konfiguracyjnych _LATCH_SPIN_COUNT lub SPIN_COUNT. Ten parametr kontroluje liczbę prób, które sesja podejmie, aby uzyskać zatrzask przed snem. Wirowanie na zatrzasku zużywa procesor, więc jeśli zwiększysz ten parametr, możesz zauważyć wzrost ogólnego wykorzystania procesora w systemach. Jeśli twój komputer jest w pobliżu 100% CPU, a Twoja aplikacja ma przepustowość, a nie czas reakcji, możesz rozważyć zmniejszenie SPIN_COUNT w celu oszczędzania procesora. Dostosowanie SPIN_COUNT jest metodą prób i błędów. Ogólnie rzecz biorąc, zwiększ SPIN_COUNT tylko wtedy, gdy w systemie jest wystarczająco dużo wolnych zasobów procesora, i zmniejsz je tylko wtedy, gdy nie ma wolnej pojemności procesora.

Leave a Reply