संकट
मैं लिनक्स पर एक SSD डिस्क के भीतर एक स्वैप विभाजन पर पृष्ठभूमि TRIM संचालन को सक्षम करना चाहता हूं । कई लेख, जैसे के अनुसार इस एक , कर्नेल इस विन्यास का पता लगाता है और स्वचालित रूप से अलग कर दें संचालन करता है, लेकिन मेरे परीक्षणों पर है कि यह काम नहीं कर रहा है, हालांकि "छोड़ें" माउंट विकल्प इस व्यवहार के लिए मजबूर किया जाता है लगता है।
परिदृश्य
- डेबियन व्हीज़ी लिनक्स 3.2.0 चला रहा है
- एसएसडी डिस्क: 1 एक्स 120 जीबी ओसीजेड वेरटेक्स 3 एमआई
- 2GB स्वैप "प्लेन" विभाजन, w / o अन्य परतें (LVM, RAID, आदि)
पृष्ठभूमि
अगर मैं TRIM स्वैप विभाजन पर काम कर रहा हूं तो ये कदम मैं जांच कर रहा हूं:
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
स्वैप को भरें : विभाजन को माउंट करें, सभी वीएम कैश को साफ करें और लिनक्स को स्वैप करके आक्रामक रूप से सेटिंग करें। 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()
स्वैप सामग्री की जाँच करें : " स्वैप -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 कमांड नहीं करता है।
प्रश्न: स्वैप + एसएसडी उपकरणों पर लिनक्स का अपेक्षित व्यवहार क्या है? यह सभी मुक्त क्षेत्रों / पृष्ठों को छोड़ देना चाहिए या बूट अप प्रक्रिया के दौरान विभाजन सक्षम होने पर केवल प्रारंभिक पूर्ण-विच्छेद जारी करना चाहिए? धन्यवाद।