VHD Block Fragmentation – Parçalanma

03.03.2015
0

Virtual hard disk’ler yani VHD’ler, Hyper-V VM’lere disk olarak eklenen ve Guest OS tarafından okuma/yazma amaçlı yerel depolama alanı olarak kullanılan 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 VHD ifadesini her iki türü de ifade etmek için kullanacağım.

Bahsetmek istediğim konu VHD structure’da ortaya çıkan ama pek göz önünde olmayan ve zaman ilerledikçe VM’lerin performansını olumsuz etkileyebilen sinsi düşman Block Fragmentation meselesi. Hyper-V VM’lere bağlı olarak çalışan Dynamic VHD’ler (dinamik olarak genişleyen sanal diskler) zaman içerisinde block seviyesinde dağılarak parçalanırlar ve 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 şöyle: Özellikle geleneksel disk birimleri (dönen diskler, plaka tabanlı) üzerindeki volume’larda yani dosya sistemlerinde yaşanan parçalanmalara şahit olmuşsunuzdur. Belirli dönemlerde uygulanan defrag (birleştirme) işlemiyle bu parçalanmalar büyük oranda ortadan kaldırılır ve disk birimleri özellikle okuma isteklerine daha hızlı bir şekilde yanıt verebilir hale gelir. Ama volume’lara yeni veriler yazıldıkça ve aralardan eski veriler silindikçe ve sonra tekrar yazıldıkça parçalanma yeniden ortaya çıkar ve bir kez daha defrag gereksinimi oluşur. 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 çalışan apllication’lar o VM’e atanmış sanal disk birimlerini kullanırlar. Bu sanal disk birimleri üzerindeki dosya sisteminde bir parçalanma söz konusu ise, bu durum yine o Guest OS ve application’larda doğrudan hissedilecektir. 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 (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ın arasında boşluklar oluşur, parçalanmalar yaşanır. İşte yaşanan bu duruma VHD Block Fragmentation diyoruz. Aşağıda temsili bir diyagram görebilirsiniz. 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ış yani 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.

vhd-fragmentation-diagram2

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

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 sorununa çö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. Bu işin de bir kolayı var tabii. Duruma göre aşağıdaki 3 seçenekten birini tercih edebilirsiniz.

  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 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. Ve ayrıca aklınızda bulunsun: 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 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 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 konusu olabilir. Bu meseleye belki bir başka yazıda ele alırız.

Yorum Ekle

* Gerekli

* Gerekli

* Tercihen