مزامنة (يونكس)

تُعدّ عملية المزامنة استدعاءً قياسيًا للنظام في نظام التشغيل يونكس ، حيث تقوم بتثبيت جميع البيانات من مخازن نظام ملفات النواة إلى وحدة تخزين غير متطايرة ، أي البيانات التي تمت جدولة كتابتها عبر استدعاءات نظام الإدخال/الإخراج منخفضة المستوى . وقد تحتفظ طبقات الإدخال/الإخراج عالية المستوى، مثل stdio، بمخازن مؤقتة منفصلة خاصة بها.

كدالة في لغة C ، sync()يتم عادةً تعريف الاستدعاء كما هو موضح void sync(void)في <unistd.h>. يتوفر استدعاء النظام أيضًا عبر أداة سطر الأوامر المسماة sync ، ودوال تحمل أسماءً مماثلة في لغات أخرى مثل Perl و Node.js (في وحدة fs).

يُجري استدعاء النظام ذو الصلة عملية حفظ fsync()البيانات المخزنة مؤقتًا والمتعلقة بوصف ملف محدد . [ 1 ]fdatasync() كما يتوفر أيضًا لكتابة التغييرات التي أُجريت على البيانات في الملف فقط، وليس بالضرورة البيانات الوصفية المرتبطة بالملف. [ 2 ]

تُشغّل بعض أنظمة يونكس نوعًا من برامج التفريغ أو التحديث ، والتي تستدعي دالة المزامنة بشكل دوري. في بعض الأنظمة، يقوم برنامج cron بهذه المهمة، بينما في لينكس، كان برنامج pdflush هو المسؤول عنها ، والذي تم استبداله بتنفيذ جديد، ثم أُزيل نهائيًا من نواة لينكس في عام 2012. [ 3 ] كما يتم تفريغ المخازن المؤقتة عند فصل أنظمة الملفات أو إعادة تركيبها للقراءة فقط ، [ 4 ] على سبيل المثال قبل إيقاف تشغيل النظام.

تقوم بعض التطبيقات، مثل LibreOffice ، باستدعاء وظيفة المزامنة لحفظ معلومات الاسترداد على فترات زمنية محددة.

استخدام قاعدة البيانات

لضمان متانة قواعد البيانات، تحتاج إلى استخدام نوع من المزامنة للتأكد من وصول المعلومات المكتوبة إلى وحدة تخزين غير متطايرة، بدلاً من تخزينها في ذاكرة مؤقتة للكتابة قد تُفقد في حال انقطاع التيار الكهربائي. على سبيل المثال، قد يستخدم PostgreSQL مجموعة متنوعة من استدعاءات المزامنة، بما في ذلك `fsync` fsync()و`fsync` fdatasync()، [ 5 ] لضمان متانة عمليات الالتزام. [ 6 ] لسوء الحظ، بالنسبة لأي عميل واحد يكتب سلسلة من السجلات، لا يمكن لمحرك الأقراص الصلبة الدوار الالتزام إلا مرة واحدة لكل دورة، مما ينتج عنه بضع مئات من عمليات الالتزام في الثانية كحد أقصى. [ 7 ] لذا، فإن تعطيل شرط `fsync` يُحسّن أداء الالتزام بشكل كبير، ولكن على حساب احتمالية تلف قاعدة البيانات بعد حدوث عطل.

تستخدم قواعد البيانات أيضًا ملفات سجل المعاملات (عادة ما تكون أصغر بكثير من ملفات البيانات الرئيسية) التي تحتوي على معلومات حول التغييرات الأخيرة، بحيث يمكن إعادة إجراء التغييرات بشكل موثوق في حالة حدوث عطل؛ ثم يمكن مزامنة ملفات البيانات الرئيسية بشكل أقل تكرارًا.

الإبلاغ عن الأخطاء والتحقق منها

لتجنب فقدان البيانات، fsync()يجب التحقق من قيم الإرجاع، لأنه عند تنفيذ عمليات الإدخال/الإخراج المخزنة مؤقتًا بواسطة المكتبة أو النواة، قد لا يتم الإبلاغ عن الأخطاء عند استخدام write()استدعاء النظام fflush()، نظرًا لأن البيانات قد لا تُكتب إلى وحدة تخزين غير متطايرة، بل إلى ذاكرة التخزين المؤقت للصفحات فقط . بدلاً من ذلك ، غالبًا ما يتم الإبلاغ عن أخطاء الكتابة أثناء استدعاءات النظام fsync(). [ 8 ] قبل عام 2018، كان سلوك لينكس في بعض الحالات لا يُبلغ عن حالة الخطأ، [ 9 ] [ 10 ] وقد تم اقتراح تغيير هذا السلوك في 23 أبريل 2018. [ 11 ]msync()close()fsync()

