เหตุใด NVMe ของฉันจึงช้ากว่า SSD

เหตุใด NVMe ของฉันจึงช้ากว่า SSD
ในบทความนี้เราจะดูความแตกต่างของระบบย่อย I / O และผลกระทบต่อประสิทธิภาพ

เมื่อสองสามสัปดาห์ก่อน ฉันพบคำถามว่าทำไม NVMe บนเซิร์ฟเวอร์หนึ่งถึงช้ากว่า SATA บนอีกเซิร์ฟเวอร์หนึ่ง ฉันดูคุณลักษณะของเซิร์ฟเวอร์แล้วพบว่ามันเป็นคำถามหลอกลวง: NVMe มาจากกลุ่มผู้ใช้ และ SSD มาจากกลุ่มเซิร์ฟเวอร์

แน่นอนว่าการเปรียบเทียบผลิตภัณฑ์จากกลุ่มต่างๆ ในสภาพแวดล้อมที่แตกต่างกันนั้นไม่ถูกต้อง แต่นี่ไม่ใช่คำตอบทางเทคนิคที่ครบถ้วนสมบูรณ์ เราจะศึกษาพื้นฐาน ทดลอง และตอบคำถามที่ตั้งไว้

fsync คืออะไรและใช้ที่ไหน

เพื่อเร่งความเร็วในการทำงานกับไดรฟ์ ข้อมูลจะถูกบัฟเฟอร์ นั่นคือ เก็บไว้ในหน่วยความจำชั่วคราว จนกว่าจะมีโอกาสที่สะดวกในการบันทึกเนื้อหาของบัฟเฟอร์ลงในไดรฟ์ เกณฑ์โอกาสถูกกำหนดโดยระบบปฏิบัติการและคุณลักษณะของไดรฟ์ ในกรณีที่ไฟฟ้าขัดข้อง ข้อมูลทั้งหมดในบัฟเฟอร์จะสูญหาย

มีงานหลายอย่างที่คุณต้องแน่ใจว่าการเปลี่ยนแปลงในไฟล์ถูกเขียนลงในไดรฟ์และไม่ได้อยู่ในบัฟเฟอร์ระดับกลาง การรับประกันนี้สามารถขอรับได้โดยใช้การเรียกระบบ fsync ที่สอดคล้องกับ POSIX การเรียก fsync บังคับให้เขียนจากบัฟเฟอร์ไปยังไดรฟ์

มาสาธิตผลกระทบของบัฟเฟอร์ด้วยตัวอย่างประดิษฐ์ในรูปแบบของโปรแกรม 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;
}

ความเห็นอธิบายลำดับการดำเนินการในโปรแกรมได้ดี ข้อความ "คำตอบสำหรับคำถามหลักเกี่ยวกับชีวิต จักรวาล และทั้งหมดนั้น" จะถูกบัฟเฟอร์โดยระบบปฏิบัติการ และหากคุณรีสตาร์ทเซิร์ฟเวอร์โดยกดปุ่มรีเซ็ตระหว่าง "การคำนวณ" ไฟล์จะว่างเปล่า ในตัวอย่างของเรา การสูญเสียข้อความไม่ใช่ปัญหา ดังนั้นจึงไม่จำเป็นต้องใช้ fsync ฐานข้อมูลไม่แบ่งปันการมองโลกในแง่ดีนี้

ฐานข้อมูลเป็นโปรแกรมที่ซับซ้อนซึ่งทำงานกับไฟล์จำนวนมากในเวลาเดียวกัน ดังนั้นจึงต้องการให้แน่ใจว่าข้อมูลที่เขียนจะถูกจัดเก็บไว้ในไดรฟ์ เนื่องจากความสอดคล้องของข้อมูลภายในฐานข้อมูลขึ้นอยู่กับสิ่งนี้ ฐานข้อมูลได้รับการออกแบบเพื่อบันทึกธุรกรรมที่เสร็จสมบูรณ์ทั้งหมดและพร้อมสำหรับไฟฟ้าดับได้ตลอดเวลา ลักษณะการทำงานนี้บังคับให้คุณใช้ fsync อย่างต่อเนื่องในปริมาณมาก

สิ่งที่ส่งผลต่อการใช้งาน fsync บ่อยครั้ง

ด้วย I/O ปกติ ระบบปฏิบัติการจะพยายามปรับการสื่อสารดิสก์ให้เหมาะสม เนื่องจากไดรฟ์ภายนอกช้าที่สุดในลำดับชั้นหน่วยความจำ ดังนั้นระบบปฏิบัติการจึงพยายามเขียนข้อมูลให้ได้มากที่สุดในการเข้าถึงไดรฟ์เพียงครั้งเดียว

มาสาธิตผลกระทบของการใช้ fsync ด้วยตัวอย่างที่เฉพาะเจาะจงกัน เรามี SSD ต่อไปนี้เป็นวิชาทดสอบ:

  • Intel® DC SSD S4500 480 GB เชื่อมต่อผ่าน SATA 3.2, 6 Gb/s;
  • Samsung 970 EVO Plus 500GB เชื่อมต่อผ่าน PCIe 3.0 x4, ~31 Gbps

การทดสอบดำเนินการบน Intel® Xeon® W-2255 ที่ใช้ Ubuntu 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

ผลการทดสอบแสดงไว้ในตาราง

