लिनक्स + एसएसडी पर स्वैप विभाजन पर पृष्ठभूमि त्यागें


11

संकट

मैं लिनक्स पर एक SSD डिस्क के भीतर एक स्वैप विभाजन पर पृष्ठभूमि TRIM संचालन को सक्षम करना चाहता हूं । कई लेख, जैसे के अनुसार इस एक , कर्नेल इस विन्यास का पता लगाता है और स्वचालित रूप से अलग कर दें संचालन करता है, लेकिन मेरे परीक्षणों पर है कि यह काम नहीं कर रहा है, हालांकि "छोड़ें" माउंट विकल्प इस व्यवहार के लिए मजबूर किया जाता है लगता है।

परिदृश्य

  • डेबियन व्हीज़ी लिनक्स 3.2.0 चला रहा है
  • एसएसडी डिस्क: 1 एक्स 120 जीबी ओसीजेड वेरटेक्स 3 एमआई
  • 2GB स्वैप "प्लेन" विभाजन, w / o अन्य परतें (LVM, RAID, आदि)

पृष्ठभूमि

अगर मैं TRIM स्वैप विभाजन पर काम कर रहा हूं तो ये कदम मैं जांच कर रहा हूं:

  1. TRIM समर्थन : जांचें कि SSD डिस्क TRIM कमांड का समर्थन करती है और कर्नेल डिवाइस को गैर-घूर्णी के रूप में चिह्नित करता है:

    # hdparm -I /dev/sda | grep TRIM
     * Data Set Management TRIM supported (limit 1 block)
     * Deterministic read data after TRIM
    
    # cat /sys/block/sda/queue/rotational
    0
    
  2. स्वैप को भरें : विभाजन को माउंट करें, सभी वीएम कैश को साफ करें और लिनक्स को स्वैप करके आक्रामक रूप से सेटिंग करें। vm.swappiness को 100 पर सेट करें। फिर, एक स्क्रिप्ट चलाएं जो सभी उपलब्ध मेमोरी को आवंटित करता है और कर्नेल को स्वैपिंग शुरू करने के लिए मजबूर करता है:

    # swapon [--discard] /dev/sda2
    # echo 3 > /proc/sys/vm/drop_caches
    # echo 100 > /proc/sys/vm/swappiness
    # ./fill-up-memory.up
    

    स्क्रिप्ट 32GB भौतिक मेमोरी + 2GB स्वैप पार्टीशन के साथ सर्वर पर चलती है और मेमोरी में ~ 33.8GB ऑब्जेक्ट बनाती है, जो सभी मेमोरी को भरने और स्वैप करने के लिए पर्याप्त है। यह एक स्क्रिप्ट का एक उदाहरण है जो इस व्यवहार को प्राप्त करता है:

    #!/usr/bin/python
    
    mem = 33.8
    testing = 'A' * int(1024 * 1024 * 1024 * mem)
    raw_input()
    
  3. स्वैप सामग्री की जाँच करें : " स्वैप -s" दिखाता है कि स्वैप मेमोरी का 100% उपयोग किया जाता है। "Hdparm --read- सेक्टर" का उपयोग करके मैं स्वैप विभाजन क्षेत्रों की कच्ची सामग्री की जांच करता हूं और सभी बाइट्स "A14" वर्णक्रम के लिए संबंधित हेक्साडेसिमल नोटेशन "4141" पर सेट होते हैं, सब कुछ अपेक्षित रूप से काम करता है। यह स्वैप-विभाजन की सामग्री को सेक्टर-दर-सेक्टर पढ़ने के लिए एक उदाहरण स्क्रिप्ट है:

    #!/bin/bash
    
    for sector in `seq 194560 4100095` ; do
        hdparm --read-sector $sector /dev/sda
    done
    

नोट: आप अदला-बदली, cfdisk, आदि का उपयोग करके स्वैप विभाजन का आरंभ / अंत क्षेत्र प्राप्त कर सकते हैं।

