Başlangıç > Storage > 130: Disk alignment ve önemi

130: Disk alignment ve önemi

Disk performansı söz konusu olduğunda en önemli pratiklerden biri kullanılan disklerin align olup olmamalarıdır ve disk kutusunun performansını birinci dereden etkileyecektir. Peki nedir bu disk alignment ve gerçekten bu kadar önemli midir? Öncelikle bazı temel kavramları açıklamaya çalışalım.

Fiziksel bir diskten söz ettiğimiz noktada iki adet kavram önem kazanır, sector ve track. Sector bir disk üzerinde adreslenebilir en küçük alandır ve genelde 512 byte bilgiden oluşmaktadır. Track, diskin bir yüzünde sektörlerden oluşan ve halka şeklindeki alana verilen isimdir. Bir track içerisinde yer alan sektör sayısı disk üreticisine göre farklılık gösterebilir, genelde 64, 128, 256 karşılaşılan değerlerdir. Aşağıdaki resmin durumu daha net açıklayabileceğini düşünüyorum.

Windows 2003 işletim sistemi, bir diski formatlarken ilk 63 sektörü rezerve eder ve bu alanı MBR (Master Boot Record) için kullanır. Dolayısı ile asıl kullanılabilir disk alanını birinci track içerisindeki 63 numaralı sektörden başlatacaktır. Eğer elimizdeki diskin bir track’inin 64 sektörden oluştuğunu varsayarsak, gelecek ilk IO’nun ilk 512 byte’ı birinci track içerisinde kalacak, geri kalan kısmı ise ikinci track içerisinde yer alacak. Aslında disk kutusu açısından baktığımızda, her katmanda gerçekleşecek operasyon sayısı bir yerine iki olacaktır, iki adet IOPS oluşacak, cache üzerinde iki slotluk alan kullanılacak ve diske iki adet flush operasyonu gerçekleşecek, iki disk kafası bu işlemi gerçekleştirebilecek, vs… Bunun doğal sonucu ise, disk performansının düşmesi olacaktır.

Yukarıda görüldüğü gibi #1 numaralı partition align edilmemiş durumdadır ve gelen ilk 4KB büyüklüğünde IO farklı track’lere yazılmaktadır. Gelen tüm IO’ların 4KB büyüklüğünde olduğunu varsayarsak, her 8 IO’dan biri bir sonraki track’e taşacaktır. Eğer gelen IO boyutu 32KB yada 64KB büyüklüğünde olduğu durumda, durumun ciddiyeti ve performansa olan etkisi çok daha artacaktır. #2 numaralı partition ise olması gerektiği gibi align durumdadır ve gelen IO’lar sadece tek bir track’e yazılabilmektedir.

Bir iyi haber, 2008 işletim sistemleri için endişe etmemize gerek yok, çünkü diski kendisi otomatik align edebiliyor. Ancak 2003 ve öncesi işletim sistemleri için bunu elle yapmak zorundayız. Internette bunun nasıl yapılabileceği ile ilgili çok sayıda makale bulabilirsiniz.

Peki gerçekten performansa etkisi ne kadar? Basit bir google yaptığınızda %10, %30, %50 gibi performans kayıplarından bahsedildiğini görebilirsiniz. Ben de yaptığım basit bir test ile elde ettiğim sonucu paylaşayım.

Test için 8 disk (SAS 15K) ve RAID5 yapısında bir pool oluşturdum. Buradan 50GB’lık bir diski, Windows 2003 bir sunucuya tanıttım ve 64KB’lık cluster size’da formatladım. İlk testi yaparken align olmasına dikkat ettim (starting offset olarak 1024 tanımladım), ikinci testte ise Windows’un standard disk management aracını kullanarak formatladım yani align olmayacak şekilde. Testi SQLIO aracını kullanarak yaptım. İsmi yanlış yönlendirmesin, aslında aracın SQL ile uzak yakın ilgisi olduğunu düşünmüyorum, istediğiniz formatta IO üreten bir stress test aracı. Testi gerçekleştirirken %100 random read ve 64KB’lık bloklar kullandım. Özet olarak elde ettiğim sonuçlar:

  • Align olan disk align olmayan diske oranla %40 daha fazla IOPS yaptı.
  • Align olan disk align olmayan diske oranla %44 daha fazla throughput üretti.
  • Align olan diskte ortalama latency 5ms iken, align olmayan diskte 8ms görüldü.
  • Maksimum latency incelendiğinde, arada %30 fark olduğu görüldü.

