Abysmal जनरल dm-crypt (LUKS) प्रदर्शन लिखते हैं


21

मैं एक समस्या की जांच कर रहा हूं जहां एक ब्लॉक डिवाइस को एन्क्रिप्ट करना, इसे लिखते समय एक विशाल प्रदर्शन जुर्माना लगाता है। इंटरनेट पढ़ने और प्रयोगों के घंटों ने मुझे उचित समझ प्रदान नहीं की, अकेले समाधान दें।

संक्षेप में प्रश्न: ब्लॉक डिवाइस (~ 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/cryptoSystem1 के लिए: http://pastebin.com/QUSGMfiS
  • cryptsetup benchmarkSystem1 के लिए: 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 वॉल्यूम में रखने से मदद नहीं मिली।

प्रत्येक परीक्षण से पहले डिस्क कैश को साफ़ करना गति के लिए संभावित कारण के रूप में इसे समाप्त कर देगा (648MB / s वर्तमान में अस्वीकार्य है, राम के बाहर)
Xen2050

जवाबों:


18

जवाब (जैसा कि मुझे अब पता है): संगामिति

संक्षेप में : मेरा अनुक्रमिक लेखन , या तो ddफ़ाइल का उपयोग करते समय या (जैसे ... दैनिक उपयोग में), छद्म-यादृच्छिक लेखन (खराब) बन जाता है, क्योंकि चार सूत्र समवर्ती के बाद ब्लॉक डिवाइस पर एन्क्रिप्टेड डेटा लिखने पर समवर्ती रूप से काम कर रहे हैं। एन्क्रिप्शन (अच्छा)।

शमन ("पुराने" गुठली के लिए)

इस तरह IO अनुसूचक कतार में कतारबद्ध अनुरोधों की मात्रा बढ़ाकर नकारात्मक प्रभाव को कम किया जा सकता है:

echo 4096 | sudo tee /sys/block/sdc/queue/nr_requests

मेरे मामले में यह लगभग ट्रिपल (~ 56 एमबी / एस) मेरे प्रश्न में समझाया गया 4 जीबी यादृच्छिक डेटा परीक्षण के लिए थ्रूपुट है। बेशक, प्रदर्शन अब भी अनियंत्रित IO की तुलना में 100MB / s कम है।

जाँच पड़ताल

मल्टीकोर blktrace

मैंने आगे समस्याग्रस्त परिदृश्य की जांच की, जिसमें एक एलआरयूएस एन्क्रिप्टेड ब्लॉक डिवाइस के शीर्ष पर एक btrfs रखा गया है। मुझे दिखाने के लिए कि वास्तविक ब्लॉक डिवाइस को क्या निर्देश जारी किए गए हैं, मैं blktraceइस तरह का उपयोग करता हूं :

sudo blktrace -a write -d /dev/sdc -o - | blkparse -b 1 -i - | grep -w D

यह क्या है (जहां तक ​​मैं समझने में सक्षम था) IO अनुरोध का पता लगाने के लिए /dev/sdcजो कि " लिखें " के हैं, फिर इसे मानव पठनीय आउटपुट पर पार्स करें लेकिन आउटपुट को कार्रवाई " डी " तक सीमित रखें , जो (अनुसार man blkparse) है " मैं चालक को जारी किया गया "।

परिणाम कुछ इस प्रकार था ( मल्टीकोर लॉग के आउटपुट की लगभग 5000 लाइनें देखें ):

8,32   0    32732   127.148240056     3  D   W 38036976 + 240 [ksoftirqd/0]
8,32   0    32734   127.149958221     3  D   W 38038176 + 240 [ksoftirqd/0]
8,32   0    32736   127.160257521     3  D   W 38038416 + 240 [ksoftirqd/0]
8,32   1    30264   127.186905632    13  D   W 35712032 + 240 [ksoftirqd/1]
8,32   1    30266   127.196561599    13  D   W 35712272 + 240 [ksoftirqd/1]
8,32   1    30268   127.209431760    13  D   W 35713872 + 240 [ksoftirqd/1]
  • कॉलम 1: ब्लॉक डिवाइस का प्रमुख, छोटा
  • कॉलम 2: सीपीयू आईडी
  • कॉलम 3: अनुक्रम संख्या
  • कॉलम 4: टाइम स्टैम्प
  • कॉलम 5: प्रक्रिया आईडी
  • कॉलम 6: कार्रवाई
  • कॉलम 7: आरडब्ल्यूबीएस डेटा (प्रकार, क्षेत्र, लंबाई)

यह उत्पादित आउटपुट का एक स्निप है, जबकि dd'माउंटेड फाइलसिस्टम पर 4GB रैंडम डेटा का अंतर्ग्रहण करता है। यह स्पष्ट है कि कम से कम दो प्रक्रियाएं शामिल हैं। शेष लॉग दिखाता है कि सभी चार प्रोसेसर वास्तव में इस पर काम कर रहे हैं। अफसोस की बात है कि, अब लिखने का अनुरोध नहीं किया जाता है। जबकि सीपीयू 0 38038416 वें क्षेत्र के आसपास कहीं लिख रहा है, सीपीयू 1, जो बाद में अनुसूचित है, 35713872 वें क्षेत्र के आसपास कहीं लिख रहा है। यह बुरी बात है।

अकेला कोर blktrace

मैंने मल्टी-थ्रेडिंग को अक्षम करने और अपने सीपीयू के दूसरे कोर को अक्षम करने के बाद एक ही प्रयोग किया। बेशक, केवल एक प्रोसेसर स्टिक लिखने में शामिल है। लेकिन इससे भी महत्वपूर्ण बात यह है कि, लिखित अनुरोध ठीक से अनुक्रमिक है, यही कारण है कि अन्यथा पूर्ण सेटअप में ~ 170MB / s का पूर्ण लेखन प्रदर्शन प्राप्त होता है।

सिंगलकोर लॉग में आउटपुट की लगभग 5000 लाइनों पर एक नज़र डालें ।

विचार-विमर्श

अब जब मैं इसका कारण और उचित Google खोज शब्द जानता हूं, तो इस समस्या के बारे में जानकारी सतह तक बुदबुदा रही है। जैसा कि यह पता चला है, मैं नोटिस करने वाला पहला व्यक्ति नहीं हूं।

वर्तमान कर्नेल में निर्धारित (> = 4.0.2)

क्योंकि मैंने (बाद में) कर्नेल को इस सटीक समस्या पर स्पष्ट रूप से लक्षित पाया , मैं एक अद्यतन कर्नेल आज़माना चाहता था। [खुद इसे संकलित करने और फिर यह पहले से ही पता लगाने के बाद debian/sid] यह पता चला है कि समस्या वास्तव में ठीक हो गई है। मुझे पता नहीं है कि सटीक कर्नेल रिलीज़ जिसमें फिक्स दिखाई दिया था, लेकिन मूल प्रतिबद्धता किसी को भी रुचि देने के लिए सुराग देगी।

रिकार्ड के लिए:

$ uname -a
Linux t440p 4.0.0-1-amd64 #1 SMP Debian 4.0.2-1 (2015-05-11) x86_64 GNU/Linux
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test bs=1M conv=fsync
4294967296 bytes (4.3 GB) copied, 29.7559 s, 144 MB/s

मिकुलेस पटोका के लिए एक टोपी टिप, जिसने प्रतिबद्ध किया।


1
मैं कर्ल के साथ luks पर btrfs का उपयोग कर रहा हूँ 4.12.12 और मंदी अभी भी है!
ब्रालिओबो

आप क्यों कहते हैं कि मंदी अभी भी है? आप किस संदर्भ का उपयोग कर रहे हैं ताकि आपको मंदी का अनुभव न हो? आपका सेटअप क्या है क्या आपने केवल LUKS को हटाते समय ड्राइव के प्रदर्शन की जाँच की?
schlimmchen


1
अब मैं समझता हूं कि आप "मंदी" का अनुभव करने के बारे में क्यों लिखेंगे। हालांकि, आपकी समस्या केवल इस एक से संबंधित है, यह निश्चित रूप से एक ही मुद्दा नहीं है (कम प्रदर्शन बनाम लैगिंग)। मैं इन कष्टप्रद हिकअप का भी अनुभव करता हूं, इसलिए मैं बहुत आभारी हूं कि आपने यहां अपना मुद्दा बताया! एलयूकेएस का उपयोग नहीं करना एक विकल्प नहीं है, लेकिन यह जानना अच्छा है कि यह कारण से संबंधित है।
schlimmchen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.