Pages

3 Ocak 2011 Pazartesi

Oracle 10g veritabanı için Solaris sistemde TLB/TSB Misses ve Pages Fault oranlarının iyileştirmesi

TLB ve TSB terminolojisi 

Bir proses bellek talep ettiğinde bu talep için sadece sanal bellek ayrılılır. Fiziksel bellek henüz ayrılmamıştır. Bir proses bu ayrılan sanal bellek içindeki sayfaya(page)  erişim talep ettiğinde, sayfa hatası(page fault) oluşur. Sonuçta, bu prosesin sanal sayfasına boş listeden bir fiziksel sayfa ile eşleştirilir.
Bu eşleşme yazılım içindeki sanal bellek sistemi tarafından oluşturulur ve HAT Mapping Entries(HME) formunda HPT(Hash Page Tables) içinde saklanır. Ayrıca bunun bir kopyasıda TLB ve TSB içine Translation Table Entries(TTE) olarak girilir.


TLB(Translation Lookaside Buffer), CPU üstündeki fiziksel bellek eşleştirmelerine veya TTE’lere karşı en güncel kullanılan sanal önbellektir. CPU üzerinde birden fazla TLB’ler olabilir.
TLB içinde giriş sayıları sınırlı olduğundan dolayı TTE’ler için fiziksel RAM içinde TSB(Translation Storage Buffer) olarak adlandırılan daha büyük bir önbelle vardır. Her prosesin kendine ayrılmış bir TSB si vardır.

Solaris 10 üzerinde bir kullanıcı proses TSB sinin büyüyebileceği default ve maksimum(en çok 1MB/user process’e kadar) büyüklüler değişiklik gösterebilir. TSB gerektikçe ve her proses 2 TSB ye sahip olana kadar-biri (K,16K ve 512 pages, diğeri ise 4MB pages- büyür ve sıkıştırılır. Tüm kullanıcı TSB leri için ayrılacak maksimum bellek ayrıca tahsis edilebilir.

Sayfa Hatası(Page Fault)
CPU, TTE için once TLB’yi kontrol eder, eğer bulamazsa(TLB Miss) bu sefer TSB’yi kontrol eder. Eğer burdada bulamazsa(TSB Miss) bu sefer HME için HPT’yi kontrol eder. Eğer HPT içindede yer almazsa bu sefer “page fault” oluşur.

TLB/TSB Misses ve Page Faults hatalarının veritabanı üzerinde etkileri
Fiziksel Ram teknolojisi geliştikçe sunucuların daha yüksek RAM boyutlarında çalışması sonucunda veritabanı uzmanları daha büyük SGA ve PGA boyutlarında çalışma fırsatına kavuştu. Ancak, 8K pages ve 16 GB fiziksel RAM olan Solaris sisteminde yaklaşık 2 milyon eşleşmeyi mevcut fiziksel belleğe adreslemek gerekecektir. Eğer sistem Linux ise aynı fiziksel Ram boyutunda 4K pages ortamında eşleşme sayısı yaklaşık 4 milyon olacaktır.
Maksimum verim için birbiriyle ilişkili girişlerin CPU’ya en az gecikmeyle erişmesi gerekmektedir. Buna rağmen, TLB nin tutabileceği giriş sayısı donanım tarafında sınırlandırılmıştır. Solaris 10 için tekli kullanıcı prosesinin TLB si en fazla 1MB(65,536 giriş) a kadar büyüyebilmektedir, bu da haliyle sınırlı bir büyüme olmaktadır.
Oracle tarafında eğer CPU en fazla bekleme olaylarından birisiyse ve uygun CPU, CPU zamanlama ve page fault gibi konularda sıksık sorunlar oluşuyorsa, bu noktada TLB/TSB Misses oranına dikkatlice odaklanmanız gerekmektedir. 
Neyi gözlemlemeli ve nasıl analiz etmeliyiz?
UNIX/Linux üzerinde root hesabından trapstat –T komutu bize ilgili page boyutları için TLB/TSB Misses oranlarını verecektir. Alttaki örnektede görüldüğü üzere bu rapor bize kullanıcı modu(u) ve kernel modu(k) dahilindeki yüzdesel olarak harcanan zamanı göstermektedir. TLB ve TSB sonuçları kırılımlı olarak altlı üstlü aşağıdaki gözükmektedir.

En alt kırmızı satır tüm CPUlar için toplam istatistikleri verir. Page faults oranları ise vmstat –s sistem komutu sonucunda alttaki gibi elde edilir.

TLB/TSB Misses ve Page Faults oranlarını nasıl azaltabiliriz?
Segmente eşleşmede giriş sayısını azaltmak için daha büyük boyutlarda pages kullanılmalıdır. Alttaki tavsiyeler bu oranları azaltmanıza yardımcı olacaktır.
  • İş parçacıklarının yer değiştirme oranını azaltın: İş parçacıklarının benzerlikleri bu iş parçasının daha once olduğu gibi aynı CPU üstünde işleme konmasını sağlar. Bu da CPU üstünde TLB içindeki aynı iş parçacıklarını çalıştırmak sebebiyle bu girişleri değiştirme aşamasında verimlilik sağlar.İş parçacıklarının yer değiştirme oranlarını görmek için sistemde mpstat komutunu kullanarak migr kolonu altındaki değerlere bakabilirsiniz. İş parçacıklarının benzerlikleri bir sistem parametresi olan rechoose_interval aracılığı ile ayarlanabilir. Varsayılan ayar 3 tür, datawarehousing uygulamalarında 150 civarında olması tavsiye edilir.
  • Oracle paylaşımlı bellek(shared memory): Solaris sistemlerde Oracle ISM i paylaşımlı bellek için kullanır. ISM ise diğer faydalarla birlikte 4M pages kullanımı sağlar, hatta Solaris 10 ve Ultra Sparc IV+ platformun en büyük olabilecek pages değerini zaten başlangıçta otomatik ayarlar. Bununla beraber TLB/TSB Misses oranınıda otomatik olarak azaltır. Aslında bu olay bile Oracle için Solaris tercih edilmesinin haklı sebeplerindendir.
  • Oracle PGA: PGA için pages boyutu Oracle 10g den itibaren _realfree_heap_pagesize_hint parametresince kontrol edilmektedir. _realfree_heap_pagesize hinti ile PGA daha büyük boyutlarda bellek sayfa miktarını kullanabilir, böylece TLB/TSB kayıpları azalır. Bu parametre byte değerindedir. Bu parametrenin ayarlanması bilhassa büyük oranlarda anonim bellek kullanan ve pek çok durumdada çalışma alanının SGA’dan daha büyük olduğu datawarehousing gibi sistemlerde gerçekten önemlidir.Varsayılan ayar 64k dır. Halbuki 64K gözükmesine rağmen sistem 8K olarak işlem yapabilmekte ve TLB/TSB misses noktasında ciddi sıkıntılar oluşabilmektedir. Halbuki bu değer 512k veya 4MB olarak değiştirilirse 512K veya 4MB olarak işlem yapmaktadır. Bu değerin değiştirilmesi sonucunda fiziksel bellek, o değer(64K,512K veya 4MB) boyutunda bellek parçacıkları tahsis edecek ve aynı zamanda page faults hataları oluşumu ciddi oranda azalacaktır.
  • TSB yapılandırması: Solaris 10 üzerinde varsayılan başlangıç TSB boyutunu artırın. TSB içindeki her bir giriş 16 bytes miktarına ihtiyaç duyar. Böylece SGA ve PGA için tahsis edilen fiziksel bellek boyutuna bağlı olarak TSB boyutunu ayarlayabilirsiniz. /etc/system içinde ayarlanması gereken bir kısım TSB parametreleri alttadır.
    1. default_tsb_size: Varsayılan değer 0(8K) dır. 8K 512 giriş tutabilmektedir. 12Gb SGA(4M pages değerinde) ve 6GB PGA(4M pages değerinde) lık Oracle yapılandırmasında muhtemelen 3072 girişe veya 48KB TSB ye gereksinim olacaktır.
    2. tsb_alloc_hiwater_factor: Varsayılan ayar 32 dir. Bu değer tüm kullanıcı prosesleri için sistem üstündeki toplam TSB kullanımını fiziksel belleğin 1/32 sini aşmamasını garanti altına alır. 32Gb fiziksel Ram e sahip olduğunuzda toplam TSB kullanım değerin en fazla 1Gb olması gerekir.
    3. tsb_rss_factor: Varsayılan ayar 384 dür. Bu değerin 308 olarak değiştirilmesi %60 lık TSB kullanım oranı sağlayacağından optimal bir değer olacaktır. varsayılan ayarda TBS kullanımı %75 tir(384/512)
    4. tsb_sectsb_threshold: Solaris 10 platformunda her bir proses 2 adet TSB ye kadar olabilir. Bu değer, birinci TSB nin 4MB lık pages tamamlanmadan  ikinci TSB nin 4MB lık pages başlayıp başlamamasını sağlayan büyüklük değerini temsil eder. CPU hızına bağlı değişir. Varsayılan ayar 8K dır. Bu durumda her iki TSB de eşzamanlı çalışabilmektedir. Eğer TSB oranı değişirse bu oranında 2 TSb yi aynı anda başlamasını sağlamak üzere değiştirilmesi gerekecektir.

0 yorum:

Yorum Gönder