NVMe, SSD'lerin SATA yerine doğrudan PCIe veri yolu üzerinden işlemciyle konuşmasını sağlayan depolama protokolüdür. AHCI/SATA tek komut kuyruğu ve 32 komutla sınırlıyken NVMe 65.535'e kadar kuyruğu ve kuyruk başına 65.536 komutu destekler. Sunucuda bu, özellikle veritabanı gibi çok sayıda küçük ve eşzamanlı okuma-yazma yapan iş yüklerinde daha düşük gecikme ve daha az iowait demektir.
Bu yazıda NVMe'nin neden fark yarattığını ölçülebilir kavramlarla (IOPS, gecikme, kuyruk derinliği) açıklıyor, sanal sunucuda NVMe'nin paylaşılan bir kaynak olduğunu hatırlatıyor ve diskinizi fio ile nasıl test edeceğinizi gösteriyoruz. Donanım karşılaştırması yapıyorsanız NVMe VDS seçenekleri sayfasında disk kapasitelerini paket bazında görebilirsiniz.
NVMe nedir?
NVMe (NVM Express), flash tabanlı depolama için sıfırdan tasarlanmış bir protokoldür. NVM Express'in resmi özetine göre protokol, bant genişliği, IOPS ve gecikme sorunlarını birlikte ele almak için geliştirildi; ilk sürümü 2011'de yayımlandı.
PCIe veri yolu
PCIe (PCI Express), işlemciyi ekran kartı, ağ kartı ve disk gibi bileşenlere bağlayan yüksek hızlı veri yoludur. Veri, "hat" (lane) adı verilen paralel bağlantılar üzerinden taşınır; sunucu NVMe diskleri genellikle 4 hat (x4) kullanır. NVM Express'in özetinde PCIe Gen3 x4 bağlantının yaklaşık 4 GB/sn taşıdığı belirtilir; sonraki PCIe nesilleri hat başına bant genişliğini artırır. SATA III arayüzü ise 6 Gbit/sn ile sınırlıdır; kodlama payı düşüldüğünde bu yaklaşık 600 MB/sn'lik bir tavan demektir. SATA SSD'lerin sıralı okumada 500 MB/sn civarında takılmasının nedeni flash bellek değil, bu arayüzdür.
NVMe protokolü ve kuyruklar
SATA diskler AHCI (Advanced Host Controller Interface) protokolüyle yönetilir. AHCI mekanik diskler için tasarlandı: tek bir komut kuyruğu ve bu kuyrukta en fazla 32 komut. Bir HDD'nin okuma kafası zaten aynı anda tek bir yere gidebildiği için bu sınır sorun değildi. Flash bellek ise çok sayıda bağımsız yongaya aynı anda erişebilir; tek kuyruk bu paralelliği boşa harcar.
NVMe 65.535 G/Ç kuyruğuna ve kuyruk başına 65.536 komuta kadar izin verir. NVM Express'in teknik belgesine göre işletim sistemi her işlemci çekirdeği için ayrı bir kuyruk çifti (gönderim ve tamamlanma kuyruğu) oluşturabilir; böylece çekirdekler birbirini kilitlemeden G/Ç gönderir. NVM Express'in özetine göre de NVMe, bir G/Ç isteğini işlemek için SAS veya SATA'nın yarısından az işlemci talimatı kullanır. Linux tarafında bu paralelliği kullanan katman blk-mq'dur (çok kuyruklu blok katmanı); çekirdek dokümantasyonu, eski tek kuyruklu ve tek kilitli tasarımın çok işlemcili sistemlerde ölçeklenmediğini ve darboğazın diskten işletim sistemine kaydığını anlatır. Bu sayılar protokolün üst sınırıdır; gerçek cihazlar çok daha az kuyrukla çalışır. Önemli olan, SATA'daki gibi protokolün kendisinin darboğaz oluşturmamasıdır.
NVMe, SATA SSD ve HDD farkı
Üç disk tipi arasındaki fark arayüzden, protokolden ve depolama ortamından gelir.
| Özellik | HDD | SATA SSD | NVMe SSD |
|---|---|---|---|
| Arayüz | SATA veya SAS | SATA III (6 Gbit/sn) | PCIe (genellikle x4) |
| Protokol | AHCI (SATA) | AHCI | NVMe |
| Komut kuyruğu | 1 kuyruk × 32 komut (SATA) | 1 kuyruk × 32 komut | 65.535 kuyruk × 65.536 komut |
| Tipik gecikme sınıfı | Milisaniyeler (mekanik arama ve dönme) | Mikrosaniyeler; yük arttıkça kuyrukta bekleme artar | Mikrosaniyeler; yüksek eşzamanlılıkta daha yatay kalır |
| Uygun iş yükü | Arşiv, yedek, büyük sıralı dosyalar | Genel web, orta yoğunlukta uygulamalar | Veritabanı, yoğun eşzamanlı G/Ç, log yoğun uygulamalar |
Tabloyu okurken bir noktaya dikkat edin: tek bir isteğin tek başına gönderildiği durumda SATA SSD ile NVMe SSD arasındaki gecikme farkı sanıldığı kadar büyük değildir, çünkü sürenin büyük kısmını flash belleğin kendisi harcar. NVMe'nin asıl üstünlüğü aynı anda çok sayıda istek geldiğinde ve büyük veri aktarılırken ortaya çıkar.
Sunucuda disk performansını belirleyen metrikler
Disk performansı tek bir sayıyla anlatılamaz; IOPS, gecikme, throughput ve kuyruk derinliği birlikte okunmalıdır.
IOPS
IOPS (Input/Output Operations Per Second), diskin saniyede tamamladığı okuma ve yazma işlemi sayısıdır. Değer; blok boyutuna, okuma-yazma oranına, rastgele ya da sıralı erişime ve kuyruk derinliğine göre büyük ölçüde değişir. Ürün sayfalarındaki yüksek IOPS değerleri genellikle yüksek kuyruk derinliğinde, 4 KB rastgele okumayla elde edilir; sizin uygulamanız o kadar çok eşzamanlı istek üretmiyorsa bu sayıya hiç yaklaşmaz.
Gecikme (latency)
Gecikme, tek bir işlemin gönderilmesinden tamamlanmasına kadar geçen süredir. Ortalamaya değil yüzdelik dilimlere (percentile) bakın: p99 değeri, isteklerin yüzde 99'unun bu süreden kısa tamamlandığını gösterir. Ortalama gecikmesi düşük ama p99'u yüksek bir disk, kullanıcının ara sıra yaşadığı yavaşlamaları açıklar. iostat kılavuzuna göre r_await ve w_await değerleri, isteğin kuyrukta beklediği süreyi de içerir.
Throughput
Throughput (aktarım hızı), saniyede aktarılan veri miktarıdır (MB/sn). IOPS ile ilişkisi basittir: throughput = IOPS × blok boyutu. Örneğin 4 KB blokla 10.000 IOPS yaklaşık 40 MB/sn eder; 1 MB blokla saniyede 500 işlem ise yaklaşık 500 MB/sn'dir. Yedek alma ve büyük dosya kopyalama throughput'a, veritabanı sorguları ise IOPS ve gecikmeye bağlıdır.
Kuyruk derinliği
Kuyruk derinliği (queue depth, QD), diske aynı anda gönderilmiş ve tamamlanmayı bekleyen istek sayısıdır. Üç metrik birbirine bağlıdır: IOPS ≈ kuyruk derinliği ÷ gecikme. Örneğin her isteği 100 mikrosaniyede tamamlayan bir disk, kuyrukta tek istek varken en fazla yaklaşık 10.000 IOPS verebilir. Daha fazla IOPS için ya gecikme düşmeli ya da daha çok istek paralel işlenmelidir. NVMe'nin çoklu kuyrukları bu ikinci yolu açar.
NVMe hangi iş yüklerinde fark yaratır?
Çok sayıda küçük, rastgele ve eşzamanlı G/Ç üreten iş yüklerinde fark büyüktür; büyük ve sıralı işlerde fark daha çok throughput'ta görülür.
Veritabanları
MySQL, MariaDB ve PostgreSQL, bellekte bulamadığı verileri diskten küçük bloklar halinde rastgele okur. Aynı anda onlarca kullanıcı sorgu çalıştırdığında bu okumalar paralel hale gelir; NVMe'nin çoklu kuyrukları burada devreye girer. Veritabanları ayrıca işlem kalıcılığı için log kayıtlarını diske yazar ve senkronize eder; bu küçük yazmaların gecikmesi her işlemin tamamlanma süresine yansır. Bir not: veri setiniz RAM'e sığıyorsa okumaların çoğu bellekten yapılır ve disk tipinin etkisi azalır. Bu yüzden disk yükseltmeden önce RAM'in yeterli olup olmadığına bakın.
Çok sayıda küçük dosya
WordPress gibi PHP uygulamaları her istekte çok sayıda küçük dosyaya erişir. OPcache bu erişimin çoğunu bellekte çözer, ancak önbellek dizinleri, oturum dosyaları, e-posta kutuları (Maildir), paket kurulumları ve çok dosyalı yedekler hâlâ diske yüklenir. Bu işlemler meta veri ağırlıklıdır ve düşük gecikmeden doğrudan yararlanır.
Log yoğun uygulamalar
Uygulama logları, kuyruk sistemleri ve izleme araçları sürekli küçük yazmalar üretir. SATA'da bu yazmalar veritabanı okumalarıyla aynı kuyrukta sıraya girer; NVMe'de paralel kuyruklar sayesinde birbirini daha az bekletir.
Sanal sunucuda NVMe: paylaşılan disk ve IOPS limitleri
Sanal sunucuda NVMe disk, aynı fiziksel sunucudaki sanal makinelerle paylaşılan bir kaynaktır; "NVMe" etiketi size ayrılmış bir IOPS miktarı anlamına gelmez.
Sanal makinenin gördüğü disk, hypervisor'ün sunduğu sanal bir aygıttır. Bu yüzden sanal sunucunuzda lsblk çalıştırdığınızda diski çoğu zaman nvme0n1 olarak değil, vda veya sda olarak görürsünüz. Diskin hosttaki fiziksel yapısı (yerel NVMe dizisi mi, ağ üzerinden bağlanan depolama mı, RAID düzeyi) içeriden görülemez. Hypervisor'ler sanal disk başına IOPS ve bant genişliği sınırı koymaya izin verir; sağlayıcılar bu sınırları, bir müşterinin yoğun disk kullanımı diğerlerini yavaşlatmasın diye kullanır.
# Diskleri, dönen disk bayrağını (ROTA) ve modeli listeler
lsblk -d -o NAME,ROTA,SIZE,MODEL
Sanal makinede ROTA değeri ve model adı hosttaki fiziksel diski her zaman doğru yansıtmaz. Güvenilir yol, sağlayıcıya şu soruları sormaktır: Depolama yerel NVMe mi, ağ depolaması mı? Sanal makine başına okuma ve yazma için IOPS ve MB/sn limiti var mı? Kısa süreli patlama (burst) izni var mı? Sonra da kendi ölçümünüzle doğrulayın.
Disk performansı nasıl test edilir? (fio)
Kısa cevap: fio ile, bir test dosyası üzerinde, gerçek iş yükünüze benzeyen desenlerle ve sunucunun sakin olduğu saatlerde.
Önce uyarılar: Aşağıdaki komutları yalnızca test dosyası üzerinde çalıştırın. fio'nun --filename parametresine /dev/vda veya /dev/nvme0n1 gibi ham bir disk aygıtı verip yazma testi yaparsanız o diskteki dosya sistemi ve veriler yok olur. Testler diske yoğun yük bindirir; canlı bir sunucuda trafiğin düşük olduğu saatleri seçin ve önce yedeğinizin güncel olduğundan emin olun. Aşağıdaki örnekte her iş (job) 1 GB dosya oluşturur, 4 işli testler toplam 4 GB yer kaplar; df -h ile boş alanı kontrol edin.
# Ubuntu / Debian
sudo apt install fio sysstat
# AlmaLinux / Rocky Linux
sudo dnf install fio sysstat
mkdir -p /var/tmp/fio-test
# 1) 4 KB rastgele okuma, yüksek eşzamanlılık (IOPS)
fio --name=rastgele-okuma --directory=/var/tmp/fio-test --size=1G \
--rw=randread --bs=4k --direct=1 --ioengine=libaio \
--iodepth=32 --numjobs=4 --runtime=60 --time_based --group_reporting
# 2) 4 KB rastgele yazma (yalnızca test dosyalarına yazar)
fio --name=rastgele-yazma --directory=/var/tmp/fio-test --size=1G \
--rw=randwrite --bs=4k --direct=1 --ioengine=libaio \
--iodepth=32 --numjobs=4 --runtime=60 --time_based --group_reporting
# 3) Tek istek gecikmesi (kuyruk derinliği 1)
fio --name=gecikme --directory=/var/tmp/fio-test --size=1G \
--rw=randread --bs=4k --direct=1 --ioengine=libaio \
--iodepth=1 --numjobs=1 --runtime=60 --time_based
# 4) Sıralı okuma (throughput)
fio --name=sirali-okuma --directory=/var/tmp/fio-test --size=1G \
--rw=read --bs=1M --direct=1 --ioengine=libaio \
--iodepth=8 --numjobs=1 --runtime=60 --time_based
# Test bitince test klasörünü silin (yolu kontrol ederek)
rm -r /var/tmp/fio-test
--direct=1 işletim sisteminin sayfa önbelleğini atlar (O_DIRECT); aksi halde RAM'in hızını ölçmüş olursunuz. --iodepth kuyruk derinliğini, --numjobs paralel iş sayısını belirler. Çıktıda üç satıra bakın: IOPS=, BW= (bant genişliği) ve clat percentiles altındaki 99.00th değeri. Tek bir ölçüm yerine testleri farklı saatlerde birkaç kez tekrarlayın; sanal sunucuda sonuçlar komşuların yüküne göre değişebilir.
Sentetik testin yanında, uygulamanız yoğunken gerçek disk davranışını da izleyin:
# 5 saniye arayla genişletilmiş disk istatistikleri
iostat -x 5
r_await ve w_await milisaniye cinsinden ortalama bekleme süresini, aqu-sz ortalama kuyruk uzunluğunu gösterir. %util değerine tek başına güvenmeyin: iostat kılavuzu, istekleri paralel işleyen RAID dizileri ve modern SSD'lerde bu değerin performans sınırını yansıtmadığını belirtir. top çıktısındaki wa (iowait) değeri de işlemcinin disk beklerken boşta geçirdiği süreyi gösterir. Yüksek iowait'in disk dışındaki nedenlerle nasıl ayrıştırılacağını sunucu yavaşladığında darboğaz tespiti yazımızda adım adım anlattık.
NVMe her sorunu çözer mi?
Hayır. NVMe yalnızca darboğaz disk olduğunda fark yaratır. Aşağıdaki durumlarda disk yükseltmesi sorunu çözmez:
- İşlemci darboğazı: PHP süreçleri veya sıkıştırma işleri işlemciyi sürekli dolduruyorsa ve iowait düşükse sorun disk değildir. Yük değerlerini yorumlamak için load average rehberimize bakabilirsiniz.
- RAM yetersizliği: Sunucu swap kullanıyorsa hızlı disk swap'i biraz hafifletir ama çözüm RAM'dir.
- Optimize edilmemiş sorgular: İndeksi olmayan bir sorgu her seferinde tabloyu baştan sona okur; bunu en hızlı disk de kurtaramaz.
- Ağ gecikmesi: Kullanıcılarınız sunucuya uzaksa sayfa yavaşlığının kaynağı ağdır.
Doğru sıra şudur: önce ölçün, darboğazı bulun, sonra yükseltin. Bulutzone'un Türkiye VDS paketleri NVMe disk, Intel Xeon Platinum 8260 işlemci ve DDR4 ECC RAM ile İstanbul'daki Mars veri merkezinde çalışır; veritabanı ağırlıklı projelerde TR Cloud paketlerindeki RAM ve disk oranı birlikte değerlendirilmelidir. NVMe diskli VDS paketlerini karşılaştırabilirsiniz.
Sık sorulan sorular
NVMe, SSD'den daha mı hızlı?
NVMe bir SSD türünün bağlantı ve protokol biçimidir; doğru karşılaştırma NVMe SSD ile SATA SSD arasındadır. NVMe SSD, özellikle eşzamanlı isteklerde ve büyük veri aktarımında SATA SSD'den belirgin biçimde hızlıdır. Tek ve küçük isteklerde fark daha küçüktür.
Sanal sunucumdaki diskin NVMe olduğunu nasıl anlarım?
İçeriden kesin olarak anlaşılamaz, çünkü sanal makine hypervisor'ün sunduğu sanal diski görür. Sağlayıcının belirttiği depolama tipine bakın ve fio ile gecikme ile IOPS ölçün. QD1 rastgele okuma gecikmesi milisaniyeler düzeyindeyse altta HDD ya da yoğun bir paylaşım olduğundan şüphelenebilirsiniz.
fio testi sunucuya zarar verir mi?
Test dosyası üzerinde çalıştırıldığında verilere zarar vermez; yalnızca test süresince diske yük bindirir. Tehlike, --filename ile ham bir disk aygıtına yazma testi yapmaktır: bu, o diskteki verileri siler. Testten sonra test dosyalarını silmeyi unutmayın.