VHD Block Fragmentation – Parçalanma

03.03.2015 | 20:56 Çözümler , Dokümanlar , Hyper-V 0 Yorum

VHD’ler (virtual hard disk) Hyper-V VM’lere disk olarak eklenen ve Guest OS tarafından yerel depolama amaçlı okuma/yazma (i/o) gerçekleştirilen dosyalardır. Hyper-V platformunda sanal disklerin VHD ve VHDX olmak üzere iki farklı formatı bulunur. Her iki format da temelde aynı işe yarar ancak VHDX’ler bazı durumlarda daha yetenekli, daha performanslı ve daha dayanıklıdır. Bu yazıda her ikisi için de VHD ifadesini kullanıyorum, siz hem VHD hem de VHDX olarak düşünebilirsiniz.

Bahsetmek istediğim konu VHD structure’da ortaya çıkan ama pek göz önünde olmayan, zaman ilerledikçe VM’lerin performansını olumsuz etkileyebilen sinsi düşman Block Fragmentation meselesi.

Hyper-V VM’lere bağlı olarak çalışan Dynamically Expanding VHD’ler (dinamik olarak genişleyen sanal diskler) zaman içerisinde block seviyesinde parçalanırlar yani fragmante olurlar (fragmentation). Bu da söz konusu VHD’nin performansını olumsuz yönde etkileyen faktörlerden biridir.

Sanallaştırmayı bir kenara bıraktığımızda fiziksel sunucular için durum şu: Özellikle spinning disk birimleri (dönen diskler, plaka tabanlı) üzerindeki volume’larda (aslında dosya sisteminde) yaşanan parçalanmalara şahit olmuşsunuzdur. Belirli dönemlerde uygulanan birleştirme yani defrag (defragmentation) işlemiyle bu parçalanmalar büyük oranda ortadan kaldırılır ve disk birimleri özellikle okuma isteklerine daha derli toplu veri dağılımı ile daha hızlı bir şekilde yanıt verebilir hale gelir. Ama volume’lara yeni veriler yazıldıkça, aralardan eski veriler silindikçe ve sonra yeniden yazıldıkça parçalanma tekrar ortaya çıkar ve yine defrag gereksinimi oluşur. Tekrar… tekrar… ve tekrar… Aslında işin doğası gereği yaşanan bir kısır döngüdür bu. Mesela tam da bu yüzden Windows Server 2012 gibi modern işletim sistemlerinde periyodik olarak (eğer yanlış hatırlamıyorsam haftada bir) çalışacak şekilde background defrag task’lar schedule edilmiştir. Ama ne zaman ki işin içerisine sunucu sanallaştırma giriyor, işte o zaman konu da biraz farklılaşıyor.

Aslına bakarsanız bir VM içerisindeki Guest OS için durum yukarıdaki ile neredeyse aynı. Guest OS (ve apllication’lar) o VM’e atanmış sanal disk birimlerini (VHD) kullanırlar. Bu sanal disk birimleri üzerindeki dosya sisteminde bir parçalanma söz konusu ise, bu durum yine o Guest OS (ve apllication’lar) seviyesinde doğrudan hissedilir. Ancak bu katmandaki parçalanma aslında fiziksel disk üzerinde değil doğrudan VHD file structure içerisinde yaşanır.

Aşağıdaki diyagramda henüz belirgin bir parçalanma yaşanmamış VHD structure’ı ve bu VHD dosyasının Host’a bağlı fiziksel disk üzerinde konumlandığı daha alt katmanı görebilirsiniz. Host üzerindeki bu diğer (daha alt) block gurubu aslında o VHD için belki doğrudan değil ama dolaylı yoldan fragmante olma ihtimali olan bir katman daha bulunduğu anlamına geliyor. Bu daha alt katmandaki durumu şimdi ele almıyorum ama yazının sonunda kısa bir paragraf bulabilirsiniz.

vhd-fragmentation-diagram1

I/O karakteristiğine de bağlı olarak zaman içerisinde Guest OS tarafından okuma/yazma yapılan VHD block’larında parçalanmalar yaşanır, aralarında boşluklar oluşur, mesafeler girer… İşte yaşanan bu duruma VHD Block Fragmentation diyoruz. Aşağıda temsili bir diyagram görebilirsiniz.

vhd-fragmentation-diagram2

Dikkat ederseniz Guest OS’e ait veriler VHD dosyasının structure’ı içerisinde çeşitli block’lara dağılmış, aralara boşlular girmiş ve benzer dosyalara ait veriler birbirinden uzaklaşmış (parçalanmış) durumda. İşte bu istenen bir durum değildir. Bu yüzen de belirli periyotlarda takip edilmesi, ortaya çıktığında ise müdahale bulunulması önerilir.

Block Fragmentation’a Maruz Kalmış VHD’leri Tespit Etmek

Fragmented durumdaki VHD’leri ve fragmentation yüzdelerini tespit etmek için doğrudan Hyper-V Host veya Hyper-V PowerShell Module’ün yüklü olduğu uzak bir sistem üzerinden Get-VHD cmdlet’ini -Path veya -VMId parametrelerinden biriyle çalıştırabilirsiniz. VM açıkken yani VHD kullanımdayken çalıştırmak mümkün. Mesela file path’i bildiğiniz bir VHD’ye aşağıdaki gibi bakabilirsiniz.

Get-VHD -Path "D:\VMs\Prod\IPW-SRVMGR2\Virtual Hard Disks\IPW-SRVMGR2_disk2.vhdx"

get-vhd-fragmentationpercentage

Dönen sonuçlar arasındaki FragmentationPercentage alanı yüzde cinsinden bu VHD için block seviyesinde parçalanma oranını gösterir. Ayrıca basit döngülere sokarak bir PowerShell Script’e dönüştürmek ve tüm ortam için kullanmak mümkün.

Elinizdeki bir diğer seçenek ise bu işi oldukça kolaylaştıran ve yine tüm ortam için topluca raporlayan Get-HyperVReport.ps1 aracını kullanmak. Get-HyperVReport.ps1’i bir kez çalıştırdığınızda ortamdaki tüm VM’leri kontrol edip diğer birçok şeyle birlikte VHD’lerin fragmentation durumlarını da raporlayabilir.

get-hypervreport-vhd-fragmentation

Fragmented durumdaki VHD’leri tespit ettiniz, peki nasıl düzeltebilirsiniz?

Block Fragmentation’a Maruz Kalmış VHD’leri Düzeltmek

Öncelikle Optimize-VHD (diğer bir ifade ile Compact işlemi) bu süreçte işe yaramayacaktır. Optimize-VHD, Guest OS volume üzerinde defrag yapıldıktan sonra VHD data file’ın boyutunu küçültmek için işe yarayabilir. Ancak -her ne kadar Compact sonrasında VHD data file’ın fiziksel disk üzerindeki bazı block’ları serbest kalacak olsa da- tüm VHD Block Fragmentation durumuna çözüm üretemez.

Bana göre block seviyesinde fragmented VHD’ler için yapılabilecek en başarılı müdahale, o VHD’yi alıp bir şekilde boş bir VHD’ye yeniden yazmak ve daha sonra yeni kopya ile yola devam etmektir.

Durun durun hemen korkmayın :) Bu işin de bir kolayı bulunur.

Elinizde 3 Seçenek Var

Duruma göre aşağıdaki 3 seçenekten birini tercih etmelisiniz.

1) VM’i kapatmadan Live Storage Migration ile yeni bir volume’a veya aynı volume içerisinde yeni bir dizine canlı olarak taşıyabilirsiniz. İlk bakışta anlamsız gibi görünebilir ama bu işlem, VM’e bağlı tüm VHD’leri block seviyesinde okuyup hedef lokasyonda oluşturduğu yeni bir VHD’ye yazacağı için VHD Block Fragmentation da otomatik olarak ortadan kalmış olur. Kesintisiz, temiz ve zahmetsiz :) Ama taşıma öncesinde hedef depolama alanı üzerinde en az kaynak VHD boyutları (aslında içerisindeki volume used size’lar) kadar boş alan olması gerektiğini unutmayın. Taşıma süresince yeterli boş disk alanı sağlanmazsa VM’in suspended duruma geçme ihtimali var. Bu da downtime demek.

VM’i kapatıp VHD’lerini copy/paste ile taşımak çözüm olmayacaktır çünkü söz konusu fragmantasyon zaten VHD structure’da yaşandığı için copy/paste ile taşıma sırasında VHD yeni lokasyona fragmented block’lar ile birlikte gider.

2) Convert-VHD ile fragmented VHD’yi yine aynı formatta ve aynı türde dönüştürerek ikinci kopyasını oluşturmak ve bu noktadan sonra yeni kopyayı kullanmak. Bu sırada VM kapalı yani VHD’ler kullanılmıyor olmalı. Bu senaryoda downtime söz konusu. Ve yine boş disk alanına dikkat.

3) Hyper-V Manager‘da New > Hard Disk ile yeni sanal disk oluşturma sihirbazını başlatın. Tercihlerinizi yaparak Configure Disk penceresine kadar ilerleyin ve burada copy the contents of the specified virtual hard disk seçimi ile fragmented durumdaki VHD’yi gösterin ve oluşturma işlemini başlatın. Bu sırada fragmented yani kaynak VHD yine kullanılmıyor olmalı. Oluşturma işlemi başladığında göstermiş olduğunuz kaynak VHD içeriği block seviyesinde okunur ve hedef VHD’ye block seviyesinde sıralı olarak yazılır. Böylece parçalanma da ortadan kalkmış olur. Ardından yeni VHD’yi VM’e bağlayarak devam edebilirsiniz.

Son olarak yazının başında bahsettiğim konuyla ilgili ufak bir not. VHD structure’da yaşanan bu parçalanmanın bir benzeri, VHD’ye göre daha alt katman olan ve doğrudan Host’a bağlı fiziksel disk block’ları üzerinde de ortaya çıkabilir. VHD’ler aslında Host tarafından erişilen fiziksel depolama alanlarında duran birer dosyadır ve bu katmanda da ikinci bir parçalanma yaşanabilir. Yaşanabilir diyorum çünkü bu katmandaki parçalanmaya etki eden çeşitli faktörler vardır ve iyileştirme noktasında kendi kendine düzeltme veya storage array seviyesinde otomatikleştirilmiş bazı destekler söz konusudur. Bu meseleye belki bir başka yazıda değinirim. Kahvem bitti. Bana müsaade :)

Şimdilik parçalanmanın az olduğu günler dilerim, ama ne mümkün :)

Yazı Etiketleri: , ,

Sayfa Başı ▲

Yorum Ekle