ट्यूनिंग ZFS स्क्रबिंग, 15 दिनों के लिए 141KB / s चल रहा है


14

7.2k आरपीएम एसएएस डिस्क पर मिरर + स्ट्राइप पर चलने वाला एक बहुत ही बेसिक सिस्टम, विशेष रूप से लोड नहीं किया गया। सभी डेटासेट पर कोई कटौती, संपीडन नहीं। मृत घोंघा की गति पर 15 दिनों से स्क्रब चल रहा है। क्या कुछ अनुकूलन की आवश्यकता है, या यह कुछ दोषपूर्ण hw के कारण हो सकता है?

  • MD1200 बाड़े के साथ डेल R510।
  • 2x Xeon E5620
  • 48GB
  • NexentaStor 3.1.3, सामुदायिक संस्करण

कुछ जानकारी:

scan: scrub in progress since Mon Apr  1 19:00:05 2013
171G scanned out of 747G at 141K/s, 1187h40m to go
0 repaired, 22.84% done
config:

    NAME                       STATE     READ WRITE CKSUM
    tank                       ONLINE       0     0     0
      mirror-0                 ONLINE       0     0     0
        c7t5000C500414FB2CFd0  ONLINE       0     0     0
        c7t5000C500414FCA57d0  ONLINE       0     0     0
      mirror-1                 ONLINE       0     0     0
        c7t5000C500415C3B1Bd0  ONLINE       0     0     0
        c7t5000C500415C5E4Fd0  ONLINE       0     0     0
      mirror-2                 ONLINE       0     0     0
        c7t5000C500415DC797d0  ONLINE       0     0     0
        c7t5000C500415DC933d0  ONLINE       0     0     0
    logs
      c7t5000A7203006D81Ed0    ONLINE       0     0     0
    cache
      c7t5000A72030068545d0    ONLINE       0     0     0


# iostat -en     
---- errors --- 
s/w h/w trn tot device
0 8887   0 8887 c2t0d0
0   0   0   0 c0t395301D6B0C8069Ad0
0   0   0   0 c7t5000C500415DC933d0
0   0   0   0 c7t5000A72030068545d0
0   0   0   0 c7t5000C500415DC797d0
0   0   0   0 c7t5000C500414FCA57d0
0   0   0   0 c7t5000C500415C3B1Bd0
0   0   0   0 c7t5000C500415C5E4Fd0
0   0   0   0 c7t5000C500414FB2CFd0
0   0   0   0 c7t5000A7203006D81Ed0

जब भी मैं इसे चलाता हूं, स्पा_ब्लास्ट_ियो को बदल दिया जाता है

# echo "::walk spa | ::print spa_t spa_name spa_last_io spa_scrub_inflight" | mdb -k
spa_name = [ "syspool" ]
spa_last_io = 0x25661402
spa_scrub_inflight = 0
spa_name = [ "tank" ]
spa_last_io = 0x25661f84
spa_scrub_inflight = 0x21

हर 5 सेकंड में, लगभग 20-25 MB / s लिखा जाता है। लिखने वालों के बीच मूल रूप से कोई पढ़ता या लिखता नहीं है।

                          capacity     operations    bandwidth      latency
    pool                       alloc   free   read  write   read  write   read  write
    -------------------------  -----  -----  -----  -----  -----  -----  -----  -----
    syspool                     427G   501G      0      0      0      0   0.00   0.00
      c0t395301D6B0C8069Ad0s0   427G   501G      0      0      0      0   0.00   0.00
    -------------------------  -----  -----  -----  -----  -----  -----  -----  -----
    tank                        903G  1.84T    810  5.21K  1.50M  20.8M   9.42   4.71
      mirror                    301G   627G     22  1.00K  53.0K  3.96M   8.96   3.93
        c7t5000C500414FB2CFd0      -      -     20    244  50.1K  3.97M   6.70   1.14
        c7t5000C500414FCA57d0      -      -     19    242  48.2K  3.97M   7.60   1.12
      mirror                    301G   627G     25   1016  46.8K  4.10M  16.11   5.28
        c7t5000C500415C3B1Bd0      -      -     21    257  41.6K  4.11M   4.63   1.24
        c7t5000C500415C5E4Fd0      -      -     21    255  43.0K  4.11M  16.54   1.15
      mirror                    301G   627G     62    754   119K  3.03M  19.72   3.78
        c7t5000C500415DC797d0      -      -     57    219   114K  3.03M   9.99   1.15
        c7t5000C500415DC933d0      -      -     56    220   119K  3.03M  13.20   1.22
      c7t5000A7203006D81Ed0     260K  46.5G      0      0      0      0   0.00   0.00
    cache                          -      -      -      -      -      -
      c7t5000A72030068545d0    93.1G     8M      0      0      0      0   0.00   0.00
    -------------------------  -----  -----  -----  -----  -----  -----  -----  -----

क्या iostats मुझे बता रहे हैं कि मैं डिस्क के इंतजार में अधिक समय बिता रहा हूं, तो मुझे होना चाहिए? विशेष रूप से% b कॉलम

# iostat -xe
device    r/s    w/s   kr/s   kw/s wait actv  svc_t  %w  %b s/w h/w trn tot 
sd3       5.1   43.9   20.6  643.8  0.0  0.1    2.9   0   5   0   0   0   0 
sd4       9.4    1.8  141.1  169.6  0.0  0.0    0.5   0   0   0   0   0   0 
sd5       3.1   43.8   15.8  643.8  0.0  0.1    1.4   0   3   0   0   0   0 
sd6       5.2   38.1   14.3  494.4  0.0  0.1    3.0   0   7   0   0   0   0 
sd7       4.2   40.2   11.1  623.2  0.0  0.1    2.7   0   7   0   0   0   0 
sd8       3.6   44.3    9.7  623.2  0.0  0.1    1.5   0   4   0   0   0   0 
sd9       2.9   37.4    7.0  494.4  0.0  0.1    1.3   0   2   0   0   0   0 
sd10      0.7    0.4    3.4    0.0  0.0  0.0    0.0   0   0   0   0   0   0 

उच्च पक्ष पर एक विलंबता?

# zpool iostat 10 10
               capacity     operations    bandwidth      latency
pool        alloc   free   read  write   read  write   read  write
tank         909G  1.83T     86  2.82K   208K  12.7M  22.68  13.63
----------  -----  -----  -----  -----  -----  -----  -----  -----
tank         909G  1.83T     29    857  42.4K  3.50M  17.86   4.47
----------  -----  -----  -----  -----  -----  -----  -----  -----
tank         909G  1.83T     30    947  46.1K  3.54M  15.55   5.67

कुछ ट्विकिंग लागू की जिससे थोड़ा अंतर आया। zfs_top_maxinflight 127 पर सेट, zfs_scrub_delay से 0, और zfs_scan_idle से 0।

# echo zfs_top_maxinflight | mdb -k
zfs_top_maxinflight:
zfs_top_maxinflight:            127

# echo zfs_scrub_delay/D |mdb -k
zfs_scrub_delay:
zfs_scrub_delay:0

# echo zfs_scan_idle/D |mdb -k
zfs_scan_idle:
zfs_scan_idle:  0


 scan: scrub in progress since Wed Apr 17 20:47:23 2013
    1.85G scanned out of 918G at 1.14M/s, 229h36m to go
    0 repaired, 0.20% done

पूर्व mdb tweak, बल्कि उच्च b% कॉलम पर ध्यान दें

$ iostat -nx -M 5

  r/s    w/s   Mr/s   Mw/s wait actv wsvc_t asvc_t  %w  %b device
  0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c2t0d0
  0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c0t395301D6B0C8069Ad0
 35.2   44.2    0.3    0.7  0.0  0.4    0.0    5.3   0  32 c7t5000C500415DC933d0
 19.8    3.2    0.2    0.0  0.0  0.0    0.0    0.1   0   0 c7t5000A72030068545d0
 31.2   46.2    0.2    0.7  0.0  0.3    0.0    4.4   0  27 c7t5000C500415DC797d0
 30.6   46.8    0.2    0.8  0.0  0.4    0.0    4.6   0  28 c7t5000C500414FCA57d0
 37.6   53.0    0.3    0.8  0.0  0.4    0.0    4.7   0  33 c7t5000C500415C3B1Bd0
 37.6   53.6    0.3    0.8  0.0  0.5    0.0    5.6   0  39 c7t5000C500415C5E4Fd0
 33.2   46.8    0.3    0.8  0.0  0.5    0.0    6.1   0  33 c7t5000C500414FB2CFd0
  0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c7t5000A7203006D81Ed0

पोस्ट mdb tweak, व्यस्त प्रतीक्षा में बी% कॉलम, 80-85% समय पर ध्यान दें