ทดสอบ
อินเทล® S4500
ซัมซุง 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. เหตุใดเซิร์ฟเวอร์เซกเมนต์ SSD จึงดีกว่าในการจัดการคำขอ fsync จำนวนมาก

คำตอบสำหรับคำถามแรกนั้นง่ายมาก: 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

ทดสอบ
อินเทล® S4500
ซัมซุง 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

แนวโน้มประสิทธิภาพลดลงใน NVMe เมื่อใช้ fsync สามารถมองเห็นได้ชัดเจน คุณสามารถไปยังคำถามที่สองได้

การเพิ่มประสิทธิภาพหรือทู่

ก่อนหน้านี้เราบอกว่าข้อมูลถูกเก็บไว้ในบัฟเฟอร์ แต่ไม่ได้ระบุว่าบัฟเฟอร์ใดเนื่องจากไม่สำคัญ แม้ว่าตอนนี้เราจะไม่เจาะลึกถึงความซับซ้อนของระบบปฏิบัติการและแยกบัฟเฟอร์ทั่วไปสองประเภทออกมา:

  • โปรแกรม;
  • ฮาร์ดแวร์.

บัฟเฟอร์ซอฟต์แวร์อ้างอิงถึงบัฟเฟอร์ที่อยู่ในระบบปฏิบัติการ และบัฟเฟอร์ฮาร์ดแวร์อ้างอิงถึงหน่วยความจำชั่วคราวของตัวควบคุมดิสก์ การเรียกระบบ fsync จะส่งคำสั่งไปยังไดรฟ์เพื่อเขียนข้อมูลจากบัฟเฟอร์ไปยังที่เก็บข้อมูลหลัก แต่ไม่มีวิธีใดที่จะควบคุมการดำเนินการคำสั่งที่ถูกต้อง

เนื่องจาก SSD ทำงานได้ดีขึ้น จึงสามารถตั้งสมมติฐานได้สองประการ:

  • ดิสก์ได้รับการออกแบบสำหรับการโหลดแผนที่คล้ายกัน
  • ดิสก์ "บลัฟ" และละเว้นคำสั่ง

สามารถสังเกตพฤติกรรมที่ไม่ซื่อสัตย์ของไดรฟ์ได้หากคุณทำการทดสอบไฟฟ้าขัดข้อง คุณสามารถตรวจสอบสิ่งนี้ได้ด้วยสคริปต์ diskchecker.pl, นั่นก็คือ สร้าง ใน 2005 ปี

สคริปต์นี้ต้องใช้เครื่องจริงสองเครื่อง - "เซิร์ฟเวอร์" และ "ไคลเอนต์" ไคลเอนต์เขียนข้อมูลจำนวนเล็กน้อยลงในไดรฟ์ที่อยู่ระหว่างการทดสอบ เรียกใช้ fsync และส่งข้อมูลเซิร์ฟเวอร์เกี่ยวกับสิ่งที่เขียน

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

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

หลังจากรันสคริปต์แล้ว จำเป็นต้องยกเลิกการรวมพลัง "ไคลเอนต์" และอย่าส่งคืนพลังงานเป็นเวลาหลายนาที สิ่งสำคัญคือต้องตัดการเชื่อมต่อวัตถุทดสอบจากไฟฟ้า ไม่ใช่แค่ปิดเครื่องอย่างหนักเท่านั้น หลังจากผ่านไประยะหนึ่ง เซิร์ฟเวอร์ก็สามารถเชื่อมต่อและโหลดเข้าสู่ระบบปฏิบัติการได้ หลังจากบูตระบบปฏิบัติการแล้ว คุณต้องเริ่มต้นใหม่อีกครั้ง diskchecker.plแต่ด้วยการโต้แย้ง ตรวจสอบ.

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

เมื่อสิ้นสุดการตรวจสอบ คุณจะเห็นจำนวนข้อผิดพลาด หากเป็น 0 แสดงว่าดิสก์ผ่านการทดสอบ หากต้องการยกเว้นการรวมกันของสถานการณ์ที่ประสบความสำเร็จสำหรับดิสก์ การทดลองสามารถทำซ้ำได้หลายครั้ง

S4500 ของเราไม่มีข้อผิดพลาดการสูญเสียพลังงาน ซึ่งหมายความว่าพร้อมสำหรับโหลดที่มีการเรียก fsync จำนวนมาก

ข้อสรุป

เมื่อเลือกดิสก์หรือการกำหนดค่าสำเร็จรูปทั้งหมด คุณควรคำนึงถึงงานเฉพาะที่ต้องแก้ไขด้วย เมื่อมองแวบแรก ดูเหมือนว่า NVMe ซึ่งก็คือ SSD ที่มีอินเทอร์เฟซ PCIe นั้นเร็วกว่า SATA SSD แบบ "คลาสสิก" อย่างไรก็ตาม ดังที่เราได้เข้าใจกันในวันนี้ ในเงื่อนไขเฉพาะและกับงานบางอย่าง สิ่งนี้อาจไม่เป็นเช่นนั้น

คุณจะทดสอบส่วนประกอบเซิร์ฟเวอร์อย่างไรเมื่อเช่าจากผู้ให้บริการ IaaS
เรากำลังรอคุณอยู่ในความคิดเห็น

เหตุใด NVMe ของฉันจึงช้ากว่า SSD

ที่มา: will.com

เพิ่มความคิดเห็น