SSD కంటే నా NVMe ఎందుకు నెమ్మదిగా ఉంది?

SSD కంటే నా NVMe ఎందుకు నెమ్మదిగా ఉంది?
ఈ వ్యాసంలో, I / O సబ్‌సిస్టమ్ యొక్క కొన్ని సూక్ష్మ నైపుణ్యాలను మరియు పనితీరుపై వాటి ప్రభావాన్ని మేము పరిశీలిస్తాము.

కొన్ని వారాల క్రితం ఒక సర్వర్‌లోని NVMe మరొక సర్వర్‌లో SATA కంటే ఎందుకు నెమ్మదిగా ఉంది అనే ప్రశ్న నాకు ఎదురైంది. నేను సర్వర్‌ల లక్షణాలను చూసాను మరియు ఇది ఒక ట్రిక్ ప్రశ్న అని గ్రహించాను: NVMe వినియోగదారు విభాగం నుండి మరియు SSD సర్వర్ విభాగం నుండి వచ్చింది.

సహజంగానే, విభిన్న వాతావరణాలలో వివిధ విభాగాల నుండి ఉత్పత్తులను పోల్చడం సరైనది కాదు, కానీ ఇది సమగ్ర సాంకేతిక సమాధానం కాదు. మేము ప్రాథమికాలను అధ్యయనం చేస్తాము, ప్రయోగాలు చేస్తాము మరియు అడిగిన ప్రశ్నకు సమాధానం ఇస్తాము.

Fsync అంటే ఏమిటి మరియు అది ఎక్కడ ఉపయోగించబడుతుంది

డ్రైవ్‌లతో పనిని వేగవంతం చేయడానికి, డేటా బఫర్ చేయబడుతుంది, అంటే, బఫర్‌లోని కంటెంట్‌లను డ్రైవ్‌లో సేవ్ చేయడానికి అనుకూలమైన అవకాశం వచ్చే వరకు అస్థిర మెమరీలో నిల్వ చేయబడుతుంది. ఆపరేటింగ్ సిస్టమ్ మరియు డ్రైవ్ లక్షణాల ద్వారా అవకాశ ప్రమాణాలు నిర్ణయించబడతాయి. విద్యుత్ వైఫల్యం సంభవించినప్పుడు, బఫర్‌లోని మొత్తం డేటా పోతుంది.

ఫైల్‌లోని మార్పులు డ్రైవ్‌లో వ్రాయబడి ఉన్నాయని మరియు ఇంటర్మీడియట్ బఫర్‌లో ఉండకూడదని మీరు నిర్ధారించుకోవాల్సిన అనేక పనులు ఉన్నాయి. POSIX-కంప్లైంట్ fsync సిస్టమ్ కాల్‌ని ఉపయోగించడం ద్వారా ఈ హామీని పొందవచ్చు. fsync కాల్ బఫర్ నుండి డ్రైవ్‌కి వ్రాయవలసి వస్తుంది.

చిన్న సి ప్రోగ్రామ్ రూపంలో కృత్రిమ ఉదాహరణతో బఫర్‌ల ప్రభావాన్ని ప్రదర్శిస్తాము.

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

వ్యాఖ్యలు ప్రోగ్రామ్‌లోని చర్యల క్రమాన్ని బాగా వివరిస్తాయి. "జీవితం యొక్క ప్రధాన ప్రశ్న, విశ్వం మరియు అన్నింటికీ సమాధానం" అనే వచనం ఆపరేటింగ్ సిస్టమ్ ద్వారా బఫర్ చేయబడుతుంది మరియు మీరు "గణనలు" సమయంలో రీసెట్ బటన్‌ను నొక్కడం ద్వారా సర్వర్‌ను పునఃప్రారంభిస్తే, ఫైల్ ఖాళీగా ఉంటుంది. మా ఉదాహరణలో, టెక్స్ట్ నష్టం సమస్య కాదు, కాబట్టి fsync అవసరం లేదు. డేటాబేస్‌లు ఈ ఆశావాదాన్ని పంచుకోలేదు.

డేటాబేస్‌లు ఒకే సమయంలో అనేక ఫైల్‌లతో పని చేసే సంక్లిష్ట ప్రోగ్రామ్‌లు, కాబట్టి వారు వ్రాసే డేటా డ్రైవ్‌లో నిల్వ చేయబడుతుందని వారు నిర్ధారించుకోవాలి, ఎందుకంటే డేటాబేస్‌లోని డేటా యొక్క స్థిరత్వం దీనిపై ఆధారపడి ఉంటుంది. డేటాబేస్‌లు అన్ని పూర్తయిన లావాదేవీలను రికార్డ్ చేయడానికి మరియు ఏ సమయంలోనైనా విద్యుత్తు అంతరాయానికి సిద్ధంగా ఉండేలా రూపొందించబడ్డాయి. ఈ ప్రవర్తన మీరు fsyncని నిరంతరం పెద్ద పరిమాణంలో ఉపయోగించేలా చేస్తుంది.