$ iostat -nx -M 5 
  r/s    w/s   Mr/s   Mw/s wait actv wsvc_t asvc_t  %w  %b device
  0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c2t0d0
  0.2   27.2    0.0    0.3  0.0  1.0    0.0   35.4   0  18 c0t395301D6B0C8069Ad0
129.6   20.2    0.9    0.4  0.0  2.9    0.0   19.5   0  85 c7t5000C500415DC933d0
 48.4    4.0    0.4    0.0  0.0  0.0    0.0    0.1   0   1 c7t5000A72030068545d0
130.4   19.8    0.9    0.4  0.0  3.0    0.0   20.2   0  84 c7t5000C500415DC797d0
125.8   25.8    0.9    0.5  0.0  2.9    0.0   19.2   0  80 c7t5000C500414FCA57d0
131.2   24.2    0.9    0.5  0.0  3.1    0.0   20.3   0  83 c7t5000C500415C3B1Bd0
130.6   25.8    0.9    0.5  0.0  3.5    0.0   22.5   0  88 c7t5000C500415C5E4Fd0
126.8   28.0    0.9    0.5  0.0  2.8    0.0   18.0   0  79 c7t5000C500414FB2CFd0
  0.2    0.0    0.0    0.0  0.0  0.0    0.0    0.1   0   0 c7t5000A7203006D81Ed0

Iostat -XnE की कई घटनाएं grep त्रुटियाँ कहते हैं? क्या कुछ त्रुटि बढ़ जाती है?

सभी कॉलमों में शून्य
3molo

smartctl -A /dev/diskप्रत्येक ड्राइव के बारे में क्या कहता है (यह स्थापित करना पड़ सकता है smartctl, यह सुनिश्चित नहीं है कि यह आधार इंस्टॉल के साथ आता है)।
क्रिस एस

1
एक डिस्क पर "गैर-मध्यम त्रुटि गणना: 8071" के अलावा कुछ भी नहीं है। सभी डिस्क जेबीओडी (डेल एमडी 1200) में एक ही (सिंगल) sas लेन पर
बैठते हैं

जवाबों:


11

ZFS स्क्रब ऑपरेशन कुछ काफी दिमागी मृत सिद्धांतों पर काम करते हैं। सबसे विशेष रूप से, यह केवल समय रगड़ने में खर्च करता है जब कुछ और नहीं चल रहा होता है। यदि आप एक पूल को काफी निरंतर आधार पर बस थोड़ा सा डेटा एक्सेस देते हैं, तो स्क्रब प्रभावी रूप से खुद को भूखा रखेगा और लगभग कुछ भी नहीं करेगा।

यह पता लगाने के लिए कि यह क्या करता है पर मेरे त्वरित नोटों के साथ ट्यूनल्स (मैं आखिरी बार इस थोड़ी देर पहले देखा था, हालांकि):

  • zfs_scan_idle - यदि उपयोगकर्ता I / O इस कई घड़ी की टिक के भीतर होता है, तो देरी से I / O zfs_scrub_delay घड़ी टिक से
  • zfs_scrub_delay - zfs_scan_id द्वारा ट्रिगर किए जाने पर स्क्रब ऑपरेशन में देरी करने के लिए कितनी घड़ी टिक करती है
  • zfs_top_maxinflight - स्क्रब I / O प्रति शीर्ष-स्तरीय vdev की अधिकतम संख्या
  • zfs_scrub_limit - अधिकतम संख्या स्क्रब I / O प्रति पत्ती vdev
  • zfs_scan_min_time_ms - स्क्रब संचालन पर प्रति txg खर्च करने के लिए न्यूनतम एमएस
  • zfs_no_scrub_io - कोई नोट नहीं
  • zfs_no_scrub_prefetch - कोई नोट नहीं, नाम स्पष्ट रूप से स्क्रब ऑप्स पर प्रीफ़ैच का कारण नहीं बनता है

इन सभी को बदलने के लिए "इको [ट्यूनेबल] / W0t [संख्या]" का उपयोग कर मक्खी पर परिवर्तनशील है, और वर्तमान सेटिंग को देखने के लिए "इको [ट्यूनेबल] / डी" (जो मैं बदलने से पहले करने की सलाह देता हूं)।

