ในบทความนี้เราจะดูความแตกต่างของระบบย่อย 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 สิ่งนี้ทำให้เกิดคำถามสองข้อ:
- เหตุใดความเร็วในการอ่านจึงเกินแบนด์วิดท์ทางกายภาพของลิงก์ในการทดสอบโดยไม่มี fsync
- เหตุใดเซิร์ฟเวอร์เซกเมนต์ 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 ทำงานได้ดีขึ้น จึงสามารถตั้งสมมติฐานได้สองประการ:
- ดิสก์ได้รับการออกแบบสำหรับการโหลดแผนที่คล้ายกัน
- ดิสก์ "บลัฟ" และละเว้นคำสั่ง
สามารถสังเกตพฤติกรรมที่ไม่ซื่อสัตย์ของไดรฟ์ได้หากคุณทำการทดสอบไฟฟ้าขัดข้อง คุณสามารถตรวจสอบสิ่งนี้ได้ด้วยสคริปต์
สคริปต์นี้ต้องใช้เครื่องจริงสองเครื่อง - "เซิร์ฟเวอร์" และ "ไคลเอนต์" ไคลเอนต์เขียนข้อมูลจำนวนเล็กน้อยลงในไดรฟ์ที่อยู่ระหว่างการทดสอบ เรียกใช้ 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
เรากำลังรอคุณอยู่ในความคิดเห็น
ที่มา: will.com