जब मैं स्क्रिप्ट को रोक देता हूं तो यह स्वैप मेमोरी सहित सभी मेमोरी को रिलीज़ करता है, "स्वैप -s" सिस्टम में कोई स्वैप उपयोग नहीं करता है। इस बिंदु पर, यह उम्मीद की जाती है कि लिनक्स पृष्ठभूमि में स्वैप विभाजन की सामग्री को छोड़ना शुरू कर देता है, लेकिन यह काम नहीं करता है , सेक्टरों की सामग्री अभी भी "4141" है, यहां तक ​​कि कई घंटे बाद भी।

मैंने कई परीक्षण किए हैं और ऐसा लगता है कि swapon()सिस्टम कॉल का उपयोग करते हुए विभाजन को सक्षम करने पर ही लिनक्स पूरी तरह से छूट देता है , लेकिन पृष्ठभूमि में कभी नहीं, हालांकि "त्यागें" माउंट विकल्प / etc / fstab पर सक्षम है।

आगे का अनुसंधान: blkdev_issue_discard () अंतर्निहित SSD उपकरणों को TRIM कमांड भेजने का प्रभारी कर्नेल फ़ंक्शन है, इस फ़ंक्शन पर दो अद्वितीय संदर्भ हैं mm/swapfile.c:

  • discard_swap() इसे स्वेपन () प्रक्रिया के दौरान कहा जाता है, यदि "त्यागें" माउंट विकल्प सक्षम है तो यह सभी सामग्री को हटा देता है, यह अपेक्षित रूप से काम करता है।
  • discard_swap_cluster() इसे क्लस्टर स्वैप की सामग्री को छोड़ देना चाहिए, लेकिन ऐसा लगता है कि यह कभी भी TRIM कमांड नहीं करता है।

प्रश्न: स्वैप + एसएसडी उपकरणों पर लिनक्स का अपेक्षित व्यवहार क्या है? यह सभी मुक्त क्षेत्रों / पृष्ठों को छोड़ देना चाहिए या बूट अप प्रक्रिया के दौरान विभाजन सक्षम होने पर केवल प्रारंभिक पूर्ण-विच्छेद जारी करना चाहिए? धन्यवाद।


4
क्या बात है? रैम सस्ती है, क्योंकि आप अपने सर्वर में 32 बड़े लोगों को पर्याप्त रूप से साबित कर रहे हैं। स्वैप बंद करें, कुछ उपयोगी के लिए अपने SSD का उपयोग करें, और बिटफ़्रीक करना बंद करें।
टॉम ओ'कॉनर

3
स्वैप को उन सर्वरों पर अक्षम नहीं किया जा सकता है और उनके पास एक अद्वितीय SSD डिस्क है, पारंपरिक HDD पर स्वैप विभाजन को होस्ट करने का कोई विकल्प नहीं है। मुझे पता है कि एसएसडी डिस्क पर स्वैप डालना सबसे अच्छा विकल्प नहीं है, लेकिन मैं सोच रहा था कि क्या मैं स्वैप के विभाजन पर समान "त्याग" ext4 व्यवहार को प्राप्त कर सकता हूं, ताकि डिस्क प्रदर्शन में यथासंभव सुधार हो सके।
संतसिज

2
यह वास्तव में समयपूर्व अनुकूलन के एक मामले की तरह लगता है।
मिकीबी

"टिप्पणियां केवल 5 मिनट के लिए संपादित की जा सकती हैं" - मुझे काम पर रहते हुए एसएफ पर सही काम करता है .... जैसा कि मैं कह रहा था; @ मायकेबी दरअसल, मैं इस पर पढ़ रहा हूं। विकिपीडिया लेख में कुछ ऐसा उल्लेख किया गया था जिसके बारे में मुझे जानकारी नहीं थी। "फ्लैश मेमोरी के संचालन की प्रकृति के कारण, डेटा को सीधे अधिलेखित नहीं किया जा सकता है क्योंकि यह हार्ड डिस्क ड्राइव में हो सकता है।" तो यह समझ में आता है कि स्वैप में पहले इस्तेमाल किए गए ब्लॉक खाली हो जाएंगे .... लेकिन क्या वे "0000" जैसे दिखेंगे जब santisaez स्वैप सामग्री की जांच करेगा?
सिग्नल 15

