
V tem članku bomo raziskali nekatere podrobnosti pod-sistema vhod/izhod in njihov vpliv na zmogljivost.
Pred dvema tednoma sem naletel na vprašanje, zakaj je NVMe na enem strežniku počasnejši kot SATA na drugem. Pregledal sem specifikacije strežnikov in ugotovil, da je bil to zanko: NVMe je bil iz potrošniškega segmenta, medtem ko je bil SSD iz strežniškega.
Očitno je, da je neprimerno primerjati izdelke iz različnih segmentov v različnih okoljih, vendar to ni izčrpen tehnični odgovor. Raziskali bomo osnove, opravili poskuse in podali odgovor na postavljeno vprašanje.
Kaj je fsync in kje se uporablja
Za pospeševanje dela z napravami se podatki predpomnijo, kar pomeni, da se shranijo v energijsko odvisno pomnilnik, dokler ne pride primeren trenutek za shranjevanje vsebine predpomnilnika na napravo. Kriteriji za 'primeren trenutek' so določeni z operacijskim sistemom in značilnostmi naprave. V primeru izgube napajanja bodo vsi podatki v predpomnilniku izgubljeni.
Obstajajo naloge, pri katerih je treba biti prepričan, da so spremembe datoteke zapisane na napravo, ne pa v vmesnem predpomnilniku. To zaupanje lahko pridobimo z uporabo sistemskega klica fsync, ki prisili zapis iz predpomnilnika na napravo.
Prikazali bomo vpliv predpomnilnikov s preprostim primerom v obliki kratkega programa v jeziku C.
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(void) {
/* Открываем файл answer.txt на запись, если его нет -- создаём */
int fd = open("answer.txt", O_WRONLY | O_CREAT);
/* Записываем первый набор данных */
write(fd, "Answer to the Ultimate Question of Life, The Universe, and Everything: ", 71);
/* Делаем вид, что проводим вычисления в течение 10 секунд */
sleep(10);
/* Записываем результат вычислений */
write(fd, "42n", 3);
return 0;
}Komentarji dobro razložijo zaporedje dejanj v programu. Besedilo 'odgovor na glavno vprašanje življenja, vesolja in vsega takega' bo predpomnjeno z operacijskim sistemom, in če med 'izračunavanjem' ponastavite strežnik s pritiskom na gumb Reset, bo datoteka prazna. V našem primeru izguba besedila ni težava, zato fsync ni potreben. Baze podatkov tega optimizma ne delijo.
Baze podatkov so zapleteni programi, ki hkrati obdelujejo veliko datotek, zato morajo biti prepričani, da se podatki, ki jih zapisujejo, shranjujejo na pomnilniku, saj to vpliva na doslednost podatkov znotraj baze podatkov. Baze podatkov so zasnovane tako, da beležijo vse zaključene transakcije in so pripravljene na izklop napajanja kadar koli. Takšno ravnanje zahteva nenehno uporabo fsync v velikih količinah.
Na kaj vpliva pogosta uporaba fsync
Pri običajnem vhodno-izhodnem delu operacijski sistem poskuša optimizirati komunikacijo z diski, saj so zunanji pomnilniki najpočasnejši v hierarhiji pomnilnika. Zato operacijski sistem poskuša ob enem dostopu do pomnilnika zapisati čim več podatkov.
Prikazali bomo vpliv uporabe fsync na konkretnem primeru. Naši preizkušanci so naslednji trdi diski:
- Intel® DC SSD S4500 480 GB, povezan preko SATA 3.2, 6 Gb/s;
- Samsung 970 EVO Plus 500GB, povezan preko PCIe 3.0 x4, ~31 Gb/s.
Testi bodo izvedeni na Intel® Xeon® W-2255 pod operacijskim sistemom Ubuntu 20.04. Za testiranje diskov se uporablja sysbench 1.0.18. Na diskih je ustvarjen en del, formatiran kot ext4. Priprava na test vključuje ustvarjanje datotek velikosti 100 GB:
sysbench --test=fileio --file-total-size=100G prepareZagon testov:
# Без fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=0 run
# С fsync после каждой записи
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=1 runRezultati testov so predstavljeni v tabeli.
Test
Intel® S4500
Samsung 970 EVO+
Branje brez fsync, MiB/s
5734.89
9028.86
Pisanje brez fsync, MiB/s
3823.26
6019.24
Branje s fsync, MiB/s
37.76
3.27
Pisanje s fsync, MiB/s
25.17
2.18
Ni težko opaziti, da NVMe iz segmenta za stranke prepričljivo vodi, ko operacijski sistem sam odloča, kako delati z diski, in izgublja, ko se uporablja fsync. Od tod se pojavljata dve vprašanji:
- Zakaj v testu brez fsync hitrost branja presega fizično prepustnost kanala?
- Zakaj SSD-ji iz strežniškega segmenta bolje obravnavajo večje število zahtevkov fsync?
Odgovor na prvo vprašanje je preprost: sysbench generira datoteke, napolnjene z ničlami. Tako je bil test izveden nad 100 gigabajti ničel. Ker so podatki zelo enakomerni in predvidljivi, prihajajo v igro različne optimizacije operacijskega sistema, ki znatno pospešujejo izvajanje.
Če dvomite v vse rezultate sysbench, lahko uporabite fio.
# Без fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=0 --filename=/dev/sdb
# С fsync после каждой записи
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=1 --filename=/dev/sdbTest
Intel® S4500
Samsung 970 EVO+
Branje brez fsync, MiB/s
45.5
178
Pisanje brez fsync, MiB/s
30.4
119
Branje s fsync, MiB/s
32.6
20.9
Pisanje s fsync, MiB/s
21.7
13.9
Trendan o upadu performansi NVMe pri korišćenju fsync se dobro primećuje. Možemo preći na odgovor na drugo pitanje.
Optimizacija ili obmana
Ranije smo govorili da se podaci čuvaju u baferu, ali nismo precizirali u kojem tačno, jer to nije bilo bitno. I sada nećemo ulaziti u detalje operativnih sistema i istaknućemo dva opšta tipa bafera:
- softverski;
- hardverski.
Pod softverskim baferom podrazumevaju se baferi u operativnom sistemu, a pod hardverskim – energijski zavisna memorija kontrolera diska. Sistem poziv fsync šalje uređaju komandu da upiše podatke iz svog bafera u glavno skladište, ali nikako ne može kontrolisati ispravnost izvršenja tog naloga.
Pošto SSD pokazuje bolje rezultate, možemo napraviti dva pretpostavka:
- disk je projektovan za opterećenja ovog tipa;
- disk „obmanjuje“ i ignoriše komandu.
Nepravedno ponašanje uređaja možete primetiti ako sprovedete test sa nestankom struje. To možete proveriti skriptom , koji je 2005. godine.
Ovaj skript zahteva dve fizičke mašine – „server“ i „klijent“. Klijent zapisuje mali obim podataka na testirani disk, poziva fsync i šalje serveru informacije o onome što je zapisano.
# Запускается на сервере
./diskchecker.pl -l [port]
# Запускается на клиенте
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>Nakon pokretanja skripta, potrebno je isključiti „klijenta“ i ne vraćati napajanje tokom nekoliko minuta. Važno je isključiti testirani uređaj iz napajanja, a ne samo izvršiti težak isključivanje. Nakon određenog vremena server možete ponovo povezati i pokrenuti operativni sistem. Nakon pokretanja operativnog sistema potrebno je ponovo pokrenuti diskchecker.pl, ali sa argumentom verify.
.\/diskchecker.pl -s verifyNa kraju provere videćete broj grešaka. Ako ih je 0, to znači da je disk prošao test. Da biste isključili srećne okolnosti za disk, možete ponoviti eksperiment nekoliko puta.
Naš S4500 nije pokazao greške prilikom gubitka napajanja, što znači da možemo tvrditi da je spreman za opterećenja sa velikim brojem poziva fsync.
Zaključek
Pri izbiri diskov ali celotnih pripravljenih konfiguracij je potrebno upoštevati specifičnost nalog, ki jih je treba rešiti. Na prvi pogled se zdi očitno, da je NVMe, torej SSD s PCIe vmesnikom, hitrejši od 'klasičnega' SATA SSD. Vendar pa smo danes ugotovili, da to morda ni tako v specifičnih pogojih in pri določenih nalogah.
Kako testirate komponente strežnikov pri najemu pri IaaS ponudniku?
Veselimo se vaših komentarjev.
Izvor: habr.com
