विशाल निर्देशिका का तेज़ rsync जो परिवर्तित नहीं किया गया था


13

हम बैकअप सर्वर के लिए rsync का उपयोग करते हैं।

दुर्भाग्य से कुछ सर्वरों का नेटवर्क धीमा है।

Rsync का पता लगाने में पाँच मिनट तक का समय लगता है, क्योंकि विशाल निर्देशिकाओं में कुछ भी नहीं बदला है। इन विशाल निर्देशिका पेड़ों में बहुत सारी छोटी फाइलें (लगभग 80k फाइलें) हैं।

मुझे लगता है कि rsync क्लाइंट प्रत्येक 80k फ़ाइलों के लिए डेटा भेजता है।

चूंकि नेटवर्क धीमा है, इसलिए मैं प्रत्येक फ़ाइल के बारे में 80k गुना जानकारी भेजने से बचना चाहूंगा।

क्या एक उप निर्देशिका पेड़ के हैश-योग बनाने के लिए rsync को बताने का एक तरीका है?

इस तरह rsync क्लाइंट विशाल निर्देशिका ट्री के लिए केवल कुछ बाइट्स भेजेगा।

अपडेट करें

अब तक मेरी रणनीति का उपयोग करना है rsync। लेकिन अगर एक अलग उपकरण यहां बेहतर तरीके से फिट होता है, तो मैं स्विच करने में सक्षम हूं। दोनों (सर्वर और क्लाइंट) मेरे नियंत्रण में हैं।

Update2

एक निर्देशिका ट्री में 80k फाइलें हैं । प्रत्येक एकल निर्देशिका में 2k से अधिक फाइलें या उप-निर्देशिकाएं नहीं होती हैं

Update3

नेटवर्क की सुस्ती पर विवरण:

time ssh einswp 'cd attachments/200 && ls -lLR' >/tmp/list
real    0m2.645s

Tmp / list file का आकार: 2MByte

time scp einswp:/tmp/list tmp/
real    0m2.821s

निष्कर्ष: scp की गति समान है (कोई आश्चर्य नहीं)

time scp einswp:tmp/100MB tmp/
real    1m24.049s

गति: 1.2MB / s


1
आप zsync पर पढ़ सकते हैं। मैंने खुद इसका उपयोग नहीं किया है, लेकिन जो मैंने पढ़ा है, वह सर्वर साइड पर मेटाडेटा को पूर्व-प्रदान करता है और हो सकता है कि आपके मामले में स्थानांतरण को गति दे। यह वैसे भी परीक्षण के लायक हो सकता है। इसके अलावा, केवल एक अन्य समाधान जिसके बारे में मुझे पता है, वह है वास्तविक समय ब्लॉक स्तर समकालिकता जो कुछ सैन / एनएएस समाधानों के साथ आता है।
एरोन

जवाबों:


36

कुछ असंबंधित बिंदु:

80K बहुत सारी फाइल्स है।

एक निर्देशिका में 80,000 फाइलें? कोई भी ऑपरेटिंग सिस्टम या ऐप उस स्थिति को डिफ़ॉल्ट रूप से अच्छी तरह से हैंडल नहीं करता है। आपको बस rsync के साथ इस समस्या पर ध्यान देना होगा।

अपने rsync संस्करण की जाँच करें

आधुनिक rsync अतीत की तुलना में बड़ी निर्देशिकाओं को बहुत बेहतर तरीके से संभालता है। सुनिश्चित करें कि आप नवीनतम संस्करण का उपयोग कर रहे हैं।

यहां तक ​​कि पुरानी rsync उच्च विलंबता लिंक पर काफी अच्छी तरह से बड़ी निर्देशिकाओं को संभालती है ... लेकिन 80k फाइलें बड़ी नहीं हैं ... यह बहुत बड़ा है!