جدل حول الأداء

دلالات ذاكرة التخزين المؤقت على مستوى الأجهزة

قد تستخدم الأقراص الصلبة افتراضيًا ذاكرة التخزين المؤقت للكتابة المؤقتة الخاصة بها لتخزين عمليات الكتابة مؤقتًا، مما يُحسّن الأداء بشكل كبير، ولكنه يُعرّض البيانات لخطر الضياع إذا لم يتم تحديد وقت انتهاء الكتابة بدقة. [ 12 ] تُوجّه أدوات مثل hdparm -F وحدة تحكم القرص الصلب لتفريغ ذاكرة التخزين المؤقت للكتابة الموجودة على القرص. يُعدّ تأثير تعطيل التخزين المؤقت على الأداء كبيرًا لدرجة أن مجتمع FreeBSD، المعروف بتحفظه ، رفض تعطيله افتراضيًا في الإصدار 4.3. [ 13 ]

في بروتوكول SCSI وبروتوكول SATA مع خاصية Native Command Queuing (ولكن ليس في بروتوكول ATA العادي، حتى مع خاصية TCQ)، يمكن للمضيف تحديد ما إذا كان يرغب في تلقي إشعار عند اكتمال العملية، إما عند وصول البيانات إلى أسطوانات القرص أو عند وصولها إلى ذاكرة التخزين المؤقت (الذاكرة الداخلية). بافتراض تطبيق صحيح للأجهزة، تسمح هذه الميزة باستخدام ذاكرة التخزين المؤقت للقرص مع ضمان صحة دلالات استدعاءات النظام fsync. [ 14 ] تُسمى هذه الميزة "فرض الوصول إلى الوحدة " (FUA)، وهي تتيح الاتساق مع تقليل الحمل الزائد مقارنةً بمسح ذاكرة التخزين المؤقت بالكامل كما هو الحال في أقراص ATA (أو SATA غير NCQ). [ 15 ] على الرغم من أن نظام Linux فعّل خاصية NCQ حوالي عام 2007، إلا أنه لم يُفعّل خاصية SATA/NCQ FUA حتى عام 2012، مُعللاً ذلك بعدم دعمها في الأقراص القديمة. [ 16 ] [ 17 ]

الاستخدام في التطبيقات

أدخل متصفح فايرفوكس 3.0، الذي صدر عام 2008، fsyncاستدعاءات نظامية تبيّن أنها تُؤثر سلبًا على أدائه؛ وقد أُدخلت هذه الاستدعاءات لضمان سلامة قاعدة بيانات SQLite المُدمجة . [ 18 ] وبشكلٍ أدق، يستدعي خيط واجهة المستخدم SQLite مع كل صفحة جديدة يتم زيارتها، وتستدعي المكتبة هذه الاستدعاءات أيضًا fsync. في وضع ext3 data=ordered، وهو إعداد شائع نسبيًا في ذلك الوقت، fsyncيعني استدعاء هذه الاستدعاءات مسح ذاكرة التخزين المؤقت للكتابة لنظام الملفات بالكامل ، وهو ما قد يستغرق وقتًا طويلًا إذا كانت ذاكرة التخزين المؤقت تحتوي على العديد من العمليات المُعلقة الأخرى (مثلًا أثناء نسخ ملف كبير). [ 19 ]

أثار هذا الحدث الكثير من الانتقادات لاستخدام `<data-type>` fsync، بدعوى وجود مشاكل في الأداء، وعمليات تشغيل غير ضرورية للقرص الصلب، و/أو الحاجة إلى الذرية فقط دون المتانة. [ 20 ] قدّم ثيودور تسو، كبير المسؤولين التقنيين في مؤسسة لينكس، تحليلًا للمشكلة، حيث ردّ بأنه لا داعي للقلق عند استخدام `<data-type>` بشكل صحيح، مؤكدًا أن `<data-type>` هي الطريقة الوحيدة في معيار POSIX لطلب كتابة البيانات إلى وحدة تخزين غير متطايرة. وردّ على الانتقادات الثلاثة الموجهة لـ ` <data-type>`، موضحًا أن: (1) تأثير الأداء سيكون ضئيلًا في حالة الاستخدام العادية (تنزيل ملف أثناء تصفح الإنترنت)، وأن ` <data-type>` لا تُنشئ عمليات إدخال/إخراج إضافية (فهي تنتظرها فقط)، وأن فايرفوكس أخطأ في إجراء هذا الكمّ من عمليات الكتابة على القرص أثناء تصفح صفحة ويب؛ (2) يمكن تجنب عمليات التشغيل عن طريق تعديل `<data-type>` الموجودة ؛ (3) أن "الذرية دون المتانة" تُعدّ تنازلًا أمنيًا سيئًا مقارنةً بإنشاء خيط إدخال/إخراج لتشغيل `<data-type>` . [ 20 ]fsyncfsyncfsyncfsynclaptop_modefsync

