Погоршање перформанси Firebird-а: тестови, митови и истина
Alexey Kovyazin, 16. мај 2014.
Можете преузети овај чланак у PDF формату.
Недавно смо у IBSurgeon спровели серију тестова перформанси са Firebird 2.5.2. Firebird 2.5.2 је најпопуларнија верзија Firebird базе података, и њени корисници често имају питања у вези са перформансама Firebird-а.
Једна од најважнијих брига у вези са перформансама базе података је њена деградација. Многи корисници тврде да њихове апликације са базама података имају проблема са перформансама када достигну одређену граничну вредност: то може бити 3Gb, 5Gb, величина RAM меморије, 20Gb, итд. Најпопуларнија тврдња је „величина базе је већа од величине RAM меморије“: када величина Firebird базе достигне величину RAM меморије, наводно постаје веома спора… Да ли је то истина?
Одлучили смо да спроведемо серију тестова да проверимо да ли постоји таква деградација перформанси повезана са растом базе података. Одлучили смо да симулирамо животни век раста базе података са истим оптерећењем на истом хардверу, и за то смо покренули 11 тестова са базама података величине између 9Gb и 30Gb:

Слика 1. Величине база података за тестове
Тестни хардвер и Firebird конфигурација
Тестни хардвер је имао следеће кључне карактеристике:
CPU AMD-FX8350, RAM 16GB, SATA софтверски RAID1 2x4Tb Seagate дискови, оперативни систем Windows Server 2008R2 (2008R2 је 64-битни).
Као што видите, то је јефтина хардверска конфигурација; може се купити за мање од USD 1000 у овом тренутку (мај 2014), и може се сматрати типичном нижом конфигурацијом - можда, осим великих SATA дискова, али према извештају произвођача, брзина 1Tb и 4Tb SATA дискова је готово иста.
Пошто је циљ теста био да се измере промене перформанси типичног система, користили смо Firebird (64-битни) са SuperServer архитектуром, не Classic, да у потпуности симулирамо ситуацију у малој компанији - они користе оно што је првобитно инсталирано годинама. Као што знате, SuperServer користи само 1 CPU језгро, па би вероватно Classic или SuperClassic (који могу користити сва CPU језгра) могли показати боље резултате у погледу перформанси, али наш циљ није било подешавање перформанси.
Међутим, подесили смо firebird.conf са очигледним изменама које препоручујемо за све Firebird SuperServer инсталације: повећани page buffers на 10000 и temp простор за сортирање.
Све тестне базе података су креиране са величином странице 16384, само ради конзистентности.
Тестирање
Учитавање
Сваки тест је садржао 2 корака: учитавање и симулацију 20 терминала који обављају insert, update и delete операције.
Корак учитавања обавља апликација за учитавање (load.exe), која уноси податке у неколико табела. Као што можете видети на слици 2, подаци се учитавају различитом брзином; креће се од ~35Mb/sec до 1mb/sec.

Слика 2. Брзина учитавања базе података (црвени графикон)
Ово је повезано са дизајном апликације за учитавање, не са Firebird-ом: учитавач брзо уноси 70% базе података, а затим полако попуњава остатак података, и то се понавља са базама података свих величина. За нас је важно да учитавач обавља исте операције, тако да можемо користити његову просечну брзину за мерење брзине учитавања.
Важно је напоменути да учитавач уноси само податке, а индекси се креирају након што је учитавање завршено.
Погледајмо табелу са резултатима за корак учитавања за 11 база података између 9 и 30Gb:
| # | величина базе, gb | време учитавања, sec | SATA брзина учитавања, Mb/sec |
|---|---|---|---|
| 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 |
Слика 3. Време и брзина учитавања
Или, боље је приказати на графикону на слици 4:

Слика 4. Резултати теста: брзина учитавања.
Као што видите, графикон је прилично стабилан, а просечна брзина процеса учитавања варира око 3.3-3.4Mb/sec. Такође нема знакова смањења брзине учитавања када величина базе података постане већа од величине RAM меморије (након базе #5, са величином 17.3Gb).
Перформансе
Дакле, време учитавања изгледа прилично обећавајуће, а шта је са стварним резултатима перформанси?
Пре него што пређемо на резултате перформанси, хајде да брзо прегледамо процес симулације.
Симулација покреће 20 нити, и свака од њих насумично извршава неколико пословних операција: креирање нове поруџбине, обрада плаћања, бројање производа на залихама, обрада испоруке поруџбине, итд. (за детаље можете погледати SQL текстове стварних ускладиштених процедура). Као што видите, ово је уобичајени скуп пословних операција апстрактне апликације за инвентар/продају.
Тестна апликација мери број пословних операција у секунди и извештава просечан број. Наравно, овај број је вештачки параметар, али је довољно добар за поређење.
Резултати теста перформанси:
| # | величина базе, gb | перформансе на SATA |
|---|---|---|
| 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 |
Слика 5. Табела са резултатима теста перформанси.
Или, боље је погледати резултате у графичком приказу:

Слика 6. Графикон резултата перформанси
Као што видите, постоји спора деградација перформанси са растом величине базе података - што је база већа, спорије ће радити (на истом хардверу). Такође нема великог пада перформанси када величина базе података постане већа од RAM меморије. Раст базе података са 9Gb на 30Gb доводи до приближно 20% губитка перформанси.
30Gb Firebird базе података су сада свуда око нас, и оне расту и расту током времена. Међутим, шта ће се десити са перформансама базе података када буде још већа? Мислимо - ВЕЋА! Шта ће се десити са перформансама када база података постане ЗАИСТА ВЕЛИКА?
Mr.Big
Да бисмо одговорили на ово питање, одлучили смо да погледамо сам крај тестне табеле и спроведемо тест са 1.7Tb (1813 Gb) базом података, на истом хардверу, са истим подешавањима.
Учитавање
Дакле, креирали смо такву базу података:

Слика 7. Величина базе података - сада са 1813 Gb базом
Учитавање је трајало 566448 секунди - 157 сати, 6.55 дана. То је дуго време, али просечна брзина учитавања је била… 3.28Mb/sec!
| # | величина базе, gb | време учитавања, sec | SATA брзина учитавања, Mb/sec |
|---|---|---|---|
| 12 | 1813,969025 | 566448 | 3,279214122 |
Слика 8. Време и брзина учитавања за 1.7Tb Firebird базу података
На графикону то изгледа веома добро: последња тачка (#12). Дакле, Firebird показује веома добре резултате својих алгоритама за уметање.

Слика 9. Брзина учитавања - тачка #12 је за 1.7Tb Firebird базу података
Перформансе Mr.Big-а
Затим смо покренули исти тест перформанси - ред 12 је за 1.7Tb базу података.
| # | величина базе, gb | перформансе на SATA |
|---|---|---|
| 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 |
Слика 10. Резултати теста перформанси - ред 12 је за 1.7Tb базу података
I na grafikonu:

Slika 11. Performanse, tačka #12 je za bazu od 1.7Tb
Rezultat potvrđuje da postoji sporo i stabilno opadanje performansi u Firebird-u - dok je veličina baze porasla 60 puta (sa 30Gb na 1813Gb), gubitak performansi je bio 2.4 puta (sa 407 na 169 poena).
Nije česta situacija kada baza (na istom jeftinijem hardveru) poraste sa 30Gb na 1.7tb, ali Firebird će raditi čak i u ovoj situaciji.
Velika baza u detaljima
Da bismo bolje razumeli bazu od 1.7Tb, prikupili smo statistiku baze za Mr.Big bazu i analizirali je u IBAnalyst:

Slika 12. Tabele baze od 1.7Tb u IBAnalyst
Kao što možete videti, postoje 2 velike tabele - ORDER_LINE (~600 Gb) sa 6.3 milijardi zapisa i STOCK (~GB680) sa 2.1 milijarde zapisa.
I, za ove tabele postoje 2 indeksa sa dubinom = 4 - to znači da svaki zahtev čini 4 čitanja stranica indeksa pre stvarnog čitanja podataka. ORDER_LINE_PK indeks ima veličinu od 50Gb.

Slika 13. Indeksi Firebird baze od 1.7Tb
Uprkos ogromnom broju zapisa, statistika baze izgleda dobro, tako da nije iznenađujuće što Firebird pokazuje prilično dobre rezultate čak i za veliku bazu na jeftinijem hardveru.
Testiranje Firebird-a sa SSD diskom
Nakon završetka serije Firebird testova na jeftinijem hardveru, odlučili smo da proverimo kakvi će biti rezultati na drugom kraju tehnologije skladištenja podataka i instalirali smo SSD disk na isti server.
Instalirali smo SSD disk Plextor PX-256M M5 Pro i pokrenuli istu seriju testova (osim baze od 1.7Tb), sa istim podešavanjima. Rezultati su dodati na grafikone sa SATA uređajima, pogledajte ih ispod.
Učitavanje
Kao što možete videti, vreme učitavanja na SSD-u je isto kao na SATA-u. Ovo je očekivani rezultat: brzina sekvencijalnih operacija upisa je skoro ista na SATA i SSD diskovima.

Slika 14. Učitavanje na SSD i SATA
Performanse
Pogledajte rezultate performansi:

Slika 15. Performanse na SSD i SATA
Kao što možete videti, performanse sa nasumičnim IO operacijama pokazuju ~8x bolje rezultate za SSD disk. Znali smo iz našeg iskustva sa bazama kupaca da je SSD 30-50% brži sa aplikacijama u stvarnom svetu, ali povećanje od 8x je veoma visoko.
Međutim, ovaj test je veštački i posebno dizajniran da simulira operacije sa visokim opterećenjem OLTP-a, sa mnogo ažuriranja/brisanja, ali bez velikih preuzimanja. Uobičajena aplikacija za baze podataka ne radi u ovom režimu sve vreme. To objašnjava zašto SSD pokazuje tako visoke rezultate u ovom konkretnom slučaju.
Sažetak
Dakle, šta smo naučili iz ovih testova?
Pre svega - performanse Firebird-a nemaju velika opadanja povezana sa nekim ograničenjem veličine. Na istom hardveru performanse će se polako smanjivati sa rastom veličine baze. Takvo opadanje performansi može se kompenzovati podešavanjem konfiguracije Firebird-a ili pametnom nadogradnjom hardvera.
Dobro je mesto da pomenemo da IBSurgeon nudi uslugu optimizacije performansi Firebird-a - koristeći eksperimentalne podatke koje smo prikupili iz ovakvih testova, možemo značajno povećati performanse Firebird i InterBase baza podataka.
Zatim, znali smo da će čak i veoma velike Firebird baze (1.7 terabajta) raditi na jeftinijem hardveru sa značajnim, ali prihvatljivim gubitkom performansi.
I treće, SSD je zaista dobar za OLTP aplikacije. Verovatno je to najjeftiniji način da se nadograde performanse baze u ovom trenutku. Naravno, korišćenje SSD-a neće rešiti probleme sa lošim planovima upita i neefikasnim indeksima, ali može podići performanse uopšte.
Nastaviće se: Više detalja o Firebird bazi od 1.7 terabajta.