उस ने कहा, rsync की मेमोरी का उपयोग सीधे एक पेड़ में फ़ाइलों की संख्या के लिए आनुपातिक है। बड़ी निर्देशिका बड़ी मात्रा में रैम लेती है। सुस्ती दोनों तरफ रैम की कमी के कारण हो सकती है। मेमोरी का उपयोग करते समय एक परीक्षण चलाएं। लिनक्स किसी भी लेफ्ट-ओवर रैम का उपयोग डिस्क कैश के रूप में करता है, इसलिए यदि आप रैम पर कम चल रहे हैं, तो डिस्क कैशिंग कम है। यदि आप रैम से बाहर निकलते हैं और सिस्टम स्वैप का उपयोग करना शुरू कर देता है, तो प्रदर्शन वास्तव में खराब होगा।

सुनिश्चित करें कि - जाँच का उपयोग नहीं किया जा रहा है

--checksum(या -c) प्रत्येक फ़ाइल के प्रत्येक ब्लॉक को पढ़ने की आवश्यकता होती है। आप शायद केवल संशोधन समय (इनोड में संग्रहीत) को पढ़ने के डिफ़ॉल्ट व्यवहार से प्राप्त कर सकते हैं।

छोटे बैचों में नौकरी विभाजित करें।

गिगासुन्क जैसी कुछ परियोजनाएँ हैं जो "डायरेक्टरी ट्री को पुनर्जीवित करने के लिए पर्ल का उपयोग करके वर्कलोड को चोप करेंगे, rsync के साथ ट्रांसफर करने के लिए फ़ाइलों की स्मालिश सूचियों का निर्माण करेंगे।"

अतिरिक्त निर्देशिका स्कैन ओवरहेड की एक बड़ी मात्रा होने जा रही है, लेकिन शायद यह एक शुद्ध जीत होगी।

इस स्थिति के लिए OS डिफॉल्ट नहीं किए जाते हैं।

यदि आप सभी चूक के साथ लिनक्स / फ्रीबीएसडी / आदि का उपयोग कर रहे हैं, तो प्रदर्शन आपके सभी अनुप्रयोगों के लिए भयानक होगा। डिफॉल्ट छोटे निर्देशिकाओं को मान लेते हैं, ताकि ओवरसाइज़ किए गए कैश पर रैम बर्बाद न करें।

अपने फाइल सिस्टम को बड़ी निर्देशिकाओं को बेहतर ढंग से संभालने के लिए ट्यून करें: क्या बड़े फ़ोल्डर का आकार IO के प्रदर्शन को धीमा कर देता है?

"नाम कैश" देखें