صادف أن ستيوارت سميث قدّم عرضًا تقديميًا حول استخدام وإساءة استخدام وقلة استخدام تقنية التزامن fsyncفي التطبيقات في العام السابق (2007). ورغم أن حديثه كان يدور في معظمه حول الممارسات الضارة بسلامة البيانات (وسبل ضمان السرعة والأمان معًا)، [ 21 ] إلا أن أداة "eatmydata" لتعطيل جميع استدعاءات التزامن في البرنامج انتشرت على نطاق أوسع. [ 22 ] وتُستخدم هذه الأداة بشكل أساسي في المهام "العابرة" حيث يكون فقدان البيانات مقبولًا، [ 23 ] على سبيل المثال في بيئة مؤقتة لتسريع تثبيت الحزم. [ 24 ]

انظر أيضاً

مراجع

  1. مواصفات fsync
  2. مواصفات fdatasync
  3. "RIP Pdflush [ LWN.net ] " .
  4. "mount - هل تستدعي عملية umount مزامنة لإكمال أي عمليات كتابة معلقة؟" . موقع Unix & Linux Stack Exchange . تم الاطلاع عليه بتاريخ 2021-05-02 .
  5. فوندرا، توماس (2 فبراير 2019). "PostgreSQL مقابل fsync" . Osuosl Org . مؤرشف من الأصل (mp4) في 10 فبراير 2019. تم الاطلاع عليه في 10 فبراير 2019 .
  6. موثوقية PostgreSQL وسجل الكتابة المسبقة
  7. ضبط مزامنة سجلات العمليات في PostgreSQL ( مؤرشف بتاريخ 25-11-2009 على موقع Wayback Machine)
  8. "ضمان وصول البيانات إلى القرص [ LWN.net ] " .
  9. "مفاجأة في وظيفة fsync() في PostgreSQL [ LWN.net ] " .
  10. "تحسين معالجة أخطاء طبقة الكتلة [ LWN.net ] " .
  11. "أبلغ دائمًا عن خطأ الكتابة مرة واحدة - باتشورك" . مؤرشف من الأصل بتاريخ 4 مايو 2018. تم الاطلاع عليه بتاريخ 3 مايو 2018 .
  12. هل تم تمكين ذاكرة التخزين المؤقت للكتابة؟
  13. دليل FreeBSD — أقراص الضبط
  14. مارشال كيرك ماكوسيك . "الأقراص من منظور نظام الملفات - ACM Queue" . Queue.acm.org . تم الاطلاع عليه بتاريخ 11 يناير 2014 .
  15. غريغوري سميث (2010). PostgreSQL 9.0: الأداء العالي . Packt Publishing Ltd. ص 78. ISBN  978-1-84951-031-8.
  16. "تمكين FUA لمحركات أقراص SATA (كان ردًا على: [ RFC ] [ PATCH ] libata: تمكين اكتشاف FUA لقرص SATA افتراضيًا) (Linux SCSI)" .
  17. "أرشيف نواة لينكس: [ PATCH RFC ] libata: تحديثات FUA" .
  18. "شافر » fsyncers and curveballs" . مؤرشف من الأصل بتاريخ 2012-12-09 . تم الاطلاع عليه بتاريخ 2009-10-15 . 
  19. مايك شيفر :
    في بعض إعدادات لينكس الشائعة، وخاصةً عند استخدام نظام الملفات ext3 في وضع "data=ordered"، لا يقتصر استدعاء fsync على مسح بيانات الملف المُستدعى عليه فقط، بل يشمل جميع البيانات المخزنة مؤقتًا لنظام الملفات هذا. (انظر "التخصيص المؤجل ومشكلة الملف ذي الطول الصفري") .
  20. 1 2 "لا تخف من fsync! "
  21. سميث، ستيوارت (2007). تناول بياناتي: كيف يخطئ الجميع في عمليات الإدخال والإخراج للملفات (ملف PDF) . linux.conf.au.
  22. "eatmydata (1) تعطيل fsync() ومكالمات مزامنة البيانات مع القرص الأخرى بشكل شفاف" .
  23. "libeatmydata - تعطيل fsync وحفظ البيانات!" . www.flamingspork.com .
  24. "الحزمة: apt-eatmydata (1) - تعطيل fsync وما شابهها من استدعاءات dpkg الخاصة بـ APT" . packages.debian.org .