एनएफएस खराब लेखन प्रदर्शन


20

मेरे पास 10Gbit ईथरनेट से जुड़ी दो मशीनें हैं। बता दें कि इनमें से एक एनएफएस सर्वर है और दूसरा एनएफएस क्लाइंट होगा।

टीसीपी पर नेटवर्क की गति परीक्षण iperf~ दोनों दिशाओं में ~ 9.8 Gbit / s थ्रूपुट दिखाता है, इसलिए नेटवर्क ठीक है।

NFS सर्वर के डिस्क प्रदर्शन का परीक्षण:

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

परिणाम ~ 150 एमबीटी / एस है, इसलिए डिस्क लेखन के लिए ठीक काम करती है।

सर्वर का /etc/exportsहै:

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

ग्राहक /mnt/testनिम्नलिखित विकल्पों के साथ यह साझा करने के लिए स्थानीय है :

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

यदि मैं एनएफएस शेयर से क्लाइंट मशीन पर एक बड़ी फ़ाइल (~ 5 जीबी) डाउनलोड करने का प्रयास करता हूं, तो मुझे ~ 130-140 एमबीटी / एस का प्रदर्शन मिलता है जो सर्वर के स्थानीय डिस्क प्रदर्शन के करीब है, इसलिए यह संतोषजनक है।

लेकिन जब मैं NFS शेयर में एक बड़ी फ़ाइल अपलोड करने की कोशिश करता हूं, तो अपलोड ~ 1.5 Mbytes / s से शुरू होता है, धीरे-धीरे 18-20 Mbytes / s तक बढ़ जाता है और बढ़ना बंद हो जाता है। कभी-कभी अपलोड शुरू होने से पहले कुछ मिनट के लिए शेयर "हैंग" हो जाता है, अर्थात मेजबानों के बीच ट्रैफ़िक शून्य के करीब हो जाता है और यदि मैं निष्पादित ls /mnt/testकरता हूं , तो यह एक या दो मिनट के दौरान वापस नहीं आता है। फिर lsकमांड रिटर्न और अपलोड शुरू होता है यह प्रारंभिक 1.5Mbit / s गति है।

जब अपलोड की गति अधिकतम हो जाती है (18-20 Mbytes / s), मैं दौड़ता हूं iptraf-ngऔर यह नेटवर्क इंटरफेस पर ~ 190 Mbit / s ट्रैफिक दिखाता है, इसलिए नेटवर्क यहां अड़चन नहीं है, साथ ही सर्वर की HDD भी है।

मैंने क्या कोशिश की:

1. तीसरे होस्ट पर एक एनएफएस सर्वर सेट करें जो केवल 100Mbit ईथरनेट एनआईसी के साथ जुड़ा हुआ था। परिणाम अनुरूप हैं: DL अच्छा प्रदर्शन और लगभग पूर्ण 100Mbit नेटवर्क उपयोग दिखाता है, अपलोड प्रति सेकंड सैकड़ों किलोबाइट से अधिक तेजी से प्रदर्शन नहीं करता है, जिससे नेटवर्क उपयोग बहुत कम हो जाता है (2.5 Mbit / s तदनुसार iptraf-ng)।

2. मैंने कुछ एनएफएस मापदंडों को ट्यून करने की कोशिश की:

  • sync या async

  • noatime

  • नहीं hard

  • rsizeऔर wsizeमेरे उदाहरणों में अधिकतम हैं, इसलिए मैंने उन्हें कई चरणों में घटाकर 8192 करने की कोशिश की

3. मैंने क्लाइंट और सर्वर मशीनों को स्विच करने की कोशिश की (पूर्व क्लाइंट पर एनएफएस सर्वर स्थापित करें और इसके विपरीत)। इसके अलावा, एक ही कॉन्फ़िगरेशन के साथ छह और सर्वर हैं, इसलिए मैंने उन्हें विभिन्न रूपों में एक-दूसरे को माउंट करने की कोशिश की। एक ही परिणाम।

4. MTU = 9000, MTU = 9000 और 802.3ad लिंक एकत्रीकरण, MTU = 1500 के साथ लिंक एकत्रीकरण।

5. sysctl ट्यूनिंग:

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

एक ही परिणाम।

6. लोकलहोस्ट से माउंट:

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

और यहां मुझे एक ही परिणाम मिलता है: से डाउनलोड /mnt/testmount/तेज़ है, अपलोड करना /mnt/testmount/बहुत धीमा है, 22 एमबीटी / एस से अधिक तेज़ नहीं है और वास्तव में स्थानांतरण शुरू होने से पहले थोड़ी देरी है। क्या इसका मतलब यह है कि नेटवर्क स्टैक त्रुटिपूर्ण रूप से काम करता है और समस्या एनएफएस में है?

यह सब मदद नहीं करता था, परिणाम डिफ़ॉल्ट कॉन्फ़िगरेशन से काफी भिन्न नहीं थे। echo 3 > /proc/sys/vm/drop_cachesसभी परीक्षणों से पहले निष्पादित किया गया था।

सभी 3 मेजबानों पर सभी एनआईसीई का एमटीयू 1500 है, कोई भी गैर-मानक नेटवर्क ट्यूनिंग नहीं करता है। ईथरनेट स्विच डेल एमएक्सएल 10/40 जीबी है।

ओएस CentOS 7 है।

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

मुझे कौन सी सेटिंग याद आ रही है? NFS को जल्दी और बिना लटके कैसे लिखें?


1
आपके पास एक बहुत अच्छी तरह से गोल परीक्षण का मामला है, लेकिन मैं स्वयं सर्वर पर बढ़ते हुए और वहां से लिखने की कोशिश करूंगा, इस तरह से आप यह पता लगा सकते हैं कि एनएफएस स्टैक या नेटवर्किंग स्टैक गलती पर है या नहीं। इसके अलावा, सर्वर और क्लाइंट (क्लाइंट से निर्यात, सर्वर पर माउंट) को स्विच करने का प्रयास करें और साथ ही, एक अलग क्लाइंट का पूरी तरह से उपयोग करें। सर्वर / क्लाइंट प्रक्रियाओं को स्ट्रेच करने से कुछ भी प्रकट नहीं हुआ?
Dalibor Karlović

@ DaliborKarlović मैंने स्ट्रेस को छोड़कर सभी की कोशिश की और सवाल में जानकारी जोड़ी। लोकलहोस्ट से माउंट धीमा काम करता है, इसलिए नेटवर्किंग स्टैक और स्विच गलती से नहीं लगता है। मैं कर्नेल-स्पेस एनएफएस का उपयोग करता हूं और Operation not permittedएनएफएस प्रक्रिया के लिए स्ट्रेस संलग्न करने का प्रयास करता हूं ।
सेर्गेई

मुझे लगता है कि इसका मतलब है कि आप नेटवर्किंग स्टैक को पूरी तरह से हटा सकते हैं (लेकिन आपको यह सुनिश्चित करने के लिए स्ट्रेस संलग्न करना होगा)। यदि आप एक निश्चित बग से नहीं टकराते हैं तो आपको रूट उपयोगकर्ता के रूप में किसी भी प्रक्रिया को स्ट्रेस करने में सक्षम होना चाहिए ।
दलिबोर कार्लोवी

@ DaliborKarlović निश्चित रूप से मैं रूट के रूप में स्ट्रेस की कोशिश करता हूं। मैं किसी भी यूजरस्पेस प्रक्रिया से जुड़ने में सक्षम हूं, लेकिन कर्नेलस्पेस नहीं। लेकिन इसकी आउटपुट से मुझे क्या जानकारी मिल सकती है? मुझे लगता है कि अगर मैं इसे एनएफएस से जोड़ दूं और अपलोड करना शुरू कर दूं तो यह हजारों हजारों लाइनों का उत्पादन करेगा। क्या मुझे नॉनज़रो रिटर्न वैल्यू पर ध्यान देना चाहिए?
सर्गेई

आप सही हैं, मैं इसके बारे में नहीं सोच रहा था कि यह एक गैर-उपयोगकर्ता प्रक्रिया है। मैं यह देखने की उम्मीद करूंगा कि हस्तांतरण की शुरुआत में यह "लटके" रहने के दौरान क्या कर रहा था, यह कुछ गलत हो सकता है जैसे कि एक गलत अनुलोम विलोम डीएनएस लुकअप।
Dalibor Karlović

जवाबों:


3

आप अपने निर्यात विवरण में सिंक-विकल्प का उपयोग करें। इसका मतलब यह है कि सर्वर केवल डिस्क पर लिखे जाने के बाद लिखने के संचालन की पुष्टि करता है। यह देखते हुए कि आपके पास एक कताई डिस्क है (अर्थात कोई SSD नहीं है), इसके लिए औसत रूप से प्रति लेखन डिस्क पर कम से कम 1/2 क्रांति की आवश्यकता होती है, जो मंदी का कारण है।

Async सेटिंग का उपयोग करते हुए, सर्वर तुरंत प्रोसेस होने पर क्लाइंट को राइट-ऑपरेशन को स्वीकार करता है लेकिन डिस्क पर अभी तक नहीं लिखा है। यह थोड़ा अधिक अविश्वसनीय है, उदाहरण के लिए, बिजली की विफलता के मामले में जब क्लाइंट को एक ऑपरेशन के लिए एक बिल्ली मिली जो कि नहीं हुई। हालाँकि, यह लेखन-प्रदर्शन में भारी वृद्धि प्रदान करता है।

(संपादित करें) मैंने अभी देखा कि आपने पहले ही विकल्प को सिंक बनाम सिंक का परीक्षण कर लिया है। हालाँकि, मुझे लगभग यकीन है कि यह आपके प्रदर्शन में गिरावट का कारण है - मैंने एक बार एक idencitcal सेटअप के साथ बिल्कुल वैसा ही संकेत दिया था। शायद आप इसे फिर से परखें। क्या आपने सर्वर के निर्यात विवरण में और क्लाइंट में माउंट ऑपरेशन में एक ही समय में एसिंक्स विकल्प दिया था?


+1 सबसे संभावित स्पष्टीकरण यह है कि सिंक सही ढंग से अक्षम नहीं था।
डेविड श्वार्ट्ज

2

यह पैकेट के आकार और विलंबता से संबंधित समस्या हो सकती है। निम्नलिखित आज़माएँ:

रिपोर्ट आपके परिणामों को वापस करती है।


मैंने MTU = 9000 के साथ जंबो फ्रेम की कोशिश की, लेकिन परिणाम समान थे। मैंने 802.3ad के साथ लिंक एकत्रीकरण की भी कोशिश की, फिर से कोई बदलाव नहीं हुआ। इसलिए मैंने इन सभी सेटिंग्स को यथासंभव डिफ़ॉल्ट स्थिति के करीब लाने के लिए वापस कर दिया। इसके अलावा, मैंने उस net.core.*और net.ipv4.*sysctls को धुनने की कोशिश की , लेकिन शायद मैंने बहुत कम प्रयोग किए। ठीक है, मैं कुछ और परीक्षण करूँगा और रिपोर्ट करूँगा।
सेर्गी

मैंने सर्वर और क्लाइंट दोनों पर sysctls को ट्यून करने के लिए एक बार और प्रयास किया, लेकिन इससे कोई मदद नहीं मिली।
सेर्गेई

क्या आपने यूडीपी के साथ परिवहन प्रोटोकॉल के रूप में प्रयास किया है?
शोडांशोक

मैंने UDP (माउंट विकल्पों में प्रोटो = udp) की कोशिश की है, लेकिन यह टीसीपी की तुलना में 1-2 एमबीटी / एस धीमा भी काम करता है। रिजल्ट लोकलहोस्ट से और रिमोट होस्ट से समान बढ़ते थे।
सेर्गेई

2

http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

हार्डवेयर RAID के साथ सिस्टम पर लिनक्स अनुसूचक को कॉन्फ़िगर करना और [cfq] से [noop] तक डिफ़ॉल्ट को बदलना I / O सुधार देता है।

रीड / राइट के प्रतिशत की गणना करने के लिए nfsstat कमांड का उपयोग करें। मैच के लिए RAID नियंत्रक कैश अनुपात सेट करें।

भारी कार्यभार के लिए आपको एनएफएस सर्वर थ्रेड्स की संख्या बढ़ाने की आवश्यकता होगी।

No_delay विकल्प का उपयोग करके डिस्क में देरी के बिना लिखने के लिए nfs थ्रेड्स कॉन्फ़िगर करें।

लिनक्स कर्नेल को जितनी जल्दी हो सके फ्लश करने के लिए कहें ताकि लिखी गई चीजों को यथासंभव छोटा रखा जाए। लिनक्स कर्नेल में, गंदे पृष्ठ राइटबैक आवृत्ति को दो मापदंडों द्वारा नियंत्रित किया जा सकता है।

तेज डिस्क लिखने के लिए, फाइलसिस्टम डेटा = जर्नल विकल्प का उपयोग करें और अपडेट को फाइल करने के समय को रोकने के लिए जो डिस्क में लिखे गए अतिरिक्त डेटा के परिणामस्वरूप होता है। यह मोड सबसे तेज़ होता है जब डेटा को उसी समय पढ़ने और लिखने के लिए डिस्क से लिखना पड़ता है जहां यह अन्य सभी मोड से बेहतर प्रदर्शन करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.