TokenAndPermUserStore önbelleğinin boyutu SQL Server büyüdüğünde sorguların tamamlanması daha uzun sürer

Bu makale, boyutu TokenAndPermUserStore büyüdükçe sorgu performansıyla ilgili sorunları gidermenize yardımcı olur. Ayrıca çeşitli nedenler ve geçici çözümler sağlar.

Özgün KB numarası: 927396

Belirtiler

Microsoft SQL Server aşağıdaki belirtilerle karşılaşırsınız:

  • Genellikle hızlı çalışan sorguların tamamlanması daha uzun sürer.

  • SQL Server işlemi için CPU kullanımı normalden daha büyüktür.

  • Geçici bir sorgu çalıştırdığınızda performansın azalmasıyla karşılaşırsınız. Ancak, veya sys.dm_os_waiting_tasks dinamik yönetim görünümlerini sorgularsanızsys.dm_exec_requests, sonuçlar geçici sorgunun herhangi bir kaynağı beklediğini göstermez.

  • Önbelleğin TokenAndPermUserStore boyutu sabit bir hızda büyür.

  • Önbelleğin TokenAndPermUserStore boyutu birkaç yüz megabayttır (MB).

  • Bazı durumlarda, veya DBCC FREESYSTEMCACHE komutunu çalıştırmak DBCC FREEPROCCACHE geçici yardım sağlar.

Neden

Yüksek CPU ve artan bellek kullanımı gibi performans sorunları, önbellekteki TokenAndPermUserStore aşırı girişlerden kaynaklanabilir. Varsayılan olarak, bu önbellekteki girdiler yalnızca SQL Server iç bellek baskısına işaret ettiğinde temizlenir. Çok fazla RAM'i olan sunucularda iç bellek baskısı sık tetiklenmeyebilir. Bu önbellek büyüdükçe, yeniden kullanmak için mevcut girdileri aramak daha uzun sürer. Bu önbelleğe erişim bir spinlock tarafından denetlenir. Aramayı aynı anda yalnızca bir iş parçacığı yapabilir. Bu davranış sonunda sorgu performansının düşmesine ve daha fazla CPU kullanımı oluşmasına neden olur.

Önbelleğin TokenAndPermUserStore boyutunu izlemek için aşağıdaki sorguya benzer bir sorgu kullanabilirsiniz:

SELECT SUM(pages_kb) AS 
   "CurrentSizeOfTokenCache(kb)" 
   FROM sys.dm_os_memory_clerks 
   WHERE name = 'TokenAndPermUserStore'

TokenAndPermUserStore Önbellek aşağıdaki güvenlik belirteci türlerini korur:

  • LoginToken
    • Sunucu düzeyi sorumlusu başına bir oturum açma belirteci.
  • TokenPerm
    • UserToken ve SecContextToken için güvenli hale getirilebilir nesnenin tüm izinlerini kaydeder.
    • Bu önbellekteki her giriş, belirli bir güvenli hale getirilebilir üzerinde tek bir izindir. Örneğin, t1 tablosunda u1 kullanıcısına verilen seçme izni.
    • Bu belirteç girdisi, Erişim Denetimi Sonuçları (ACR) önbelleğindeki girdilerden farklıdır. ACR girişleri çoğunlukla bir kullanıcının veya oturum açmanın tüm sorguyu çalıştırma iznine sahip olup olmadığını belirtir.
  • Usertoken
    • Oturum açma için veritabanı başına bir kullanıcı belirteci.
    • Üyelikle ilgili bilgileri veritabanı düzeyindeki rollerde depolar.
  • SecContextToken
    • Sunucu düzeyi sorumlusu başına bir SecContextToken oluşturulur.
    • Bir sorumlu için sunucu genelinde güvenlik bağlamı depolar.
    • Kullanıcı Belirteçlerinin karma tablo önbelleğini içerir.
    • Üyelikle ilgili bilgileri sunucu düzeyindeki rollerde depolar.
  • TokenAccessResult
    • TokenAccessResult girdilerinin farklı sınıfları vardır.
    • Erişim Denetimi, belirli bir veritabanındaki belirli bir kullanıcının birden çok nesne içeren bir sorguyu çalıştırma izni olup olmadığını gösterir.
    • Microsoft SQL Server 2008'in öncesinde ACR güvenlik önbellekleri tek bir önbellekte depolanıyordu: TokenAndPermUserStore.
    • SQL Server 2008'de ACR önbellekleri ayrılmış ve ACR önbellek girişleri kendi kullanıcı depolarında izlenmiştir. Bu ayırma performansı geliştirdi ve önbellekler için daha iyi demet sayısı ve kota denetimi sağladı.
    • TokenAndPermUserStore Şu anda ve ACRCacheStores kullanılan tek güvenlik önbelleği türleridir. ACR önbellekleri hakkında daha fazla bilgi için bkz. Erişim denetimi önbelleği Sunucu Yapılandırma Seçenekleri.