इसलिए सिद्धांत रूप में, और सामान्य व्यवहार में, यदि आप कहते हैं, zfs_scan_idle को 10 में बदल दें (या 1 - या 0, यदि यह समर्थन करता है, तो कोड की जाँच करने की आवश्यकता होगी) और zfs_scrub_dayay को 1 (या 0, यदि नीचे करें) यह उस का समर्थन करता है), और यदि आपकी txg_synctime_ms सेटिंग 5000 या अधिक है तो शायद zfs_scan_min_time_ms को थोड़ा बदल दें, यह वास्तव में उपयोगकर्ता I / O के कुछ स्तर के साथ भी स्क्रब संचालन करने के बारे में बहुत अधिक आक्रामक हो जाना चाहिए।

आपके विशिष्ट मामले में,% b और asvc_t ने कुछ बहुत, बहुत ही बेतरतीब ढंग से पढ़े जाने वाले वर्कलोड की सूचना दी है (स्पिनिंग डिस्क को इससे बेहतर होना चाहिए अगर यह वास्तव में अनुक्रमिक है), और आपने पहले ही "आसान" सामान किया है जैसा कि ऊपर बताया गया है। । इसलिए, पहले मैं zfs_no_scrub_prefetch को चालू करूँगा, स्क्रब संचालन पर प्रीफ़ेट को अक्षम करने के लिए, बस यह देखने के लिए कि क्या मदद मिली। यदि कोई खुशी नहीं है, तो नेक्सेंटा के संस्करण पर निर्भर करता है - आप 30/5, 5/1 या 10/5 चला रहे हैं (यह वह शॉर्टहैंड है जो हम zfs_txg_timeout की सेटिंग के लिए उपयोग करते हैं और (zfs_txg-synctime_ms * 1000))। Zfs_txg_timeout को 10 और zfs_txg_synctime_ms को 5000 में बदलें, फिर zfs_scan_min_time_ms को 3000 या 4000 पर सेट करने का प्रयास करें। यह ZFS बताता है कि यह स्क्रब पर बहुत लंबा समय बिता सकता है, क्योंकि पुराने नेक्सेंटस्टोर इंस्टॉल की गई डिफ़ॉल्ट सेटिंग्स की तुलना में यह 5/1 के रूप में दोष का उपयोग करता है। सावधान,

उम्मीद है की यह मदद करेगा। सौभाग्य!


मुझे लगता है कि मुझे ध्यान देना चाहिए कि आप "इको <ट्यूनेबल> / W0t <नंबर> | mdb -kw" का उपयोग करके इन सेटिंग्स को बैश में संशोधित करते हैं। और आप "echo <tunable> / D | mdb -k" के साथ वर्तमान मान देखते हैं। मेरे नोट कहते हैं कि इन सभी को उड़ान में बदला जा सकता है, किसी को भी / आदि / प्रणाली संशोधन की आवश्यकता नहीं लगती है और प्रभावी होने के लिए रिबूट करना पड़ता है।
नेक्स

मुझे जवाब देने से पहले पूरे प्रश्न को भी पढ़ना चाहिए - और कॉन्फ्रेंस कॉल के दौरान सर्वरफॉल्ट को ब्राउज़ करना बंद कर देना चाहिए। :)
नेक्स

% B और asvc_t ने बहुत कुछ बताया, बहुत बेतरतीब ढंग से पढ़ा जाने वाला वर्कलोड चल रहा है (स्पिनिंग डिस्क को इससे बेहतर करना चाहिए अगर यह वास्तव में अनुक्रमिक है)। सबसे पहले मैं zfs_no_scrub_prefetch को चालू करूँगा, स्क्रब संचालन पर प्रीफ़ेट को अक्षम करने के लिए, बस यह देखने के लिए कि क्या यह मदद करता है। यदि कोई खुशी नहीं है, तो नेक्साएंटा के संस्करण के आधार पर - आप 30/5, 5/1 या 10/5 (zfs_txg_timeout & zfs_txg_synctime_ms * 1000) चला रहे हैं। zfs_txg_timeout को 10 तक और zfs_txg_synctime_ms को 5000 तक बदलें। ufs_scan_min_time_ms से 3000 या 4000 पर जाप करना। यह ZFS को बताता है कि यह स्क्रब पर बहुत अधिक समय बिता सकता है, सामान्य I / O!
नेक्स

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

