2012-03-04 4 views
39

पर डिस्क I/O कैश को शुद्ध करने के लिए मुझे इसे अधिक अनुमानित बेंचमार्किंग के लिए करने की आवश्यकता है।लिनक्स

+0

'सिंक' ऐसा नहीं कर रहा है? – imm

+5

'सिंक' फ़्लशिंग है, शुद्ध नहीं है। – Tino

उत्तर

39

लगता है जैसे आप sync कमांड, या sync() फ़ंक्शन चाहते हैं।

आप डिस्क कैश फ्लशिंग चाहते हैं: echo 3 | sudo tee /proc/sys/vm/drop_caches

+6

'सिंक' 100% असंबंधित है। मैं लंबे समय तक रहने वाले बहु-जीबी पढ़ने वाले कैशों के बारे में बात कर रहा हूं, छोटे-छोटे अवांछित डेटा की छोटी मात्रा में नहीं, जो 'सिंक' के साथ सौदों (और जो हर 10 या तो सेकंड में डिस्क पर लिखा जाता है)। – taw

+7

आप डिस्क कैश के बारे में बात कर रहे हैं? 'Echo 3' आज़माएं सुडो टी/proc/sys/vm/drop_caches' –

+0

मैं आपकी टिप्पणी स्वीकार करूंगा, लेकिन यह संभव नहीं है। – taw

1

अनमाउंट और फिर से बढ़ते परीक्षण के अंतर्गत डिस्क सभी कैश और बफ़र्स रीसेट कर देगा।

+2

हमेशा नहीं। उदाहरण: 'माउंट/dev/sda1/mnt', अब उस विभाजन को खोलने के लिए '/ dev/sda' देखें (कृपया अनुपलब्ध' 1') देखें, फिर '/ mnt' के अंतर्गत एक फ़ाइल को बदलें। आप देख सकते हैं कि यह '/ dev/sda' में दिखाई नहीं देता है क्योंकि यह विभिन्न कैश का उपयोग करता है। 'umount/mnt' उस मामले में मदद नहीं करता है, क्योंकि यह'/dev/sda' को प्रभावित नहीं करता है, यहां तक ​​कि यह भौतिक रूप से एक ही ड्राइव है। – Tino

23

आप इस तरह यह कर सकते हैं:

# synC# (move data, modified through FS -> HDD cache) + flush HDD cache 
# echo 3 > /proc/sys/vm/drop_caches # (slab + pagecache) -> HDD (https://www.kernel.org/doc/Documentation/sysctl/vm.txt) 
# blockdev --flushbufs /dev/sda 
# hdparm -F /dev/sda 

# NEXT COMMAND IS NOT FOR BENCHMARKING: 
# should be run before unplug, flushes everything possible guaranteed. 
# echo 1 > /sys/block/sdX/device/delete 

आप देखेंगे कि ये तीन अलग अलग syscalls

भी कर रहे हैं देखने के लिए strace उपयोग कर सकते हैं, यह hdparm का उपयोग कर HDD कैश बंद करने के लिए वांछनीय, यकीन नहीं किया जा सकता है आप क्या बेंचमार्किंग करते हैं।

किसी भी तरह से, आप हाल ही में उपयोग किए गए डेटा के पिछले 64/32/16 एमबी को कैश करने के लिए एचडीडी को रोक नहीं सकते हैं। उस कैश को मारने के लिए, बस कुछ मात्रा में शून्य (और फ्लश) लिखें + एचडीडी से कुछ असंबंधित जगह पढ़ें। यह आवश्यक है क्योंकि कैश को रीड-पार्ट और राइट-पार्ट में विभाजित किया जा सकता है। उसके बाद आप एचडीडी बेंचमार्क कर सकते हैं।

+1

+1 'blockdev' वही था जो मैं ढूंढ रहा था। – Tino

+3

'blockdev --flushbufs/dev/sda' मेरे यूएसबी ड्राइव के साथ काम करता है, लेकिन इसका एसएटीए एसएसडी ड्राइव के साथ कोई प्रभाव नहीं पड़ता है। 'echo 3 | सुडो टी/proc/sys/vm/drop_caches' दोनों ड्राइव के साथ काम करता है। –

+0

अंतिम आदेश कर्नेल से डिस्क को हटा देता है। आप निश्चित रूप से डिस्क को बेंचमार्क करने में सक्षम नहीं होंगे (या किसी भी तरह से डिस्क का उपयोग करें) और यदि डिस्क उपयोग में है तो यह खतरनाक है। अन्य आदेशों के साथ इसे शामिल करने का कोई कारण नहीं है। यहां इस आदेश का उपयोग करने के लिए एक उदाहरण दिया गया है और यह क्या करता है: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Online_Storage_Reconfiguration_Guide/removing_devices.html – ndemou

17

डिस्क कैश शुद्धिकरण: echo 3 | sudo tee /proc/sys/vm/drop_caches

कमान प्रलेखन: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

इस के लिए लेखन गिरी, स्मृति से साफ कैश, dentries और inodes ड्रॉप करने कि स्मृति के कारण मुक्त बनने के लिए कारण होगा।

मुक्त पेजकैश करने के लिए

:

echo 1 > /proc/sys/vm/drop_caches

मुक्त dentries और inodes करने के लिए:

echo 2 > /proc/sys/vm/drop_caches

मुक्त पेजकैश, dentries और inodes करने के लिए:

echo 3 > /proc/sys/vm/drop_caches

चूंकि यह एक विनाशकारी ऑपरेशन है, और गंदे वस्तुएं मुक्त नहीं हैं, उपयोगकर्ता को यह सुनिश्चित करने के लिए पहले "सिंक" चलाया जाना चाहिए कि सभी कैश किए गए ऑब्जेक्ट मुक्त हो जाएं।

3

लघु काफी अच्छा जवाब: (कॉपी पेस्ट अनुकूल)

DISK=/dev/sdX # <===ADJUST THIS=== 
sync 
echo 3 > /proc/sys/vm/drop_caches 
blockdev --flushbufs $DISK 
hdparm -F $DISK 

स्पष्टीकरण:

sync: फ्लश फाइल सिस्टम बफ़र्स: आदमी पृष्ठ से। सेना को ब्लॉक में डिस्क बदल दिया, सुपर ब्लॉक अद्यतन करें।

echo 3 > /proc/sys/vm/drop_cache: [के लिए] फ्लश बफ़र्स कॉल ब्लॉक युक्ति ioctls: आदमी पेज से: from the kernel docsइस कर्नेल साफ कैश

blockdev --flushbufs /dev/sda ड्रॉप करने का कारण होगा।

hdparm -F /dev/sda: आदमी पेज से: पर ड्राइव लिखने कैश बफर फ्लश (पुराने ड्राइव में यह लागू नहीं हो सकता है)

हालांकि blockdev और hdparm आदेशों an answer above के अनुसार इसी तरह वे करने के लिए विभिन्न ioctls जारी देखो उपकरण।

लांग शायद बेहतर तरीका:

(मैं मान लेंगे कि आप डिस्क स्वरूपित है, लेकिन आप इन आदेशों अनुकूलन अगर आप डिस्क को सीधे लिखना चाहते हैं कर सकते हैं) यह केवल एक बार

भागो इससे पहले 1 बेंचमार्क:

:

MOUNT=/mnt/test # <===ADJUST THIS=== 
dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16 

भागो इस हर बार जब आप कैश खाली करने के लिए चाहते हैं

जब आप पूरा कर लें तो इसे चलाएं।

MOUNT=/mnt/test # <===ADJUST THIS=== 
rm $MOUNT/temp-hddread.tmp 

स्पष्टीकरण:

HDD एच/डब्ल्यू कैश कि ऊपर बताए गए आदेशों से साफ़ नहीं किया जाएगा हो सकता है। मैं छद्म-यादृच्छिक डेटा को कचरे से भरने के लिए लिख रहा हूं और पढ़ रहा हूं। एचडीडी कैश कितना बड़ा हो सकता है इस पर निर्भर करता है कि कितना डेटा हो सकता है। मैं/dev/urandom का उपयोग कर रहा हूं क्योंकि यह तेज़ है और हमें सच यादृच्छिकता की परवाह नहीं है। मैं शुरुआत से/mnt/test/temp-hddread.tmp बना रहा हूं और हर बार जब मैं पर्याप्त यादृच्छिक डेटा पढ़ना चाहता हूं इसका उपयोग करता हूं। मैं हर बार/mnt/test/temp-hddwrite.tmp बना रहा हूं और हटा रहा हूं, जब भी मैं पर्याप्त यादृच्छिक डेटा लिखना चाहता हूं।

क्रेडिट

मैं मौजूदा जवाब में से सबसे अच्छा भागों के आधार पर यह जवाब लिखा है।