fsync యొక్క తరచుగా వాడకాన్ని ఏది ప్రభావితం చేస్తుంది

సాధారణ I/Oతో, డిస్క్ కమ్యూనికేషన్‌ను ఆప్టిమైజ్ చేయడానికి ఆపరేటింగ్ సిస్టమ్ ప్రయత్నిస్తుంది, ఎందుకంటే మెమరీ సోపానక్రమంలో బాహ్య డ్రైవ్‌లు నెమ్మదిగా ఉంటాయి. అందువల్ల, ఆపరేటింగ్ సిస్టమ్ డ్రైవ్‌కు ఒక యాక్సెస్‌లో సాధ్యమైనంత ఎక్కువ డేటాను వ్రాయడానికి ప్రయత్నిస్తుంది.

ఒక నిర్దిష్ట ఉదాహరణతో fsyncని ఉపయోగించడం యొక్క ప్రభావాన్ని ప్రదర్శిస్తాము. మేము క్రింది SSDలను పరీక్షా సబ్జెక్ట్‌లుగా కలిగి ఉన్నాము:

  • Intel® DC SSD S4500 480 GB, SATA 3.2, 6 Gb/s ద్వారా కనెక్ట్ చేయబడింది;
  • Samsung 970 EVO ప్లస్ 500GB, PCIe 3.0 x4, ~31 Gbps ద్వారా కనెక్ట్ చేయబడింది.

Ubuntu 2255 నడుస్తున్న Intel® Xeon® W-20.04పై పరీక్షలు నిర్వహించబడతాయి. డిస్కులను పరీక్షించడానికి, sysbench 1.0.18 ఉపయోగించబడుతుంది. డిస్క్‌లు ext4గా ఫార్మాట్ చేయబడిన ఒకే విభజనను కలిగి ఉంటాయి. 100 GB ఫైల్‌లను సృష్టించడం పరీక్ష కోసం సిద్ధమవుతోంది:

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

నడుస్తున్న పరీక్షలు:

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

పరీక్ష ఫలితాలు పట్టికలో ప్రదర్శించబడ్డాయి.

పరీక్ష
Intel® S4500
Samsung 970 EVO+

fsync, MiB/s లేకుండా చదవండి
5734.89
9028.86

fsync, MiB/s లేకుండా వ్రాయండి
3823.26
6019.24

fsync, MiB/sతో చదవడం
37.76
3.27

fsync, MiB/sతో రికార్డింగ్
25.17
2.18

డిస్క్‌లతో ఎలా పని చేయాలో ఆపరేటింగ్ సిస్టమ్ స్వయంగా నిర్ణయించినప్పుడు క్లయింట్ సెగ్మెంట్ నుండి NVMe నమ్మకంగా నడిపిస్తుందని మరియు fsync ఉపయోగించినప్పుడు కోల్పోతుందని చూడటం సులభం. ఇది రెండు ప్రశ్నలను లేవనెత్తుతుంది:

  1. fsync లేకుండా పరీక్షలో లింక్ యొక్క భౌతిక బ్యాండ్‌విడ్త్‌ను రీడ్ స్పీడ్ ఎందుకు మించిపోయింది?
  2. పెద్ద సంఖ్యలో fsync అభ్యర్థనలను నిర్వహించడంలో సర్వర్ సెగ్మెంట్ SSD ఎందుకు మెరుగ్గా ఉంటుంది?

మొదటి ప్రశ్నకు సమాధానం చాలా సులభం: sysbench సున్నా-నిండిన ఫైల్‌లను ఉత్పత్తి చేస్తుంది. ఈ విధంగా, పరీక్ష 100 గిగాబైట్ల సున్నాలకు పైగా నిర్వహించబడింది. డేటా చాలా ఏకరీతిగా మరియు ఊహించదగినదిగా ఉన్నందున, వివిధ OS ఆప్టిమైజేషన్లు అమలులోకి వస్తాయి మరియు అవి అమలును గణనీయంగా వేగవంతం చేస్తాయి.

మీరు sysbench యొక్క అన్ని ఫలితాలను ప్రశ్నిస్తే, మీరు 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/sdb

పరీక్ష
Intel® S4500
Samsung 970 EVO+

fsync, MiB/s లేకుండా చదవండి
45.5
178

fsync, MiB/s లేకుండా వ్రాయండి
30.4
119

fsync, MiB/sతో చదవడం
32.6
20.9

fsync, MiB/sతో రికార్డింగ్
21.7
13.9

fsyncని ఉపయోగిస్తున్నప్పుడు NVMeలో పనితీరు తగ్గుదల వైపు ధోరణి స్పష్టంగా కనిపిస్తుంది. మీరు రెండవ ప్రశ్నకు వెళ్లవచ్చు.

ఆప్టిమైజేషన్ లేదా బ్లఫ్