Sözün özü şudur ki, disk alignmemt kesinlikle atlanmaması gereken bir konu.

Testin detaylarını merak edenler devam edebilir :)


C:\Program Files\SQLIO>sqlio -kR -t4 -s120 -dE -o2 -frandom -b64 -BN -LS a.dat
sqlio v1.5.SG
using system counter for latency timings, -1894667296 counts per second
4 threads reading for 120 secs from file E:a.dat
        using 64KB random IOs
        enabling multiple I/Os per thread with 2 outstanding
        buffering set to not use file nor disk caches (as is SQL Server)
using current size: 24576 MB for file: E:a.dat
initialization done
CUMULATIVE DATA:
throughput metrics:
IOs/sec:  1255.63
MBs/sec:    78.47
latency metrics:
Min_Latency(ms): 0
Avg_Latency(ms): 5
Max_Latency(ms): 67
histogram:
ms: 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24+
%:  1  1 12 16 16 16  8  5  5  5  2  2  2  2  1  1  1  1  0  0  0  0  0  0  1

C:\Program Files\SQLIO>sqlio -kR -t4 -s120 -dE -o2 -frandom -b64 -BN -LS a.dat
sqlio v1.5.SG
using system counter for latency timings, -1894667296 counts per second
4 threads reading for 120 secs from file E:a.dat
        using 64KB random IOs
        enabling multiple I/Os per thread with 2 outstanding
        buffering set to not use file nor disk caches (as is SQL Server)
using current size: 24576 MB for file: E:a.dat
initialization done
CUMULATIVE DATA:
throughput metrics:
IOs/sec:  1262.98
MBs/sec:    78.93
latency metrics:
Min_Latency(ms): 0
Avg_Latency(ms): 5
Max_Latency(ms): 61
histogram:
ms: 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24+
%:  1  1 13 16 16 16  8  5  5  4  2  2  2  2  1  1  1  1  0  0  0  0  0  0  1

C:\Program Files\SQLIO>
C:\Program Files\SQLIO>     ****** Burada misalign yapıyoruz *********
C:\Program Files\SQLIO>
C:\Program Files\SQLIO>sqlio -kR -t4 -s120 -dE -o2 -frandom -b64 -BN -LS a.dat
sqlio v1.5.SG
using system counter for latency timings, -1894667296 counts per second
4 threads reading for 120 secs from file E:a.dat
        using 64KB random IOs
        enabling multiple I/Os per thread with 2 outstanding
        buffering set to not use file nor disk caches (as is SQL Server)
using current size: 24576 MB for file: E:a.dat
initialization done
CUMULATIVE DATA:
throughput metrics:
IOs/sec:   879.57
MBs/sec:    54.97
latency metrics:
Min_Latency(ms): 0
Avg_Latency(ms): 8
Max_Latency(ms): 87
histogram:
ms: 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24+
%:  1  0  2  7 11 16  9  8  8  7  4  4  4  3  2  2  2  2  1  1  1  1  1  0  3

C:\Program Files\SQLIO>sqlio -kR -t4 -s120 -dE -o2 -frandom -b64 -BN -LS a.dat
sqlio v1.5.SG
using system counter for latency timings, -1894667296 counts per second
4 threads reading for 120 secs from file E:a.dat
        using 64KB random IOs
        enabling multiple I/Os per thread with 2 outstanding
        buffering set to not use file nor disk caches (as is SQL Server)
using current size: 24576 MB for file: E:a.dat
initialization done
CUMULATIVE DATA:
throughput metrics:
IOs/sec:   873.10
MBs/sec:    54.56
latency metrics:
Min_Latency(ms): 0
Avg_Latency(ms): 8
Max_Latency(ms): 79
histogram:
ms: 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24+
%:  1  0  2  7 11 16  9  8  8  7  4  4  4  3  2  2  2  2  1  1  1  1  1  1  3

Kategoriler:Storage Etiketler:,
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

w

Connecting to %s

%d blogcu bunu beğendi: