23 Eylül 2014 Salı

SQL Server 2014 Yenilikleri - 6 (Buffer Pool Extension)

SQL Server verileri 8Kb'lık yapılar halinde tutmaktadır. Bu yapılara "page" adı verilir. İşlem görmek için talep edilen veriler öncelikle memory'e yüklenir. Mamory'deki pagelere "buffer", tüm veritabanlarındaki veri ve index pagelerinin toplandığı ortak havuza ise "buffer cache" veya "buffer pool" adı verilir.

Buffer Pool'un varlık amaçlarından birisi, I/O yükünü azaltıp veri üzerindeki işlem taleplerinin mümkün olduğunca hızlı gerçekleştirilebilmesini sağlamaktır.

Bir değişiklik talebi oluştuğunda önce veri diskten okunup Buffer Pool'a alınır ve değişiklikler uygulanır. Tam bu noktada veri diskte farklı, Buffer Pool'da farklı olabilmektedir. Buffer Pool'daki farklı verinin tutulduğu pagelere "dirty page" adı verilir. Bu dirty pageler bir takım şartların sağlanmasıyla Checkpoint adı verilen işlem sayesinde diske yazılarak kalıcı hale gelmiş olur. Aksi halde bir felaket durumunda Buffer Pooldaki pageler diske yazılmadığı için kaybedilirdi.

Verilerin Buffer Pool'da olması hızlı erişim için büyük avantaj sağlamakta. Daha büyük memory, daha geniş bir Buffer Pool ve bu da daha çok veri ile daha az gecikmeli çalışma anlamına gelir.

SQL Server'ın performansını arttırmak için donanımsal çözümlere sarılmak en son yapılacak işlerdendir. Ancak bazen konu memory artırımına kadar gelmiş olabilir. Eğer imkan varsa memory arttırımı gerçekleştirilir.

Peki ya daha geniş bir Buffer Pool ihtiyacı doğmasına rağmen, memory arttırımı yapılamıyorsa veya yapılması istenmiyorsa?

Bu konudaki talepleri değerlendiren Microsoft, SQL Server 2014 ile birlikte Buffer Pool'u diske genişletebilme özelliğini duyurmuştur. 

Buffer Pool'u genişletmeniz gerekmesine rağmen, anakart gibi donanımsal limitlere, çeşitli kurallara, yüksek fiyatlara takılarak memory arttırımını gerçekleştiremiyorsanız "Buffer Pool Extension (BPE)" özelliğine bir göz atmak isteyebilirsiniz. Belki de sadece kısa bir dönem için daha geniş bir Buffer Pool'a ihtiyacınız vardır. Bu durumda donanım değişikliğine gitmenize gerek kalmayacaktır.

SQL Server 2014 ile birlikte gelen "Buffer Pool Extension (BPE)" özelliği kolayca konfigure edilebilir. Bu sebeple esnek depolama alanı imkanı sunar. Disk ile memory fiyat bakımından karşılaştırıldığında da ceplerin daha sıcak kalacağı malumdur.

Memoryi diske genişletme fikri yüksek performans kazanılacağı konusunda pek ikna edici olmayabilir. Ancak bardağın dolu tarafından bakarsak eğer; çok daha büyük bir veri kümesini toplamda, memorye nazaran daha yavaş, diske nazaran daha hızlı şekilde kullanabiliriz. Buradan anlaşılıyor ki, BPE özelliğinin getirisini arttırmak için disk seçimi de bir hayli önem arz etmektedir. Klasik HDD yerine yaklaşık 100 kat daha hızlı SSD diskler tercih edilmelidir. 

BPE, özellikle okuma ağırlıklı OLTP iş yükleri için performans kazancı sağlamaktadır. Diskte ayırdığımız BPE alnında clean pageler yani commit edilmiş veriler saklandığı için herhangi bir anomali beklenmez. Özetle veri kaybı riski memoryde olduğundan fazla değildir. Eğer diskin başına bir şey gelirse BPE otomatik olarak disable olur. Dolayısıyla serverın çalışmasını engelleyecek bir durum beklenmez. Manual olarak yönetilebildiği gibi, instance başlatıldığında da yeniden aktif olacaktır(belirtilen yol varsa). Bu özelliğin güzel taraflarından birisi de herhangi bir uygulama taraflı değişiklik yapmaya gerek kalmadan ihtiyaç duyulduğunda aktif edilebilmesi ve kaldırılabilmesidir.

Nasıl yapıyoruz?

Oldukça basit şu script yardımıyla diskte "EkHavuz.BPE" isminde 10 GB boyutunda bir alan rezerve edebiliriz. BPE'yi hatasız aktif edebilmek için SIZE parametresi her defasında mevcut Buffer Pool'dan büyük olarak belirtilmelidir.

ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION ON
     (
         FILENAME = 'D:\EkHavuz.BPE',
         SIZE = 10 GB

     )



Böylece EkHavuz.BPE alanını memory Buffer Pool'umuza extend etmiş olduk. Şu DMV yardımıyla BPE konfigurasyonu hakkında bilgi alabilirsiniz:

SELECT
path,
file_id,
state,
state_description,
current_size_in_kb
FROM sys.dm_os_buffer_pool_extension_configuration;


EkHavuz.BPE'nin hangi veritabanından kaç tane page barındırdığını görmek isterseniz aşağıda gibi DMV'den faydalanabilirsiniz:

SELECT
COUNT(*)AS cached_pages_count
    ,CASE database_id
        WHEN 32767 THEN 'ResourceDb'
        ELSE db_name(database_id)
     END AS database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id) ,database_id
ORDER BY cached_pages_count DESC;

BPE özelliğini pasif hale getirmek isterseniz şu scripti çalıştırmanız yeterli:

ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION OFF

SQL Server 2014 ile gelen "Buffer Pool Extension" özelliği memory arttırımına gerek kalmadan diski kullanarak Buffer Pool'u genişletmemizi sağladı. İşe yarar bir özellik.

Bu faydalı ve esnek depolama hizmeti Enterprise, Standart ve Business Intellingence sürümlerinde kullanılabilmektedir.

Bir gün sizin de işinize yarayabilir.

2 yorum: