Firebird performans düşüşü: testler, mitler ve gerçekler
Alexey Kovyazin, 16 Mayıs 2014
Bu makaleyi PDF formatında indirebilirsiniz.
Son zamanlarda IBSurgeon olarak Firebird 2.5.2 ile bir dizi performans testi yaptık. Firebird 2.5.2, Firebird veritabanının en popüler sürümüdür ve kullanıcılarının sıklıkla Firebird performansıyla ilgili soruları vardır.
Veritabanı performansıyla ilgili en önemli endişelerden biri performans düşüşüdür. Birçok kullanıcı, veritabanı uygulamalarının belirli bir eşik değerine ulaştığında performans sorunları yaşadığını iddia eder: bu 3Gb, 5Gb, RAM boyutu, 20Gb vb. olabilir. En yaygın iddia “veritabanı boyutunun RAM boyutundan büyük olmasıdır”: Firebird veritabanı boyutu RAM boyutuna ulaştığında, çok yavaşladığı bildirilir… Bu doğru mu?
Veritabanı büyümesiyle ilgili böyle bir performans düşüşü olup olmadığını kontrol etmek için bir dizi test yapmaya karar verdik. Aynı donanımda aynı yükle veritabanının ömür boyu büyümesini simüle etmeye karar verdik ve bunun için 9Gb ile 30Gb arasında değişen boyutlardaki veritabanlarıyla 11 test çalıştırdık:

Şekil 1. Testler için veritabanı boyutları
Test donanımı ve Firebird yapılandırması
Test donanımı şu temel özelliklere sahipti:
CPU AMD-FX8350, RAM 16GB, SATA yazılım RAID1 2x4Tb Seagate diskler, İşletim Sistemi Windows Server 2008R2 (2008R2 64 bittir).
Gördüğünüz gibi, bu düşük seviyeli bir donanım yapılandırmasıdır; şu anda (Mayıs 2014) 1000 USD’den daha az bir fiyata satın alınabilir ve tipik düşük seviyeli bir yapılandırma olarak kabul edilebilir - belki büyük SATA diskler hariç, ancak üretici raporuna göre, 1Tb ve 4Tb SATA disklerin hızı neredeyse aynıdır.
Testin amacı tipik bir sistemin performans değişikliklerini ölçmek olduğundan, küçük bir şirketteki durumu tamamen simüle etmek için SuperServer mimarili Firebird (64 bit) kullandık, Classic değil - yıllardır orijinal olarak kurulanı kullanırlar. Bildiğiniz gibi, SuperServer yalnızca 1 CPU çekirdeği kullanır, bu nedenle muhtemelen Classic veya SuperClassic (tüm CPU çekirdeklerini kullanabilen) performans açısından daha iyi sonuçlar gösterebilir, ancak amacımız performans ayarı değildi.
Ancak, tüm Firebird SuperServer kurulumlarına önerdiğimiz belirgin değişikliklerle firebird.conf dosyasını ayarladık: sayfa tamponlarını 10000’e ve sıralama için geçici alanı artırdık.
Tüm test veritabanları, tutarlılık için 16384 sayfa boyutuyla oluşturuldu.
Test
Yükleme
Her test 2 adım içeriyordu: yükleme ve ekleme, güncelleme ve silme işlemleri yapan 20 terminalin simülasyonu.
Yükleme adımı, birkaç tabloya veri ekleyen yükleyici uygulaması (load.exe) tarafından gerçekleştirilir. Şekil 2’de görebileceğiniz gibi, veriler farklı hızlarla yüklenir; ~35Mb/sn’den 1mb/sn’ye kadar değişir.

Şekil 2. Veritabanı yükleme hızı (kırmızı grafik)
Bu, Firebird ile değil, yükleyici uygulamasının tasarımıyla ilgilidir: yükleyici veritabanının %70’ini hızlıca ekler ve ardından kalan verileri yavaşça doldurur ve bu tüm boyutlardaki veritabanlarıyla tekrarlanır. Yükleyicinin aynı işlemleri yapması bizim için önemlidir, bu nedenle yükleme hızını ölçmek için ortalama hızını kullanabiliriz.
Yükleyicinin yalnızca veri eklediğini ve dizinlerin yükleme tamamlandıktan sonra oluşturulduğunu söylemek önemlidir.
9 ile 30Gb arasındaki 11 veritabanı için yükleme adımının sonuçlarını içeren tabloya bakalım:
| # | veritabanı boyutu, gb | yükleme süresi, sn | SATA yükleme hızı, Mb/sn |
|---|---|---|---|
| 1 | 9,04 | 2535 | 3,65166075 |
| 2 | 10,80 | 3197 | 3,45924304 |
| 3 | 13,00 | 4057 | 3,281242297 |
| 4 | 15,50 | 4698 | 3,378458919 |
| 5 | 17,30 | 5455 | 3,24751604 |
| 6 | 19,90 | 6037 | 3,375451383 |
| 7 | 21,60 | 6473 | 3,417024564 |
| 8 | 24,20 | 7539 | 3,287014193 |
| 9 | 26,00 | 7779 | 3,422547885 |
| 10 | 28,60 | 8851 | 3,308823862 |
| 11 | 30,30 | 9266 | 3,348499892 |
Şekil 3. Yükleme süresi ve hızı
Veya, şekil 4’teki grafikte göstermek daha iyidir:

Şekil 4. Test sonuçları: yükleme hızı.
Gördüğünüz gibi, oldukça istikrarlı bir grafik var ve yükleme işlemi için ortalama hız 3.3-3.4Mb/sn civarında değişiyor. Veritabanı boyutu RAM boyutundan büyük olduğunda (17.3Gb boyutundaki 5. veritabanından sonra) yükleme hızında azalma belirtisi de yok.
Performans
Yükleme süreleri oldukça umut verici görünüyor, peki gerçek performans sonuçları ne durumda?
Performans sonuçlarına geçmeden önce, simülasyon sürecini hızlıca gözden geçirelim.
Simülasyon 20 iş parçacığı çalıştırır ve her biri rastgele birkaç iş operasyonu gerçekleştirir: yeni sipariş oluşturma, ödeme işleme, stoktaki ürünleri sayma, sipariş teslimatını işleme vb. (ayrıntılar için gerçek saklı prosedürlerin SQL metinlerine bakabilirsiniz). Gördüğünüz gibi, bu soyut bir envanter/satış uygulamasının olağan iş operasyonları setidir.
Test uygulaması saniyedeki iş operasyonu sayısını ölçer ve ortalama bir sayı bildirir. Elbette, bu sayı yapay bir parametredir, ancak karşılaştırma için yeterince iyidir.
Performans testi sonuçları:
| # | veritabanı boyutu, gb | SATA’da performans |
|---|---|---|
| 1 | 9,04 | 494,73 |
| 2 | 10,80 | 491,94 |
| 3 | 13,00 | 480,36 |
| 4 | 15,50 | 469,11 |
| 5 | 17,30 | 446,42 |
| 6 | 19,90 | 431,61 |
| 7 | 21,60 | 426,85 |
| 8 | 24,20 | 424,5 |
| 9 | 26,00 | 414,04 |
| 10 | 28,60 | 409,14 |
| 11 | 30,30 | 407,97 |
Şekil 5. Performans testi sonuçlarını içeren tablo.
Veya, sonuçları grafiksel gösterimde görüntülemek daha iyidir:

Şekil 6. Performans sonuçları grafiği
Gördüğünüz gibi, veritabanı boyutu büyüdükçe yavaş bir performans düşüşü var - veritabanı ne kadar büyükse, (aynı donanımda) o kadar yavaş çalışacaktır. Veritabanı boyutu RAM’den büyük olduğunda da büyük bir performans düşüşü yoktur. Veritabanının 9Gb’den 30Gb’ye büyümesi yaklaşık %20 performans kaybına yol açar.
30Gb Firebird veritabanları artık her yerde ve zamanla büyümeye devam ediyorlar. Ancak, veritabanı performansı daha da büyüdüğünde ne olacak? Yani - DAHA BÜYÜK! Veritabanı GERÇEKTEN BÜYÜK olduğunda performansa ne olacak?
Bay Büyük
Bu soruyu yanıtlamak için test tablosunun en sonuna bakmaya ve aynı donanımda, aynı ayarlarla 1.7Tb (1813 Gb) veritabanıyla test yapmaya karar verdik.
Yükleme
Böylece, böyle bir veritabanı oluşturduk:

Şekil 7. Veritabanı boyutu - şimdi 1813 Gb veritabanıyla
Yükleme 566448 saniye sürdü - 157 saat, 6.55 gün. Bu uzun bir süre, ancak ortalama yükleme hızı… 3.28Mb/sn idi!
| # | veritabanı boyutu, gb | yükleme süresi, sn | SATA yükleme hızı, Mb/sn |
|---|---|---|---|
| 12 | 1813,969025 | 566448 | 3,279214122 |
Şekil 8. 1.7Tb Firebird veritabanı için yükleme süresi ve hızı
Grafikte çok iyi görünüyor: son nokta (#12). Yani, Firebird ekleme algoritmalarında çok iyi sonuçlar gösteriyor.

Şekil 9. Yükleme hızı - 12. nokta 1.7Tb Firebird veritabanı içindir
Bay Büyük’ün performansı
Ardından aynı performans testini çalıştırdık - 12. satır 1.7Tb veritabanı içindir.
| # | veritabanı boyutu, gb | SATA’da performans |
|---|---|---|
| 1 | 9,04 | 494,73 |
| 2 | 10,80 | 491,94 |
| 3 | 13,00 | 480,36 |
| 4 | 15,50 | 469,11 |
| 5 | 17,30 | 446,42 |
| 6 | 19,90 | 431,61 |
| 7 | 21,60 | 426,85 |
| 8 | 24,20 | 424,5 |
| 9 | 26,00 | 414,04 |
| 10 | 28,60 | 409,14 |
| 11 | 30,30 | 407,97 |
| 12 | 1813,969025 | 169,33 |
Şekil 10. Performans testi sonuçları - 12. satır 1.7Tb veritabanı içindir
Ve grafikte:

Şekil 11. Performans, 12. nokta 1.7Tb veritabanı içindir
Sonuç, Firebird’de yavaş ve istikrarlı bir performans düşüşü olduğunu doğruluyor - veritabanı boyutu 60 kat büyürken (30Gb’den 1813Gb’ye), performans kaybı 2.4 kat oldu (407’den 169 puana).
Veritabanının (aynı düşük seviyeli donanımda) 30Gb’den 1.7Tb’ye büyümesi sık karşılaşılan bir durum değildir, ancak Firebird bu durumda bile çalışacaktır.
Büyük veritabanı ayrıntılı olarak
1.7Tb veritabanını daha iyi anlamak için Bay Büyük veritabanı için veritabanı istatistikleri topladık ve IBAnalyst içinde analiz ettik:

Şekil 12. IBAnalyst’te 1.7Tb veritabanının tabloları
Gördüğünüz gibi, 2 büyük tablo var - ORDER_LINE (~600 Gb) 6.3 milyar kayıtla ve STOCK (~GB680) 2.1 milyar kayıtla.
Ve bu tablolar için derinliği = 4 olan 2 dizin var - bu, her isteğin gerçek veri okumasından önce dizin sayfalarından 4 okuma yaptığı anlamına gelir. ORDER_LINE_PK dizini 50Gb boyutundadır.

Şekil 13. Firebird 1.7Tb veritabanının dizinleri
Devasa kayıt sayısına rağmen, veritabanı istatistikleri iyi görünüyor, bu nedenle Firebird’ün düşük seviyeli donanımda büyük veritabanları için bile oldukça iyi sonuçlar göstermesi şaşırtıcı değil.
Firebird’ü SSD sürücüyle test etme
Düşük seviyeli donanımda Firebird testleri serisini tamamladıktan sonra, veri depolama teknolojisinin diğer ucunda sonuçların ne olacağını kontrol etmeye karar verdik ve aynı sunucuya SSD sürücü kurduk.
Plextor PX-256M M5 Pro SSD sürücüsünü kurduk ve aynı ayarlarla aynı test serisini (1.7Tb veritabanı hariç) çalıştırdık. Sonuçlar SATA cihazlarıyla grafiklere eklendi, aşağıda görebilirsiniz.
Yükleme
Gördüğünüz gibi, SSD’de yükleme süresi SATA ile aynıdır. Bu beklenen bir sonuçtur: sıralı yazma işlemlerinin hızı SATA ve SSD sürücülerde neredeyse aynıdır.

Şekil 14. SSD ve SATA’da yükleme
Performans
Performans sonuçlarına bakın:

Şekil 15. SSD ve SATA’da performans
Gördüğünüz gibi, rastgele IO işlemleriyle performans SSD sürücü için ~8 kat daha iyi sonuçlar gösteriyor. Müşterilerimizin veritabanlarıyla ilgili deneyimlerimizden SSD’nin gerçek dünya uygulamalarında %30-50 daha hızlı olduğunu biliyorduk, ancak 8 kat artış çok yüksek.
Ancak, bu test yapaydır ve özellikle büyük getirmeler olmadan birçok güncelleme/silme işlemi içeren yüksek yüklü OLTP işlemlerini simüle etmek için tasarlanmıştır. Olağan veritabanı uygulaması her zaman bu modda çalışmaz. Bu, SSD’nin bu özel durumda neden bu kadar yüksek sonuçlar gösterdiğini açıklar.
Özet
Peki, bu testlerden ne öğrendik?
Her şeyden önce - Firebird’ün performansı, bazı boyut kısıtlamalarıyla ilgili büyük düşüşlere sahip değildir. Aynı donanımda performans, veritabanı boyutunun büyümesiyle yavaşça azalacaktır. Bu performans düşüşü, Firebird yapılandırma ayarı veya akıllı donanım yükseltmesiyle telafi edilebilir.
IBSurgeon’un Firebird performans optimizasyon hizmeti sunduğunu belirtmek iyi bir yer - bu gibi testlerden topladığımız deneysel verileri kullanarak Firebird ve InterBase veritabanlarının performansını önemli ölçüde artırabiliriz.
Ayrıca, çok büyük Firebird veritabanlarının (1.7 terabayt) düşük seviyeli donanımda önemli ancak kabul edilebilir bir performans kaybıyla çalışacağını öğrendik.
Ve üçüncü olarak, SSD OLTP uygulamaları için gerçekten iyidir. Muhtemelen şu anda veritabanı performansını yükseltmenin en ucuz yoludur. Elbette, SSD kullanmak kötü sorgu planları ve verimsiz dizinlerle ilgili sorunları çözmez, ancak genel olarak performansı artırabilir.
Devam edecek: 1.7 Terabaytlık Firebird veritabanı hakkında daha fazla ayrıntı.