Farklı önbellekler ve bunların boyutları hakkında bilgi almak için aşağıdaki sorguyu çalıştırabilirsiniz:

SELECT type, name, pages_kb 
FROM sys.dm_os_memory_clerks 
WHERE type = 'USERSTORE_TOKENPERM'

içinde büyüyen belirteç türlerini belirlemek için aşağıdaki sorguyu TokenAndPermUserStoreçalıştırabilirsiniz:

SELECT [name] AS "SOS StoreName",[TokenName],[Class],[SubClass], count(*) AS [Num Entries]
FROM
(SELECT name,
x.value('(//@name)[1]', 'varchar (100)') AS [TokenName],
x.value('(//@class)[1]', 'varchar (100)') AS [Class],
x.value('(//@subclass)[1]', 'varchar (100)') AS [SubClass]
FROM
(SELECT CAST (entry_data as xml),name
FROM sys.dm_os_memory_cache_entries
WHERE type = 'USERSTORE_TOKENPERM') 
AS R(x,name)
) a
GROUP BY a.name,a.TokenName,a.Class,a.SubClass
ORDER BY [Num Entries] desc

Geçici Çözüm

SQL Server, kotasını TokenAndPermUserStore yapılandırmak için kullanılabilecek iki izleme bayrağı sunar (Varsayılan olarak, kota yoktur. Bu, bu önbellekte herhangi bir sayıda girdi olabileceği anlamına gelir).

  • TF 4618 - içindeki TokenAndPermUserStore girdi sayısını 1024 ile sınırlar.
  • TF 4618+TF 4610 - içindeki TokenAndPermUserStore girdi sayısını 8192 ile sınırlar.

4618'in çok düşük giriş sayısı diğer performans endişelerine neden oluyorsa, 4610 ve 4618 izleme bayraklarını birlikte kullanın.

İzleme bayrakları 4610 ve 4618, Kitaplar Çevrimiçi konusu olan DBCCC TRACEON - İzleme Bayrakları'nda belgelenmiştir.

Bu izleme bayrakları, sunucusu için ilişkisiz büyümenin TokenAndPermUserStore çok büyük olduğu senaryolar için kullanılmalıdır. Bu genellikle iki tür ortamda oluşur:

  • Sunucu için kullanılabilir belleğin büyük bir kısmını kaplayan TokenAndPermUserStore ve yeni giriş oluşturma oranının önbellek çıkarma hızı kadar hızlı veya daha hızlı olduğu düşük uç veya orta uç donanım. Bu, sunucunun diğer bölümleri için bellek çekişmesi ve daha sık önbellek geçersiz kılınmasına neden olabilir (örneğin, proc önbelleği).

  • Çok fazla belleği olan üst düzey bilgisayarlar (örneğin, 1 TB'tan fazla RAM içeren son destek olayları). Bu ortamlarda önbellek deposu herhangi bir bellek baskısı yaşamadan önce büyüyebilir. Bu durum, uzun demet zincirlerinden veya yürüyüşlerden kaynaklanan performans düşüşlerine neden olabilir.

Geçici bir azaltma olarak, aşağıdaki yöntemi kullanarak bu önbelleği düzenli aralıklarla temizleyebilirsiniz:

  • Önbellekteki girdileri boşaltın TokenAndPermUserStore .

Notlar:

  1. Bunu yapmak için aşağıdaki komutu çalıştırın:

    DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

  2. Sorunlar görünmeye başladığında önbellek boyutunun TokenAndPermUserStore eşiğini gözlemleyin.

  3. Aşağıdaki eylemleri gerçekleştiren zamanlanmış bir SQL Server Agent işi oluşturun:

    • Önbelleğin boyutunu TokenAndPermUserStore denetleyin. Boyutu denetlemek için aşağıdaki komutu çalıştırın:

      SELECT SUM(pages_kb) AS 
       "CurrentSizeOfTokenCache(kb)" 
       FROM sys.dm_os_memory_clerks 
       WHERE name = 'TokenAndPermUserStore'
      
    • Önbellek boyutu gözlemlenen eşikten büyükse aşağıdaki komutu çalıştırın:

      DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')