it-swarm.asia

متى يجب أن أستخدم / dev / shm / ومتى يجب أن أستخدم / tmp /؟

متى يجب علي استخدام /dev/shm/ ومتى يجب علي استخدام /tmp/؟ هل يمكنني الاعتماد دائمًا على وجودهما على Unices؟

130
Deleted

/dev/shm هو نظام ملفات تخزين ملفات مؤقت ، على سبيل المثال ، tmpfs ، يستخدم RAM لمخزن النسخ الاحتياطي. يمكن أن تعمل كتطبيق الذاكرة المشتركة الذي يسهل IPC .

من ويكيبيديا :

بدأت عمليات بناء نواة Linux 2.6 الأخيرة في تقديم/dev/shm كذاكرة مشتركة في شكل ramdisk ، وبشكل أكثر تحديداً كدليل قابل للكتابة عالمياً يتم تخزينه في الذاكرة بحد أقصى محدد في/etc/default/tmpfs. /dev/shm الدعم اختياري تمامًا داخل ملف تهيئة kernel. يتم تضمينه افتراضيًا في توزيعات Fedora و Ubuntu ، حيث يتم استخدامه على نطاق واسع بواسطة تطبيق Pulseaudio.(تم اضافة التأكيدات.)

/tmp هو موقع الملفات المؤقتة كما هو محدد في التسلسل الهرمي لنظام الملفات ، والتي تتبعها جميع توزيعات يونكس ولينكس تقريبًا.

نظرًا لأن RAM أسرع بكثير من مساحة التخزين على القرص ، يمكنك استخدام /dev/shm بدلاً من /tmp لتحسين الأداء ، إذا كانت عمليتك هي I/O مكثفة ويستخدم على نطاق واسع الملفات المؤقتة.

للإجابة على أسئلتك: لا ، لا يمكنك دائمًا الاعتماد على وجود /dev/shm ، وبالتأكيد ليس على الأجهزة المربوطة بالذاكرة. يجب عليك استخدام /tmp إلا إذا كان لديك سبب وجيه جدًا لاستخدام /dev/shm.

تذكر أن /tmp يمكن أن يكون جزءًا من نظام الملفات / بدلاً من تحميل منفصل ، وبالتالي يمكن أن ينمو كما هو مطلوب. يقتصر حجم /dev/shm على فائض RAM على النظام ، وبالتالي من المحتمل أن ينفد لديك مساحة أكبر على نظام الملفات هذا.

93
nagul

بالترتيب التنازلي لـ tmpfshoodhood:

┌───────────┬──────────────┬────────────────┐
│ /dev/shm  │ always tmpfs │ Linux specific │
├───────────┼──────────────┼────────────────┤
│ /tmp      │ can be tmpfs │ FHS 1.0        │
├───────────┼──────────────┼────────────────┤
│ /var/tmp  │ never tmpfs  │ FHS 1.0        │
└───────────┴──────────────┴────────────────┘

نظرًا لأنك تسأل عن نقطة تحميل خاصة بـ Linux tmpfs مقابل دليل محدد يمكن نقله قد يكون tmpfs (اعتمادًا على مسؤول النظام لديك وما هو الافتراضي للتوزيع الخاص بك) ، يحتوي سؤالك على جانبين ، حيث أكدت الإجابات الأخرى بشكل مختلف:

  1. متى تستخدم هذه الدلائل ، استنادًا إلى الممارسة الجيدة
  2. عندما يكون من المناسب استخدام tmpfs

الممارسات الجيدة

الطبعة المحافظة (مزيج من الاتفاقيات من FHS والاستخدام الشائع):

  • عندما تكون في شك ، استخدم /tmp.
  • استخدم /var/tmp للبيانات الكبيرة التي قد لا تتلاءم بسهولة في ذاكرة الوصول العشوائي.
  • استخدم /var/tmp للبيانات المفيدة في إعادة التشغيل (مثل ذاكرة التخزين المؤقت).
  • استخدم /dev/shm كأثر جانبي لاستدعاء shm_open(). الجمهور المقصود هو مخازن مؤقتة يتم الكتابة فوقها إلى ما لا نهاية. لذلك هذا للملفات طويلة العمر التي يكون محتواها متقلبًا وليس كبيرًا بشكل رهيب.
  • إذا كان لا يزال موضع شك ، فقم بتوفير وسيلة ليتمكن المستخدم من تجاوزها. على سبيل المثال ، يكرم البرنامج mktemp متغير البيئة TMPDIR.

طبعة واقعية:

استخدم /dev/shm عندما يكون من المهم استخدام tmpfs ، /var/tmp عندما يكون من المهم عدم ، وإلا /tmp.

حيث تتفوق tmpfs

fsync هو no-op على tmpfs. هذا syscall هو العدو الأول لأداء (IO) (وطول العمر الافتراضي ، إذا كنت مهتمًا بذلك) ، على الرغم من أنك إذا وجدت نفسك تستخدم tmpfs (أو eatmydata ) فقط لهزيمة fsync ، فأنت (أو أي مطور آخر في السلسلة) تفعل شيئًا خاطئًا. هذا يعني أن المعاملات التي تتم على جهاز التخزين محببة بشكل لا لزوم له لغرضك - من الواضح أنك على استعداد لتخطي بعض نقاط التوفير للأداء ، حيث إنك قد وصلت الآن إلى أقصى الحدود لتخريبها - نادراً ما تكون أفضل حل وسط. وأيضًا ، يوجد هنا في أرض أداء المعاملات حيث توجد بعض من أعظم فوائد وجود SSD - أي SSD لائق سيؤدي أداء خارج هذا العالم مقارنة بما يمكن أن يأخذه قرص الغزل (7200 دورة في الدقيقة = 120 هرتز ، إذا لم يكن الوصول إلى شيء آخر) ، ناهيك عن بطاقات ذاكرة الفلاش ، والتي تختلف اختلافًا كبيرًا في هذا المقياس (ليس أقلها أنها مفاضلة ذات أداء متسلسل ، وهو ما يتم تصنيفها به ، مثل تصنيف فئة بطاقة SD). لذا احذر من المطورين الذين لديهم محركات أقراص صلبة ذات سرعة عالية ، وليس لإجبار المستخدمين على استخدام هذه الحالة!

نريد سماع قصة سخيفة؟ أول درس fsync: حصلت على وظيفة تضمنت بشكل روتيني "ترقية" مجموعة من قواعد بيانات Sqlite (تم الاحتفاظ بها على شكل testcases) إلى تنسيق حالي دائم التغيير. يعمل إطار "الترقية" على مجموعة من البرامج النصية ، مع إجراء معاملة واحدة على الأقل لكل منهما ، لترقية قاعدة بيانات واحدة. بالطبع ، قمت بترقية قواعد البيانات الخاصة بي على التوازي (8 بشكل متوازٍ ، حيث أنعمت على وحدة المعالجة المركزية 8 الأساسية القوية). ولكن كما اكتشفت ، لم يكن هناك تسارع موازٍ على الإطلاق (بالأحرى ضرب بسيط ) ) لأن العملية كانت بالكامل IO ملزمة. ومما يبعث على التفاؤل ، أن التفاف إطار الترقية في برنامج نصي قام بنسخ كل قاعدة بيانات إلى /dev/shm ، وقام بترقيته هناك ، ونسخه مرة أخرى إلى القرص كان أسرع بمقدار 100 مرة (لا يزال مع 8 في نفس الوقت) كمكافأة ، كان الكمبيوتر قابلاً للاستخدام أيضًا ، أثناء ترقية قواعد البيانات.

حيث tmpfs هو المناسب

الاستخدام المناسب لـ tmpfs هو تجنب الكتابة غير الضرورية للبيانات المتقلبة. تعطيل فعال Writeback ، مثل ضبط /proc/sys/vm/dirty_writeback_centisecs إلى ما لا نهاية على نظام ملفات منتظم.

لا علاقة لذلك بالأداء ، وفشل هذا هو مصدر قلق أقل بكثير من إساءة استخدام fsync: تحدد مهلة Writeback مدى الكسل الذي يتم به تحديث محتوى القرص بعد محتوى pagecache ، والإعداد الافتراضي لمدة 5 ثوانٍ هو وقت طويل للكمبيوتر - يمكن للتطبيق الكتابة فوق ملف بشكل متكرر كما هو مطلوب ، في pagecache ، ولكن يتم تحديث المحتوى الموجود على القرص مرة واحدة فقط كل 5 ثوانٍ. ما لم يفرض التطبيق من خلال fsync ، وهذا هو. فكر في عدد المرات التي يستطيع فيها أحد التطبيقات إخراج ملف صغير في هذا الوقت ، وسترى السبب في أن متابعة كل واحد سيكون مشكلة أكبر بكثير.

ما tmpfs لا يمكن أن تساعدك مع

  • قراءة الأداء. إذا كانت بياناتك ساخنة (وهو أفضل إذا كنت تفكر في الاحتفاظ بها في ملفات tmpfs) ، فسوف تضغط على pagecache على أي حال. الفرق هو عندما لا تصل إلى pagecache. إذا كانت هذه هي الحالة ، فانتقل إلى "Where tmpfs sux" ، أدناه.
  • ملفات قصيرة الأجل. يمكن أن تعيش هذه حياتهم بأكملها في pagecache (مثل صفحات قذرة) قبل كتابتها. إلا إذا كنت فرضه مع fsync بالطبع.

حيث tmpfs sux

حفظ البيانات الباردة . قد تشعر بالإغراء للاعتقاد بأن عرض الملفات خارج المقايضة يكون بنفس كفاءة نظام الملفات العادي ، ولكن هناك عدة أسباب وراء ذلك:

  • أبسط سبب: لا يوجد شيء يحب أجهزة التخزين المعاصرة (سواء أكانت أقراص صلبة أو مبنية على فلاش) أكثر من قراءة الملفات المتسلسلة إلى حد ما والتي يتم تنظيمها بدقة بواسطة نظام ملفات مناسب. تبادل في كتل 4KiB من غير المرجح أن تحسن في ذلك.
  • التكلفة المخفية: المبادلة خارج . صفحات Tmpfs هي متسخة - يجب كتابتها في مكان ما (للمبادلة) لإخلائها من pagecache ، بدلاً من الملفات المدعومة clean الصفحات التي يمكن إسقاطها على الفور. هذه عقوبة الكتابة الإضافية على كل شيء آخر يتنافس على الذاكرة - يؤثر على شيء آخر في وقت مختلف عن استخدام تلك الصفحات tmpfs.
53
user2394284

حسنا ، ها هي الحقيقة.

كلا tmpfs ونظام الملفات العادي هي ذاكرة التخزين المؤقت للذاكرة على القرص.

تستخدم ملفات tmpfs الذاكرة ومساحة التخزين حيث أنها تدعم نظام الملفات الذي يستخدم مساحة معينة من القرص ، ولا يقتصر حجمها على حجم نظام الملفات ، فمن الممكن تمامًا الحصول على ملفات tmpfs بحجم 200 جيجابايت على جهاز به ذاكرة أقل من غيغابايت لديك ما يكفي من المبادلة.

الفرق في عندما يتم كتابة البيانات إلى القرص. بالنسبة لـ tmpfs ، تتم كتابة البيانات فقط عندما تصبح الذاكرة ممتلئة جدًا أو من غير المحتمل استخدام البيانات قريبًا. تم تصميم معظم أنظمة ملفات Linux المعتادة بحيث تحتوي دائمًا على مجموعة أو أكثر من البيانات المتسقة على القرص ، لذلك إذا قام المستخدم بسحب القابس فلن يفقد كل شيء.

شخصيا ، أنا معتاد على وجود أنظمة تشغيل لا تتعطل وأنظمة UPS (مثل بطاريات الكمبيوتر المحمول) لذلك أعتقد أن أنظمة الملفات ext2/3 بجنون العظمة للغاية مع الفاصل الزمني لنقطة التفتيش من 5 إلى 10 ثوانٍ. نظام الملفات ext4 أفضل من خلال نقطة تفتيش مدتها 10 دقائق ، إلا أنه يعامل بيانات المستخدم كفئة ثانية ولا يحميها. (ext3 هو نفسه لكنك لا تلاحظ ذلك بسبب نقطة تفتيش 5 ثوانٍ)

نقطة التفتيش المتكررة هذه تعني أن البيانات غير الضرورية تتم كتابتها باستمرار إلى القرص ، حتى بالنسبة لـ/tmp.

وبالتالي فإن النتيجة هي أنك تحتاج إلى إنشاء مساحة مبادلة كبيرة كما يجب أن تكون/tmp (حتى إذا كان عليك إنشاء swapfile) واستخدام تلك المساحة لتركيب tmpfs بالحجم المطلوب على/tmp.

أبدا استخدام/ديف/shm.

ما لم تكن تستخدمه لملفات صغيرة جدًا (من المحتمل أن تكون mmap'd) IPC وتأكد من وجودها (ليست قياسية) وأن الجهاز يحتوي على أكثر من ذاكرة + مبادلة متوفرة.

18
Robert

استخدم/tmp/للملفات المؤقتة. استخدم/dev/shm/عندما تريد ذاكرة مشتركة (أي ، الاتصال بين العمليات من خلال الملفات).

يمكنك الاعتماد على/tmp/الوجود هناك ، ولكن/dev/shm/هو الشيء الوحيد الذي يستخدم نظام Linux حديثًا.

4
Captain Segfault

وقت آخر يجب عليك فيه استخدام/dev/shm (لنظام Linux 2.6 والإصدارات الأحدث) هو عندما تحتاج إلى نظام ملفات tmpfs مضمون لأنك لا تعرف إذا كنت يمكنك الكتابة إلى القرص .

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

1
Japheth Cleaver

في Perl ، بعد أن كان الحد الأدنى 8 جيجابايت على أي جهاز (جميعها تعمل بنظام Linux Mint) ، فأنا على ما أعتقد أنه عادة جيدة من القيام بخوارزميات معقدة تستند إلى DB_File (بنية ملف في ملف) بملايين من القراءة والكتابة باستخدام/dev/SHM

بلغات أخرى ، وعدم وجود ارتباط في كل مكان ، لتجنب بدء التشغيل وتوقفه في نقل الشبكة (العمل محليًا على ملف موجود على خادم في جو عميل خادم) ، باستخدام ملف دفعي من نوع ما ، سأنسخ ملف كامل (300-900 ميجابايت) مرة واحدة إلى/dev/shm ، قم بتشغيل البرنامج مع الإخراج إلى/dev/shm ، وكتابة النتائج مرة أخرى إلى الخادم ، وحذفها من/dev/shm

بطبيعة الحال ، إذا كان لدي ذاكرة وصول عشوائي أقل ، فلن أقوم بذلك. عادةً ، يقرأ نظام الملفات في الذاكرة/dev/shm بحجم نصف ذاكرة الوصول العشوائي المتوفرة لديك. ومع ذلك ، فإن الاستخدام العادي لـ [RAM ثابت. لذلك لا يمكنك فعل ذلك على جهاز بحجم 2 جيجابايت أو أقل. لتحويل إعادة صياغة إلى hyperbole ، غالبًا ما توجد أشياء في RAM حتى النظام لا يبلغ جيدًا.

0
David Grove

يتم استخدام/dev/shm لبرامج تشغيل وبرامج الأجهزة المحددة لنظام الذاكرة الظاهرية المشتركة.

إذا كنت تقوم بإنشاء برنامج يتطلب كومة الذاكرة الظاهرية التي يجب تعيينها إلى الذاكرة الظاهرية. يتضاعف هذا الأمر إذا كنت بحاجة إلى عمليات متعددة أو مؤشرات ترابط لتكون قادرًا على الوصول إلى تلك الذاكرة بأمان.

الحقيقة هي أن مجرد استخدام برنامج تشغيل إصدار خاص من tmpfs لذلك ، لا يعني أنه يجب عليك استخدامه كقسم tmpfs عام. بدلاً من ذلك ، يجب عليك فقط إنشاء قسم tmpfs آخر إذا كنت تريد قسمًا للدليل المؤقت الخاص بك.

0
Robert Wm Ruedisueli