Zergatik da nire NVMe SSD bat baino motelagoa?

Zergatik da nire NVMe SSD bat baino motelagoa?
Artikulu honetan, I/O azpisistemaren ñabardura batzuk eta errendimenduan duten eragina aztertuko dugu.

Duela aste pare bat galdera bat egin nuen zergatik NVMe zerbitzari batean SATA bestean baino motelagoa den. Zerbitzarien ezaugarriak aztertu eta galdera trikimailu bat zela konturatu nintzen: NVMe erabiltzaile-segmentukoa zen eta SSD zerbitzari-segmentukoa.

Jakina, ez da zuzena segmentu ezberdinetako produktuak ingurune desberdinetan alderatzea, baina hau ez da erantzun tekniko zehatza. Oinarriak aztertu, esperimentuak egingo ditugu eta egindako galderari erantzuna emango diogu.

Zer da fsync eta non erabiltzen den

Unitateekin lana bizkortzeko, datuak bufferean gordetzen dira, hau da, memoria lurrunkor batean gordetzen dira, bufferraren edukia diskoan gordetzeko aukera egoki bat aurkezten den arte. Aukera-irizpideak sistema eragilearen eta unitatearen ezaugarrien arabera zehazten dira. Elektrizitatearen hutsunea gertatuz gero, buffer-eko datu guztiak galduko dira.

Fitxategiko aldaketak unitatean idatzita daudela eta tarteko buffer batean ez daudela ziurtatu behar duzun ataza ugari daude. Berme hori POSIX-ekin bat datorren fsync sistema-deia erabiliz lor daiteke. fsync deiak bufferetik diskora idaztera behartzen du.

Erakuts dezagun bufferren eragina C programa labur baten moduan adibide artifizial batekin.

#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;
}

Iruzkinek ondo azaltzen dute programako ekintzen sekuentzia. "Bizitzaren, unibertsoaren eta hori guztiaren galdera nagusiaren erantzuna" testua bufferean gordeko du sistema eragileak, eta zerbitzaria berrabiarazten baduzu "kalkuluetan" Berrezarri botoia sakatuz, fitxategia hutsik egongo da. Gure adibidean, testua galtzea ez da arazo bat, beraz, fsync ez da beharrezkoa. Datu-baseek ez dute baikortasun hori partekatzen.

Datu-baseak aldi berean fitxategi askorekin lan egiten duten programa konplexuak dira, beraz, idazten dituzten datuak diskoan gordeko direla ziurtatu nahi dute, datu-basearen koherentzia horren araberakoa baita. Datu-baseak burututako transakzio guztiak erregistratzeko eta edozein unetan argindar etenaldi baterako prest egoteko diseinatuta daude. Portaera honek fsync etengabe erabiltzera behartzen zaitu kantitate handietan.

Zerk eragiten dio fsync-en maiz erabiltzeari

I/O normalarekin, sistema eragilea diskoaren komunikazioa optimizatzen saiatzen da, kanpoko unitateak memoria hierarkian motelenak baitira. Hori dela eta, sistema eragilea unitaterako sarbide batean ahalik eta datu gehien idazten saiatzen da.

Erakuts dezagun fsync erabiltzearen eragina adibide zehatz batekin. SSD hauek ditugu proba-gai gisa:

  • Intel® DC SSD S4500 480 GB, SATA 3.2 bidez konektatuta, 6 Gb/s;
  • Samsung 970 EVO Plus 500 GB, PCIe 3.0 x4 bidez konektatuta, ~ 31 Gbps.

Probak Ubuntu 2255 exekutatzen duen Intel® Xeon® W-20.04 batean egiten dira. Diskoak probatzeko, sysbench 1.0.18 erabiltzen da. Diskoek ext4 gisa formateatutako partizio bakarra dute. Proba prestatzen 100 GB fitxategiak sortzea da:

sysbench --test=fileio --file-total-size=100G prepare

Korrika probak:

# Без 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 run

Proben emaitzak taulan aurkezten dira.

Test
Intel® S4500
Samsung 970 EVO+

Irakurri fsync gabe, MiB/s
5734.89
9028.86

Idatzi fsync gabe, MiB/s
3823.26
6019.24

fsync-ekin irakurtzen, MiB/s
37.76
3.27

Fsync-ekin grabatzea, MiB/s
25.17
2.18

Erraz ikusten da bezero-segmentuko NVMe-k konfiantzaz eramaten duela sistema eragileak berak diskoekin nola lan egin erabakitzen duenean eta galtzen duela fsync erabiltzen denean. Honek bi galdera sortzen ditu:

  1. Zergatik gainditzen du irakurketa-abiadurak estekaren banda-zabalera fisikoa proban fsync gabe?
  2. Zergatik da hobea zerbitzariaren segmentu SSD bat fsync eskaera ugari kudeatzeko?

Lehenengo galderaren erantzuna erraza da: sysbench-ek zero betetako fitxategiak sortzen ditu. Horrela, proba 100 gigabyte zero baino gehiago egin zen. Datuak oso uniformeak eta aurreikusgarriak direnez, OS optimizazio desberdinak sartzen dira jokoan, eta nabarmen bizkortzen dute exekuzioa.

Sysbench-en emaitza guztiak zalantzan jartzen badituzu, fio erabil dezakezu.

# Без 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/sdb

Test
Intel® S4500
Samsung 970 EVO+

Irakurri fsync gabe, MiB/s
45.5
178

Idatzi fsync gabe, MiB/s
30.4
119

fsync-ekin irakurtzen, MiB/s
32.6
20.9

Fsync-ekin grabatzea, MiB/s
21.7
13.9

Fsync erabiltzean NVMe-n errendimendu-jaitsierarako joera argi ikusten da. Bigarren galderara pasa zaitezke.

Optimizazioa edo bluff

Lehenago esan genuen datuak buffer batean gordetzen direla, baina ez genuen zehaztu zeinetan, ez baitzen garrantzitsua. Orain ere ez dugu sistema eragileen korapilatsuetan sakonduko eta bi buffer mota orokor bereiziko:

  • programa;
  • hardwarea.

Software-buffer-ak sistema eragilean dauden bufferei egiten die erreferentzia, eta hardware-buffer-a disko kontrolagailuaren memoria lurrunkorrari. fsync sistema-deiak diskora komando bat bidaltzen du bere bufferretik datuak biltegiratze nagusira idazteko, baina ez du komandoaren exekuzio zuzena kontrolatzeko modurik.

SSDak hobeto funtzionatzen duenez, bi hipotesi egin daitezke:

  • diskoa antzeko plan bateko karga baterako diseinatuta dago;
  • diskoak "bluffs" egiten du eta komandoari ez dio jaramonik egiten.

Diskoaren portaera desleialak nabaritu daitezke proba bat egiten baduzu elektrizitate hutsarekin. Hau gidoi batekin egiaztatu dezakezu. diskchecker.pl, zein zen ezarri urteko 2005.

Script honek bi makina fisiko behar ditu: "zerbitzaria" eta "bezeroa". Bezeroak datu kopuru txiki bat idazten du proban dagoen unitatean, fsync-i deitzen dio eta zerbitzariari idatzitakoari buruzko informazioa bidaltzen du.

# Запускается на сервере
./diskchecker.pl -l [port]

# Запускается на клиенте
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>

Script-a exekutatu ondoren, beharrezkoa da "bezeroa" desenergizatu eta hainbat minutuz energiarik ez itzultzea. Garrantzitsua da proba-gaia elektrizitatetik deskonektatzea, eta ez itzaltze gogor bat egitea. Denbora pixka bat igaro ondoren, zerbitzaria konektatu eta OSra kargatu daiteke. OSa abiarazi ondoren, berriro hasi behar duzu diskchecker.pl, baina argudio batekin egiaztatu.

./diskchecker.pl -s <server[:port]> verify <file>

Egiaztapenaren amaieran, akatsen kopurua ikusiko duzu. 0 badira, diskoak proba gainditu du. Diskoarentzat arrakastatsua den zirkunstantzia konbinazio bat baztertzeko, esperimentua hainbat aldiz errepika daiteke.

Gure S4500-k ez du energia galera akatsik erakutsi, eta horrek esan nahi du prest dagoela fsync dei asko dituzten kargak egiteko.

Ondorioa

Diskoak edo prest egindako konfigurazio osoak aukeratzerakoan, kontuan izan behar dituzu konpondu beharreko zereginen berezitasunak. Lehen begiratuan, bistakoa da NVMe, hau da, PCIe interfazea duen SSD bat, SATA SSD "klasiko" bat baino azkarragoa dela. Hala ere, gaur ulertu dugunez, baldintza zehatzetan eta zeregin jakin batzuekin baliteke hori ez izatea.

Nola probatzen dituzu zerbitzariaren osagaiak IaaS hornitzaile bati alokatzean?
Zure zain gaude iruzkinetan.

Zergatik da nire NVMe SSD bat baino motelagoa?

Iturria: www.habr.com

Gehitu iruzkin berria