यह सब ऑपरेटिंग सिस्टम के नीचे एक परत पर होता है। जहां तक ​​ओएस का संबंध है, एक ब्लॉक पर डेटा तब तक होता है जब तक कि इसे दोबारा नहीं लिखा जाता है। रीड-एरेस-राइट साइकिल को संभालना ड्राइव की जिम्मेदारी है।
मिकीबी

जवाबों:


1

ऐसा लगता है कि त्याग_स्वैप_क्लस्टर केवल स्कैन_स्वैप_मैप से कहा जाता है जो बदले में get_swap_page या get_swap_page_of_type से कहा जाता है । इसलिए यदि मैं सही हूं, तो केवल एक नया स्वैप पृष्ठ आवंटित होने जा रहा है, तब त्याग नहीं होता है जब पृष्ठ मुक्त नहीं होता है।


यह एक बग की तरह लगता है।
कास्परड

2
यह बग नहीं हो सकता है। इस तरह से linux एक के बाद एक करके कई पेजों को एक साथ छोड़ सकता है।
लव

1

यह हो सकता है कि आपका सिस्टम --discard=onceडिफ़ॉल्ट हो। क्या आपने एक विशिष्ट त्याग विकल्प के साथ बढ़ते की कोशिश की है?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

और इस तरह मजबूर:

# swapon --discard=pages /dev/sda2

यदि आप fstrimपहले से ही उपलब्ध हैं, तो आप एक सेवा बनाने या इसे कॉन्फ़िगर करने का प्रयास कर सकते हैं ।


-1

जब मैं स्क्रिप्ट को रोक देता हूं तो यह स्वैप मेमोरी सहित सभी मेमोरी को रिलीज़ करता है, "स्वैप -s" सिस्टम में कोई स्वैप उपयोग नहीं करता है। इस बिंदु पर, यह उम्मीद की जाती है कि लिनक्स पृष्ठभूमि में स्वैप विभाजन की सामग्री को छोड़ना शुरू कर देता है, लेकिन यह काम नहीं करता है , सेक्टरों की सामग्री अभी भी "4141" है, यहां तक ​​कि कई घंटे बाद भी।

स्वैप की सामग्री को प्रभावी रूप से 'त्याग दिया' जाता है, जब swapon -sरिटर्न "कोई स्वैप का उपयोग नहीं किया जाता है।" सिस्टम ब्लॉक की सामग्री (भरा हुआ w / "4141") को अधिलेखित नहीं करने जा रहा है, क्योंकि यह एक एसएसडी है और अत्यधिक लेखन के जीवन को छोटा कर देगा। एसएसडी। (कम से कम, यही मैं प्रलेखन से दूर ले जाता हूं)


5
यदि discardमाउंट विकल्प का उपयोग किया जाता है, तो TRD कमांड को SSD डिस्क पर लिखने के प्रवर्धन मुद्दे से बचने के लिए अंतर्निहित सॉलिड-स्टेट ड्राइव पर भेजा जाना चाहिए । कम से कम, यह वह तरीका है जिसमें अन्य फाइल सिस्टम, जैसे ext4।
संताइज़ेज़

स्पष्ट होने के लिए, यह वास्तव में उस hdparm कमांड के साथ केवल शून्य पढ़ने में परिणाम देगा, लेकिन केवल SSD के कचरा संग्रहकर्ता को चलाने का मौका मिलने के बाद ..
हाफगाकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.