2
अधिक ट्यूनिंग ने मदद की हो सकती है, लेकिन जरूरी नहीं। यह ध्यान रखना महत्वपूर्ण है कि डेटा संरचना के माध्यम से एक ZFS स्क्रब रोल करता है, डिस्क पर सेक्टर द्वारा नहीं। जो यह कहना है कि आपके डिस्क पर zfs डेटा संरचना कैसे दिखती है, इस पर निर्भर करते हुए, एक स्क्रब ऑपरेशन अविश्वसनीय रूप से यादृच्छिक लग सकता है - आपके डिस्क क्रमिक रीडिंग के 100 एमबी / एस में सक्षम हो सकते हैं, लेकिन पूरी तरह से यादृच्छिक रीड पूरी तरह से एक और कहानी होगी । औसत ब्लॉक आकार यहां भी मायने रखेगा।
नेक्स 7

3

मुझे हार्डवेयर पर शक है ...

आप इसे 15 दिनों तक क्यों चलने देंगे? वह सामान्य नहीं है। स्क्रब रोकें - zpool scrub -s tankऔर सिस्टम की जांच करें।

  • आप कौन से नियंत्रकों का उपयोग कर रहे हैं?
  • क्या यह पहला स्क्रब है जो आपने इस पूल पर चलाया है?
  • क्या कोई समस्या थी जिसने आपको पहली बार में स्क्रब चलाने के लिए प्रेरित किया?

1
LSI SAS9200-8e (आईटी फर्मवेयर)। पहले रंडी नहीं। नहीं, कोई वास्तविक समस्या नहीं है (लेकिन मैं थोड़ी देर के लिए अनुक्रमिक पढ़ने / लिखने के प्रदर्शन पर सवाल उठा रहा हूं)।
3molo

विलंबता और प्रतीक्षा समय के साथ अपडेट किया गया, संदेह करने के लिए शुरू होता है कि सेवा अनुरोधों के लिए हमेशा कुछ समय होता है और यह स्क्रब को इतना कम प्राथमिकता देता है कि यह रुक जाता है। किसी भी अंतर्दृष्टि बहुत मददगार है!
3molo

समय-समय पर चलाने के लिए स्क्रब महत्वपूर्ण हैं। जब तक आपको स्क्रब चलाने के लिए कोई समस्या न हो, तब तक प्रतीक्षा करना उस समस्या को डेटा हानि में उड़ाने के लिए कह रहा है। चुप डेटा भ्रष्टाचार (बिट्रोट) को पकड़ने के लिए स्क्रब हैं। एक धीमी गति से चलने वाला स्क्रब एक सिस्टम समस्या का संकेत नहीं है, बस एक पूल है जिसे पर्याप्त रूप से व्यस्त रखा गया है ताकि स्क्रब को गति न दें।
lschweiss

0

मेरा जवाब थोड़ा देर से आता है, लेकिन अगर इस तरह की बात किसी और के साथ होती है, तो यहां मेरा ध्यान इस पर है: बस "दोषपूर्ण" कोशिश करें। मेरे मामले में, मैं एक स्क्रब नहीं कर रहा था, लेकिन मैं डिस्क पर फ़ाइलों की प्रतिलिपि बना रहा था, और मैं स्पष्ट रूप से डिस्क को कुछ सेकंड के लिए सक्रिय होने की सुनवाई कर रहा था, फिर सभी लंबे समय तक रोक रहे थे, और फिर से काम कर रहे थे और इसी तरह। यह एक SATA नियंत्रक की विफलता के कारण था और dmesg ने मुझे सभी त्रुटियां दीं। मैंने सोचा था कि यह पहली बार में एक असफल डिस्क थी, लेकिन तब मुझे एहसास हुआ कि यह वास्तव में नियंत्रक था।


-3

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

इसलिए, यदि आपका प्रदर्शन धीमा रहा है, और ऐसा प्रतीत होता है, तो मैं इन संभावित कारणों के रूप में देखूंगा।


1
मुझे कोई संकेतक नहीं दिखता है कि कोई भी संसाधन दुर्लभ है।
3molo

1
यह बहुत अधिक पूरी तरह से गलत है। सीपीयू और रैम का स्क्रब ऑपरेशंस पर प्रभावी रूप से शून्य प्रभाव है (यह मानते हुए कि इसमें कोई मुफ्त है)। बहुत सारे फ्री रैम और सीपीयू होने से स्क्रब ऑपरेशंस 'स्पीड अप' नहीं होंगे। स्क्रब को आने वाले I / O को पूल में देखकर सीमित किया जाता है, न कि 'उपलब्ध सिस्टम डाउनटाइम' के लिए जाँच करके, जो कुछ भी है।
नेक्स 7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.