मैं एक समस्या की जांच कर रहा हूं जहां एक ब्लॉक डिवाइस को एन्क्रिप्ट करना, इसे लिखते समय एक विशाल प्रदर्शन जुर्माना लगाता है। इंटरनेट पढ़ने और प्रयोगों के घंटों ने मुझे उचित समझ प्रदान नहीं की, अकेले समाधान दें।
संक्षेप में प्रश्न: ब्लॉक डिवाइस (~ 170MB / s) पर एक btrfs डालते समय मुझे पूरी तरह से तेज लिखने की गति क्यों मिलती है, जबकि बीच-बीच में dm-crypt / LKSKS डालते समय लिखने की गति plummets (~ 20MB / s) फ़ाइल सिस्टम और ब्लॉक डिवाइस, हालांकि सिस्टम पर्याप्त रूप से उच्च एन्क्रिप्शन थ्रूपुट को बनाए रखने में सक्षम से अधिक है?
परिदृश्य
/home/schlimmchen/random
/dev/urandom
पहले से डेटा से भरी 4.0GB फ़ाइल है ।
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
इसे पढ़ना सुपर फास्ट है:
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 6.58036 s, 648 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 0.786102 s, 5.4 GB/s
(दूसरी बार, फ़ाइल स्पष्ट रूप से कैश से पढ़ी गई थी)।
अनियंत्रित btrfs
डिवाइस को सीधे btrfs (ब्लॉक डिवाइस पर कोई विभाजन तालिका) के साथ स्वरूपित किया जाता है।
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
लिखने की गति ~ 170MB / s जितनी अधिक हो जाती है:
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 27.1564 s, 157 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test2 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 25.1882 s, 169 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test3 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 29.8419 s, 143 MB/s
पढ़ें गति 200 एमबी / एस से ऊपर है।
$ dd if=/mnt/dd-test1 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.8265 s, 215 MB/s
$ dd if=/mnt/dd-test2 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.9821 s, 213 MB/s
$ dd if=/mnt/dd-test3 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.8561 s, 215 MB/s
ब्लॉक डिवाइस पर एन्क्रिप्टेड btrfs
डिवाइस को LUKS के साथ स्वरूपित किया गया है, और परिणामी डिवाइस को btrfs के साथ स्वरूपित किया गया है:
$ sudo cryptsetup luksFormat /dev/sdf
$ sudo cryptsetup luksOpen /dev/sdf crypt
$ sudo mkfs.btrfs /dev/mapper/crypt
$ sudo mount /dev/mapper/crypt /mnt
$ sudo chmod 777 /mnt
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 210.42 s, 20.3 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test2 bs=1M
4265841146 bytes (4.3 GB) copied, 207.402 s, 20.6 MB/s
पढ़ें गति केवल मामूली रूप से ग्रस्त है (यह सब क्यों होता है?):
$ dd if=/mnt/dd-test1 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 22.2002 s, 192 MB/s
$ dd if=/mnt/dd-test2 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 22.0794 s, 193 MB/s
luksDump: http://pastebin.com/i9VYRR0p
ब्लॉक डिवाइस पर btrfs पर फ़ाइल में एन्क्रिप्टेड btrfs
एन्क्रिप्टेड फ़ाइल में लिखते समय लिखने की गति "आसमान छूती" 150MB / से अधिक होती है। मैंने ब्लॉक डिवाइस पर एक btrfs डाला, एक 16GB फ़ाइल आवंटित की, जिसे मैंने lukfsFormat
एड किया और माउंट किया।
$ sudo mkfs.btrfs /dev/sdf -f
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
$ dd if=/dev/zero of=/mnt/crypted-file bs=1M count=16384 conv=fsync
17179869184 bytes (17 GB) copied, 100.534 s, 171 MB/s
$ sudo cryptsetup luksFormat /mnt/crypted-file
$ sudo cryptsetup luksOpen /mnt/crypted-file crypt
$ sudo mkfs.btrfs /dev/mapper/crypt
$ sudo mount /dev/mapper/crypt /tmp/nested/
$ dd if=/home/schlimmchen/Documents/random of=/tmp/nested/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 26.4524 s, 161 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/tmp/nested/dd-test2 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 27.5601 s, 155 MB/s
लेखन प्रदर्शन इस तरह क्यों बढ़ रहा है? फाइलसिस्टम और ब्लॉक उपकरणों के इस विशेष घोंसले के शिकार को उच्च लिखने की गति में सहायता करने के लिए क्या मिलता है?
सेट अप
समस्या एक ही डिस्ट्रो और कर्नेल को चलाने वाली दो प्रणालियों पर प्रतिलिपि प्रस्तुत करने योग्य है। हालाँकि, मैंने System2 पर कर्नेल 3.19.0 के साथ कम लिखने की गति भी देखी।
- डिवाइस: सैनडिस्क एक्सट्रीम 64GB USB3.0 USB स्टिक
- System1: इंटेल NUC 5i5RYH, i5-5250U (ब्रॉडवेल), 8GB रैम, सैमसंग 840 EVO 250GB SSD
- System2: लेनोवो T440p, i5-4300M (हैसवेल), 16GB RAM, Samsung 850 PRO 256GB SSD
- डिस्ट्रो / कर्नेल: डेबियन जेसी, 3.16.7
- cryptsetup: 1.6.6
/proc/crypto
System1 के लिए: http://pastebin.com/QUSGMfiScryptsetup benchmark
System1 के लिए: http://pastebin.com/4RxzPFeT- btrfs (-tools) संस्करण 3.17 है
lsblk -t /dev/sdf
: http://pastebin.com/nv49tYWc
विचार
- जहाँ तक मैं देख सकता हूँ, संरेखण कारण नहीं है। भले ही स्टिक का पृष्ठ आकार 16KiB हो, फिर भी cryptsetup पेलोड प्रारंभ 2MiB से जुड़ा हुआ है।
--allow-discards
(cryptsetup के luksOpen के लिए) ने मदद नहीं की, जैसा कि मुझे उम्मीद थी।- इसके साथ बहुत कम प्रयोग करते हुए, मैंने बाहरी हार्ड ड्राइव के साथ USB3.0 अडैप्टर के माध्यम से जुड़े समान व्यवहार को देखा।
- यह मुझे लगता है कि सिस्टम 64KiB ब्लॉक लिख रहा है। एक सिस्टमट्रैप स्क्रिप्ट मैंने कोशिश की है कि कम से कम इंगित करता है।
/sys/block/sdf/stat
इस परिकल्पना का समर्थन तब से किया जा रहा है जब तक कि बहुत सारे लेख विलीन नहीं हो जाते। इसलिए मेरा अनुमान है कि बहुत छोटे ब्लॉक में लिखना इसका कारण नहीं है। - ब्लॉक डिवाइस कतार अनुसूचक को NOOP में बदलने के साथ कोई भाग्य नहीं।
- क्रिप्ट को LVM वॉल्यूम में रखने से मदद नहीं मिली।