
في هذه المقالة ، سنلقي نظرة على بعض الفروق الدقيقة في نظام الإدخال / الإخراج الفرعي وتأثيرها على الأداء.
قبل أسبوعين ، واجهت السؤال لماذا يكون NVMe على خادم واحد أبطأ من SATA على خادم آخر. نظرت في خصائص الخوادم وأدركت أن هذا كان سؤالًا خادعًا: كان NVMe من قطاع المستخدم ، وكان SSD من قطاع الخادم.
من الواضح أن مقارنة المنتجات من قطاعات مختلفة في بيئات مختلفة ليس صحيحًا ، لكن هذه ليست إجابة فنية شاملة. دعنا نتعلم الأساسيات ونجرب ونجيب على السؤال.
ما هو fsync وأين يتم استخدامه
لتسريع العمل مع محركات الأقراص ، يتم تخزين البيانات مؤقتًا ، أي تخزينها في ذاكرة متقلبة حتى تقدم فرصة مناسبة لحفظ محتويات المخزن المؤقت على محرك الأقراص. يتم تحديد معايير "الفرصة" بواسطة نظام التشغيل وخصائص محرك الأقراص. في حالة انقطاع التيار الكهربائي ، سيتم فقد جميع البيانات الموجودة في المخزن المؤقت.
هناك عدد من المهام التي تحتاج فيها إلى التأكد من كتابة التغييرات في الملف على محرك الأقراص ، وليس في مخزن مؤقت متوسط. يمكن اكتساب هذه الثقة باستخدام استدعاء نظام fsync المتوافق مع POSIX. يبدأ استدعاء 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, "42\n", 3);
return 0;
}
تشرح التعليقات بشكل جيد تسلسل الإجراءات في البرنامج. سيتم تخزين النص "الإجابة على السؤال الرئيسي للحياة والكون وكل ذلك" بواسطة نظام التشغيل ، وإذا قمت بإعادة تشغيل الخادم بالضغط على زر إعادة التعيين أثناء "الحسابات" ، فسيكون الملف فارغًا. في مثالنا ، لا يمثل فقدان النص مشكلة ، لذلك ليست هناك حاجة إلى fsync. قواعد البيانات لا تشارك هذا التفاؤل.
قواعد البيانات هي برامج معقدة تعمل في نفس الوقت مع العديد من الملفات ، لذلك يريدون التأكد من أن البيانات التي يكتبونها سيتم حفظها على محرك الأقراص ، لأن اتساق البيانات داخل قاعدة البيانات يعتمد عليها. تم تصميم قواعد البيانات لتسجيل جميع المعاملات المنجزة والاستعداد لانقطاع التيار الكهربائي في أي وقت. يُلزمنا هذا السلوك باستخدام fsync بكميات كبيرة طوال الوقت.
ما يؤثر الاستخدام المتكرر لـ fsync
مع الإدخال / الإخراج العادي ، يحاول نظام التشغيل تحسين اتصاله بالأقراص ، نظرًا لأن محركات الأقراص الخارجية هي الأبطأ في التسلسل الهرمي للذاكرة. لذلك ، يحاول نظام التشغيل كتابة أكبر قدر ممكن من البيانات في مكالمة واحدة إلى محرك الأقراص.
دعنا نوضح تأثير استخدام fsync بمثال محدد. لدينا محركات أقراص الحالة الصلبة التالية كمواضيع اختبار:
- Intel® DC SSD S4500 480 جيجابايت ، متصل عبر SATA 3.2 ، 6 جيجابت / ثانية ؛
- Samsung 970 EVO Plus 500 جيجابايت ، PCIe 3.0 x4 ، ~ 31 جيجابت في الثانية.
تم إجراء الاختبارات على Intel® Xeon® W-2255 الذي يعمل بنظام التشغيل Ubuntu 20.04. يستخدم Sysbench 1.0.18 لاختبار الأقراص. يتم إنشاء قسم واحد على محركات الأقراص بتنسيق ext4. يتكون التحضير للاختبار من إنشاء ملفات بحجم 100 جيجابايت:
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 | 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 |
- لماذا في الاختبار بدون fsync تتجاوز سرعة القراءة النطاق الترددي المادي؟
- لماذا يعتبر SSD من جانب الخادم أفضل في التعامل مع عدد كبير من طلبات fsync؟
الإجابة على السؤال الأول بسيطة: يقوم نظام sysbench بإنشاء ملفات مليئة بالأصفار. وهكذا ، تم إجراء الاختبار على أكثر من 100 جيجا بايت من الأصفار. نظرًا لأن البيانات رتيبة للغاية ويمكن التنبؤ بها ، فإن العديد من تحسينات نظام التشغيل تلعب دورًا ، وهي تسرع التنفيذ بشكل كبير.
إذا كنت تشكك في جميع نتائج 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 | 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 أمرًا إلى محرك الأقراص لكتابة البيانات من المخزن المؤقت الخاص به إلى وحدة التخزين الرئيسية ، ولكنه لا يمكنه التحكم في صحة تنفيذ الأمر.
نظرًا لأن محركات أقراص الحالة الثابتة تعمل بشكل أفضل ، يمكن وضع افتراضين:
- القرص مصمم لمثل هذا الحمل ؛
- يخدع القرص ويتجاهل الأمر.
يمكنك رؤية السلوك غير النزيه لمحرك الأقراص إذا أجريت اختبار انقطاع التيار الكهربائي. يمكنك التحقق من ذلك باستخدام البرنامج النصي 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؟
نحن في انتظارك في التعليقات.