बीएसडी जैसे ऑपरेटिंग सिस्टम में एक कैश होता है जो एक नाम को इनोड ("नामी" कैश ") की तलाश में तेजी लाता है। प्रत्येक निर्देशिका के लिए एक नामी कैश है। यदि यह बहुत छोटा है, तो यह अनुकूलन से अधिक बाधा है। चूंकि rsync प्रत्येक फ़ाइल पर एक lstat () कर रहा है, प्रत्येक 80k फ़ाइलों के लिए इनोड एक्सेस किया जा रहा है। यह आपके कैश को उड़ा सकता है। अपने सिस्टम पर फ़ाइल निर्देशिका प्रदर्शन को ट्यून करने के लिए अनुसंधान करें।

एक अलग फाइल सिस्टम पर विचार करें

XFS को बड़ी निर्देशिकाओं को संभालने के लिए डिज़ाइन किया गया था। एक ही डायरेक्टरी में बड़ी संख्या में फाइलसिस्टम देखें

शायद 5 मिनट सबसे अच्छा आप कर सकते हैं।

गणना करने पर विचार करें कि कितने डिस्क ब्लॉक पढ़े जा रहे हैं, और गणना करें कि आपको कितनी तेजी से उम्मीद करनी चाहिए कि हार्डवेयर कई ब्लॉक को पढ़ सकता है।

हो सकता है कि आपकी उम्मीदें बहुत अधिक हों। विचार करें कि कितने डिस्क ब्लॉक को बिना किसी परिवर्तित फ़ाइलों के साथ rsync करने के लिए पढ़ा जाना चाहिए: प्रत्येक सर्वर को निर्देशिका को पढ़ने और प्रति फ़ाइल एक इनोड को पढ़ने की आवश्यकता होगी। मान लें कि कुछ भी कैश नहीं है क्योंकि, अच्छी तरह से, 80k फाइलों ने आपके कैश को उड़ा दिया है। मान लीजिए कि गणित को सरल रखने के लिए यह 80k ब्लॉक है। यह लगभग 40M डेटा है, जिसे कुछ सेकंड में पढ़ा जाना चाहिए। हालाँकि अगर प्रत्येक ब्लॉक के बीच डिस्क की तलाश होनी चाहिए, तो इसमें अधिक समय लग सकता है।

तो आपको लगभग 80,000 डिस्क ब्लॉक पढ़ने की आवश्यकता है। आपका हार्ड ड्राइव कितनी तेजी से ऐसा कर सकता है? यह देखते हुए कि यह यादृच्छिक I / O है, एक लंबा रेखीय पढ़ा नहीं गया, 5 मिनट बहुत उत्कृष्ट हो सकते हैं। यह 1 / (80000/600), या एक डिस्क हर 7.5ms पढ़ा है। क्या यह तेज या आपकी हार्ड ड्राइव के लिए धीमा है? यह मॉडल पर निर्भर करता है।

कुछ इसी तरह के खिलाफ बेंचमार्क

इसके बारे में सोचने का एक और तरीका यह है। यदि कोई फ़ाइल नहीं बदली गई है, तो ls -Llrडिस्क गतिविधि की समान मात्रा करता है लेकिन कभी भी कोई फ़ाइल डेटा (सिर्फ मेटाडेटा) नहीं पढ़ता है। ls -Llrचलने में लगने वाला समय आपकी ऊपरी सीमा है।

  • क्या rsync (कोई फाइल नहीं बदली गई) की तुलना में काफी धीमी है ls -Llr? फिर rsync के लिए आपके द्वारा उपयोग किए जा रहे विकल्पों में सुधार किया जा सकता है। शायद -cसक्षम या कुछ अन्य ध्वज है जो सिर्फ निर्देशिका और मेटाडेटा (इनोड डेटा) से अधिक पढ़ता है।

  • क्या rsync (कोई फ़ाइल नहीं बदली गई) लगभग उतनी ही तेज़ है ls -Llr? फिर आपने rsync को जितना हो सके उतना अच्छा बनाया है। आपको ओएस को ट्यून करना होगा, रैम जोड़ना होगा, तेज ड्राइव प्राप्त करना होगा, फाइल सिस्टम बदलना होगा आदि।

अपने देवों से बात करो

80k फाइलें सिर्फ खराब डिजाइन है। बहुत कम फ़ाइल सिस्टम और सिस्टम टूल इतनी बड़ी निर्देशिकाओं को बहुत अच्छी तरह से संभालते हैं। यदि फ़ाइल नाम abcdefg.txt हैं, तो उन्हें abdc / abcdefg.txt (पुनरावृत्ति पर ध्यान दें) में संग्रहीत करने पर विचार करें। यह निर्देशिकाओं को छोटे लोगों में तोड़ता है, लेकिन कोड में एक बड़े बदलाव की आवश्यकता नहीं होती है।

इसके अलावा .... एक डेटाबेस का उपयोग करने पर विचार करें। यदि आपके पास एक निर्देशिका में 80k फाइलें हैं, तो शायद आपके डेवलपर्स इस तथ्य के आसपास काम कर रहे हैं कि वे वास्तव में क्या चाहते हैं एक डेटाबेस है। बड़ी मात्रा में डेटा संग्रहीत करने के लिए MariaDB या MySQL या PostgreSQL एक बेहतर विकल्प होगा।

अरे, 5 मिनट में क्या हुआ है?

अंत में, क्या 5 मिनट वास्तव में इतना बुरा है? यदि आप दिन में एक बार इस बैकअप को चलाते हैं, तो 5 मिनट बहुत समय नहीं है। हां, मुझे गति पसंद है। हालांकि अगर 5 मिनट आपके ग्राहकों के लिए "काफी अच्छा" है, तो यह आपके लिए काफी अच्छा है। यदि आपके पास एक लिखित SLA नहीं है, तो अपने उपयोगकर्ताओं के साथ अनौपचारिक चर्चा के बारे में यह पता लगाने के लिए कि वे बैकअप लेने की कितनी जल्दी उम्मीद करते हैं।

मुझे लगता है कि अगर आपने प्रदर्शन में सुधार करने की आवश्यकता नहीं थी, तो आपने यह सवाल नहीं पूछा। हालांकि, यदि आपके ग्राहक 5 मिनट से खुश हैं, तो जीत की घोषणा करें और उन अन्य परियोजनाओं पर आगे बढ़ें जिन्हें आपके प्रयासों की आवश्यकता है।

अद्यतन: कुछ चर्चा के बाद हमने निर्धारित किया कि टोंटी नेटवर्क है। मैं कुछ चीजों की सिफारिश करने जा रहा हूँ इससे पहले कि मैं छोड़ दूं :-)।

  • संपीड़न के साथ पाइप से अधिक बैंडविड्थ को निचोड़ने का प्रयास करें। हालाँकि संपीड़न के लिए अधिक CPU की आवश्यकता होती है, इसलिए यदि आपका CPU अतिभारित है, तो यह प्रदर्शन को बदतर बना सकता है। साथ और बिना rsync की कोशिश करें -z, और बिना संपीड़न के साथ अपने ssh को कॉन्फ़िगर करें। समय सभी 4 संयोजनों को देखने के लिए कि उनमें से कोई भी दूसरों की तुलना में बेहतर प्रदर्शन करता है।
  • नेटवर्क ट्रैफ़िक देखें कि क्या कोई रुकावट है या नहीं। यदि रुके हुए हैं, तो आप पा सकते हैं कि उनके कारण क्या है और वहां अनुकूलन करें। यदि rsync हमेशा भेज रहा है, तो आप वास्तव में अपनी सीमा पर हैं। आपकी पसंद हैं:
    • एक तेज़ नेटवर्क
    • rsync के अलावा कुछ और
    • स्रोत और गंतव्य को एक साथ पास ले जाएं। यदि आप ऐसा नहीं कर सकते हैं, तो क्या आप एक स्थानीय मशीन पर rsync कर सकते हैं तो वास्तविक गंतव्य पर rsync? ऐसा करने के लिए लाभ हो सकते हैं यदि सिस्टम को प्रारंभिक rsync के दौरान डाउन करना पड़ता है।

80K बहुत सारी फाइलें हैं: एक निर्देशिका ट्री में 80k फाइलें हैं । प्रत्येक एकल निर्देशिका में 2k से अधिक फाइलें / उपनिर्देशिकाएं नहीं होती हैं।
गुएतली

अपने rsync संस्करण की जाँच करें: किया, सुनिश्चित करें कि - जाँच का उपयोग नहीं किया जा रहा है: किया गया। छोटे बैचों में काम को विभाजित करें: धन्यवाद, मैं गिगासकिन पर एक नज़र डालूंगा। इस स्थिति के लिए OS डिफॉल्ट नहीं किया जाता है: किया गया (टोंटी नेटवर्क OS नहीं है)। "नाम कैश" देखें: किया गया (यह नेट है, ओएस नहीं है)। एक अलग फ़ाइल सिस्टम पर विचार करें: फिर से नेट, ओएस नहीं। शायद 5 मिनट सबसे अच्छा आप कर सकते हैं। मुझे लगता है कि यह बहुत तेज हो सकता है। अपने देवों से बात करें (DB का उपयोग करें): यह एक विशाल बदलाव होगा। हो सकता है बेहतर बैकअप सपोर्ट वाला फाइल सिस्टम इसे हल कर दे।
गुएतली

प्रति निर्देशिका 2k फाइलें बहुत बेहतर है। अद्यतन करने के लिए धन्यवाद। आपने उल्लेख नहीं किया था कि नेटवर्क धीमा था। क्या यह कम बैंडविड्थ, उच्च विलंबता, या दोनों है? rsync आमतौर पर उच्च विलंबता लिंक पर अच्छा प्रदर्शन करता है (इसे अमेरिका में कंप्यूटर से निपटने के दौरान ऑस्ट्रेलिया से पीएचडी पर काम करने वाले किसी व्यक्ति द्वारा विकसित किया गया था)। कोशिश करें कि ss पर "ls -lLR" करें और परिणाम को प्रसारित करने में कितना समय लगता है। "टाइम ssh रिमोटहोस्ट 'cd / dest && ls -lLR'> / tmp / list"। सुनिश्चित करें कि स्थानीय होस्ट पर / tmp / सूची बनाई गई है।
टॉमऑनटाइम

हाँ नेटवर्क धीमा है। बड़े दुख की बात है।
गुत्थी

कितना धीमा? यदि आप 100M फ़ाइल की प्रतिलिपि बनाने के लिए "scp" का उपयोग करते हैं, तो कितना समय लगता है? इसके अलावा, "टाइम ssh रिमोटहोस्ट 'cd / dest && ls -lLR'> / tmp / list" का आउटपुट क्या है?
टॉमऑनटाइम

2

नहीं, यह rsync के साथ संभव नहीं है और यह एक और संबंध में काफी अक्षम होगा:

आम तौर पर, rsyncकेवल फ़ाइल संशोधन तिथियों और फ़ाइल आकारों की तुलना करता है। आपका दृष्टिकोण परिवर्तित निर्देशिकाओं को खोजने के लिए (स्थानीय और दूरस्थ प्रणाली पर) दो बार सभी फ़ाइलों की सामग्री को पढ़ने और जांच करने के लिए मजबूर करेगा ।


1
AFAIK rsync माइम और आकार की जाँच करता है। यदि दोनों मेल खाते हैं, तो फ़ाइल को फिर से स्थानांतरित नहीं किया जाता है (कम से कम डिफ़ॉल्ट सेटिंग्स में)। यह टुपल्स (फ़ाइल नाम, आकार, माइम) के हैश को भेजने के लिए पर्याप्त होगा। सामग्री को चेकसम करने की कोई आवश्यकता नहीं है।
गुफ्तगू

हाँ, आप सही हैं, लेकिन फिर भी, rsyncऐसा नहीं करता है।
स्वेन

2

बड़ी संख्या में फ़ाइलों (जहां थोड़ा बदल गया है) के सिंक्रनाइज़ेशन के लिए, यह noatimeस्रोत और गंतव्य विभाजन पर भी सेट करने योग्य है । यह प्रत्येक अपरिवर्तित फ़ाइल के लिए डिस्क पर लिखने का समय बचाता है।


हाँ, noatime विकल्प समझ में आता है। हम कई वर्षों से इसका उपयोग करते हैं। मुझे लगता है कि rsync के लिए एक विकल्प की आवश्यकता है।
गुएतली

2

आप lsyncd को भी आज़मा सकते हैं, जो केवल तब ही rsync होगा जब फ़ाइल सिस्टम पर परिवर्तन का पता लगाया जाता है और केवल परिवर्तित उपनिर्देशिकाएँ। मैं इसे एक सभ्य सर्वर पर दो मिलियन फ़ाइलों के साथ निर्देशिकाओं के लिए उपयोग कर रहा हूं।


1

लिस्टिंग / चेकसम प्रक्रिया को तेज करने के लिए सर्वर छोर पर डेमॉन मोड में rsync का उपयोग करें:

ध्यान दें कि यह एन्क्रिप्टेड नहीं है, लेकिन लिस्टिंग प्रदर्शन में सुधार खोए बिना इसे सुरंग बनाने में सक्षम हो सकता है।

इसके अलावा ss के बजाय rsync सम्पीडन करना प्रदर्शन में सुधार करना चाहिए।

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