من الممكن تنفيذ اليومية مع FSYNC واحد لكل التزام؟

StackOverflow https://stackoverflow.com/questions/3800108

  •  25-09-2019
  •  | 
  •  

سؤال

لنفترض أنك تقوم ببناء نظام تخزين في اليومية/الكتابة. هل يمكنك ببساطة تنفيذ هذا عن طريق (لكل معاملة) إلحاق البيانات (مع الكتابة (2)) ، وإلحاق علامة الالتزام ، ثم FSYNC-ing؟

السيناريو الذي يجب مراعاته هو ما إذا كنت تقوم بمجموعة كبيرة من الكتابة إلى هذا السجل ثم fsync ، وهناك فشل خلال FSYNC. هل يتم مسح مؤشرات الكتلة المباشرة/غير المباشرة فقط بعد غسل جميع كتل البيانات ، أم لا توجد ضمانات بأن الكتل يتم مسحها بالترتيب؟ إذا كان الأخير ، ثم أثناء الاسترداد ، إذا رأيت علامة ارتكاب في نهاية الملف ، فلا يمكنك الوثوق بأن البيانات بينه وبين علامة الالتزام السابقة ذات معنى. وبالتالي ، يجب عليك الاعتماد على آلية أخرى (تتضمن على الأقل FSYNC) لتحديد مدى ملف السجل المتسق (على سبيل المثال ، كتابة/fsyncing للبيانات ، ثم كتابة/fsyncing علامة الالتزام).

إذا كان يحدث فرقًا ، يتساءل بشكل أساسي عن Ext3/Ext4 كسياق.

هل كانت مفيدة؟

المحلول

لاحظ أن FSYNC's FSYNC و FDATASYNC من Linux و Mac OS غير صحيحان بشكل افتراضي. Windows صحيح بشكل افتراضي ، ولكن يمكن محاكاة Linux لأغراض القياس.

أيضًا ، تصدر FDATASYNC قرصًا متعدد يكتب ما إذا كنت قد ألحقت إلى نهاية ملف ، لأنه يحتاج إلى تحديث ملف الملف مع الطول الجديد. إذا كنت ترغب في الحصول على كتابة واحدة لكل التزام ، فإن أفضل رهان لك هو التمسك مسبقًا بسجل السجل ، وتخزين CRC من إدخالات السجل في علامة الالتزام ، وإصدار fDatasync واحد () في الالتزام. وبهذه الطريقة ، بغض النظر عن مقدار إعادة ترتيب نظام التشغيل / الأجهزة خلف ظهرك ، يمكنك العثور على بادئة السجل التي تضغط بالفعل على القرص.

إذا كنت ترغب في استخدام السجل للالتزامات المتينة أو الكتابة إلى الأمام ، فإن الأمور تزداد صعوبة ، نظرًا لأنك تحتاج إلى التأكد من أن FSYNC يعمل بالفعل. تحت Linux ، سترغب في تعطيل ذاكرة التخزين المؤقت للكتابة على القرص باستخدام HDPArm ، أو قم بتركيب القسم باستخدام حاجز محدد إلى True. [تحرير: أقف مصححة ، لا يبدو أن الحاجز يعطي الدلالات الصحيحة. تقدم SATA و SCSI عددًا من البدائيات ، مثل حواجز الكتابة وقائمة الانتظار للأمور الأصلية ، مما يجعل من الممكن لأنظمة التشغيل تصدير أولي التي تتيح تسجيل الكتابة. من ما يمكنني قوله من المنافسات وعبر الإنترنت ، يعرض Linux هذه فقط لمطوري نظام الملفات ، وليس إلى UsserPace.

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

أخيرًا ، تستخدم الأنظمة الحقيقية التزام المجموعة ، وفعل <1 مزامنة الكتابة لكل ملزمة مع أعباء العمل المتزامنة.

نصائح أخرى

لا يوجد ضمان على الترتيب الذي يتم فيه مسح الكتل إلى القرص. في هذه الأيام ، يمكن لمحرك الأقراص نفسه إعادة طلب الكتل في طريقها إلى الأطباق.

إذا كنت ترغب في تطبيق الطلب ، فأنت بحاجة إلى على الأقل fdatasync() بين الكتابة التي تريد طلبها. كل وعود المزامنة هو ذلك عندما تعود, ، كل شيء مكتوب قبل المزامنة قد ضرب التخزين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top