ఇంతకుముందు మేము డేటా బఫర్‌లో నిల్వ చేయబడిందని చెప్పాము, కానీ అది ముఖ్యమైనది కానందున దేనిలో పేర్కొనలేదు. ఇప్పుడు కూడా మేము ఆపరేటింగ్ సిస్టమ్‌ల యొక్క చిక్కులను పరిశోధించము మరియు రెండు సాధారణ రకాల బఫర్‌లను వేరు చేస్తాము:

  • కార్యక్రమం;
  • హార్డ్వేర్.

సాఫ్ట్‌వేర్ బఫర్ ఆపరేటింగ్ సిస్టమ్‌లో ఉన్న బఫర్‌లను సూచిస్తుంది మరియు హార్డ్‌వేర్ బఫర్ డిస్క్ కంట్రోలర్ యొక్క అస్థిర మెమరీని సూచిస్తుంది. fsync సిస్టమ్ కాల్ దాని బఫర్ నుండి ప్రధాన నిల్వకు డేటాను వ్రాయడానికి డ్రైవ్‌కు ఆదేశాన్ని పంపుతుంది, అయితే ఇది కమాండ్ యొక్క సరైన అమలును నియంత్రించడానికి మార్గం లేదు.

SSD మెరుగ్గా పని చేస్తుంది కాబట్టి, రెండు అంచనాలు చేయవచ్చు:

  • డిస్క్ ఇదే ప్రణాళిక యొక్క లోడ్ కోసం రూపొందించబడింది;
  • డిస్క్ "bluffs" మరియు ఆదేశాన్ని విస్మరిస్తుంది.

మీరు విద్యుత్ వైఫల్యంతో పరీక్షను నిర్వహిస్తే, డ్రైవ్ యొక్క నిజాయితీ లేని ప్రవర్తనను గమనించవచ్చు. మీరు దీన్ని స్క్రిప్ట్‌తో తనిఖీ చేయవచ్చు. diskchecker.pl, అది స్థాపించబడింది లో 2005 సంవత్సరం.

ఈ స్క్రిప్ట్‌కు రెండు భౌతిక యంత్రాలు అవసరం - "సర్వర్" మరియు "క్లయింట్". క్లయింట్ పరీక్షలో ఉన్న డ్రైవ్‌కు తక్కువ మొత్తంలో డేటాను వ్రాస్తుంది, fsyncకి కాల్ చేస్తుంది మరియు వ్రాసిన దాని గురించి సర్వర్ సమాచారాన్ని పంపుతుంది.

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

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

స్క్రిప్ట్‌ను అమలు చేసిన తర్వాత, "క్లయింట్" ను డి-ఎనర్జైజ్ చేయడం అవసరం మరియు చాలా నిమిషాలు శక్తిని తిరిగి ఇవ్వవద్దు. పరీక్ష విషయం విద్యుత్ నుండి డిస్‌కనెక్ట్ చేయడం ముఖ్యం, మరియు కేవలం హార్డ్ షట్‌డౌన్ చేయడమే కాదు. కొంత సమయం తరువాత, సర్వర్ కనెక్ట్ చేయబడుతుంది మరియు OS లోకి లోడ్ చేయబడుతుంది. OSని బూట్ చేసిన తర్వాత, మీరు మళ్లీ ప్రారంభించాలి diskchecker.pl, కానీ ఒక వాదనతో ధ్రువీకరించడం.

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

చెక్ ముగింపులో, మీరు లోపాల సంఖ్యను చూస్తారు. అవి 0 అయితే, డిస్క్ పరీక్షలో ఉత్తీర్ణత సాధించింది. డిస్క్ కోసం విజయవంతమైన పరిస్థితుల కలయికను మినహాయించడానికి, ప్రయోగాన్ని అనేక సార్లు పునరావృతం చేయవచ్చు.

మా S4500 పవర్ లాస్ ఎర్రర్‌లను చూపించలేదు, అంటే ఇది చాలా fsync కాల్‌లతో లోడ్ చేయడానికి సిద్ధంగా ఉంది.

తీర్మానం

డిస్కులు లేదా మొత్తం రెడీమేడ్ కాన్ఫిగరేషన్లను ఎంచుకున్నప్పుడు, మీరు పరిష్కరించాల్సిన పనుల ప్రత్యేకతలను గుర్తుంచుకోవాలి. మొదటి చూపులో, NVMe, అంటే PCIe ఇంటర్‌ఫేస్‌తో కూడిన SSD, "క్లాసిక్" SATA SSD కంటే వేగవంతమైనదని స్పష్టంగా తెలుస్తోంది. అయితే, ఈ రోజు మనం అర్థం చేసుకున్నట్లుగా, నిర్దిష్ట పరిస్థితుల్లో మరియు కొన్ని పనులతో ఇది అలా ఉండకపోవచ్చు.

IaaS ప్రొవైడర్ నుండి అద్దెకు తీసుకున్నప్పుడు మీరు సర్వర్ భాగాలను ఎలా పరీక్షిస్తారు?
మేము వ్యాఖ్యలలో మీ కోసం ఎదురు చూస్తున్నాము.

SSD కంటే నా NVMe ఎందుకు నెమ్మదిగా ఉంది?

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి