बहुत अधिक CPU और डिस्क का उपयोग करने से टार को रोकना (पुराना लैपटॉप क्रैश होने पर 100%)


15

मैं 1 टेराबाइट डेटा का बाहरी डिस्क पर बैकअप लेना चाहता हूं।

मैं इस कमांड का उपयोग कर रहा हूं: tar cf /media/MYDISK/backup.tar mydata

समस्या: मेरा खराब लैपटॉप जमा हो जाता है और जब भी मैं 100% सीपीयू या 100% डिस्क का उपयोग करता हूं (यदि आप इस बारे में प्रतिक्रिया देना चाहते हैं तो यहां क्लिक करें ) । इसलिए मैं लगभग 50% सीपीयू और 50% डिस्क अधिकतम पर रहना चाहता हूं।

मेरा सवाल: सीपीयू और डिस्क को tarकमांड के साथ कैसे थ्रोट करना है ?

Rsync में एक --bwlimit विकल्प है, लेकिन मैं एक संग्रह चाहता हूं क्योंकि 1) कई छोटी फाइलें हैं 2) मैं एक पेड़ के बजाय एक ही फाइल का प्रबंधन करना पसंद करता हूं। इसलिए मैं उपयोग करता हूं tar


1
इस तरह के विशाल टारबॉल बनाने के लिए एक चतुर विचार क्या है: DDD 'अच्छा' कमांड के बारे में क्या?
जिरिब

1
@JiriXichtkniha: nice100% CPU उपयोग को नहीं रोकेगा
निकोलस राउल

जवाबों:


22

आप pvएक पाइप की बैंडविड्थ को थ्रॉटल करने के लिए उपयोग कर सकते हैं । चूंकि आपका उपयोग मामला जोरदार आईओ-बाउंड है, इसलिए पाइप के माध्यम से जाने वाले अतिरिक्त सीपीयू ओवरहेड को ध्यान देने योग्य नहीं होना चाहिए, और आपको किसी भी सीपीयू थ्रॉटलिंग को करने की आवश्यकता नहीं है।

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar

1
इससे भी बेहतर कि मैं क्या उम्मीद कर रहा था! मैं IO को 5mb / सेकंड तक सीमित कर रहा हूं और CPU 13% पर रहता है (लगता है कि एन्क्रिप्शन चल रहा है)।
निकोलस राउल

1
बहुत अच्छा!। हो सकता है कि प्रगति पट्टी को खत्म करने के लिए -q ध्वज की भी सिफारिश करें।
sababgab

इतनी बड़ी आज्ञा !!! यदि आपके पास अपने डेबियन / उबंटू में नहीं है, तो बस चलाएं apt-get install pv। मैं इसके बाद `-b` जोड़ने की सलाह देता हूं -L 1m: इस तरह एक वृद्धिशील बाइट काउंटर मुद्रित किया जाएगा, हर सेकंड अपडेट किया जाएगा। इस तरह से आप जानते हैं कि अब तक कितने बाइट्स लिखे गए हैं
ल्यूकफेररियो

कृपया यह भी ध्यान दें कि यदि आप आउटपुट को कंप्रेस करते हैं ( tar czfइसके बजाय का उपयोग करते हैं tar cf) तो सीमा संपीडित आउटपुट को संदर्भित करती है (इसलिए -L 1mआपके डिस्क राइट के साथ 1 एमबी / एस से अधिक नहीं होगा .... लेकिन आपकी डिस्क रीड शायद 1 एमबी / एस के बीच होगी। और 5 एमबी / एस, आपकी सामग्री के प्रकार पर निर्भर करता है)
लूकाफेरो जूल

महान चाल! जब xz के साथ संपीड़ित होता है, तो मैं पहले pv के माध्यम से और फिर xz के माध्यम से पाइप करता हूं।
जीन-बर्नार्ड जानसन

8

आप cpulimit टूल की कोशिश कर सकते हैं जो CPU प्रतिशत को सीमित करता है। यह एक मानक उपकरण नहीं है, इसलिए आपको इसे स्थापित करना होगा। यहाँ README का एक त्वरित अंश है:

"Cpulimit एक उपकरण है जो एक प्रक्रिया के CPU उपयोग को सीमित करने का प्रयास करता है (प्रतिशत में व्यक्त किया जाता है, CPU समय में नहीं)। [...] प्रयुक्त CPU राशि का नियंत्रण SIGSTOP और SIGCONT POSIX संकेतों को प्रक्रियाओं को भेजने के लिए किया जाता है। बच्चों की प्रक्रिया और निर्दिष्ट प्रक्रिया के धागे CPU के समान प्रतिशत को साझा करेंगे। "

फिर मैं IO के उपयोग को सीमित करने के लिए आयनिस की सिफारिश करूंगा, हालांकि यह समवर्ती पहुंच है जो सीमित होगी, अधिकतम थ्रूपुट नहीं ... कभी-कभी-यहां इसका उपयोग कैसे करें:

ionice -c 3 <your_command>

महान! ऐसा लगता है जैसे cpulimit वही है जिसकी मुझे तलाश थी।
निकोलस राउल

2

आपको वास्तव में कम चलाने की प्रक्रिया नहीं मिल सकती है । आप niceइसे कम प्राथमिकता देने के लिए उपयोग कर सकते हैं , लेकिन यह अन्य प्रक्रियाओं के संबंध में है। सीपीयू कूलर को चलाने का तरीका जब एक प्रक्रिया चलती है usleep(3)तो प्रक्रिया को रन स्टेट से बाहर निकालने के लिए एक निश्चित समय के लिए tarउपयोग करना होता है, लेकिन इसमें पैचिंग LD_PRELOADफ़ंक्शन को शामिल करना या तंत्र का tarउपयोग करना होगा जो बहुत अधिक उपयोग करता है (जैसे fopen(3))।

मुझे संदेह है कि आपके सबसे अच्छे वर्कअराउंड वे हार्डवेयर हैं जिनका आपने सुपरयूज़र पर उल्लेख किया है: लैपटॉप को ठंडा रखना और / या सीपीयू घड़ी को कम करना।

एक कष्टप्रद लेकिन संभवतः व्यवहार्य वर्कअराउंड (एक कीचड़, वास्तव में) एक 'स्थूल' स्तर पर काम करता है। tarहर 200 मीटर में 100 मीटर रन बनाने के बजाय , आप इसे हर दो में से एक सेकेंड रन बना सकते हैं। नोट: यह एक भयानक, भयानक कीचड़ है। लेकिन हे, यह भी काम कर सकते हैं!

tar cjf some-file.tar.bz2 /some-directory &
while true; do
    sleep 1  # Let it run for a second
    kill -STOP $! 2>/dev/null || break
    sleep 1  # Pause it for a second
    kill -CONT $! 2>/dev/null || break
done

पहला sleepसोते समय को समायोजित करता है, दूसरा एक रनटाइम को समायोजित करता है। जैसा कि अब यह खड़ा है, इसे 50% शुल्क चक्र मिला है। तापमान को नीचे रखने के लिए, आपको संभवतः ड्यूटी चक्र को 25% या उससे कम करने की आवश्यकता होगी (1 सेकंड रन, 3 सेकंड की नींद = हर 4 सेकंड में से = 25% कर्तव्य चक्र)। शेल कमांड sleep, आंशिक समय ले सकता है, वैसे। तो आप भी कह सकते थे sleep 0.1। यह सुनिश्चित करने के लिए इसे केवल 0.001 से अधिक रखें, और यह न भूलें कि स्क्रिप्ट निष्पादन समय के साथ भी जुड़ जाता है।


+1 अच्छा विचार! मुझे लगता है कि यह cpulimit उपकरण Huygens के समान है।
निकोलस राउल

Huuygens के टूल को छोड़कर ज्यादा बेहतर और व्यावहारिक है, यही वजह है कि उस उत्तर को मेरा अपना +1 मिला। :)
अलेक्सियो

0

सीपीयू को सीमित करने का एक अधिक सामान्य उद्देश्य तरीका उपयोग करना है /sys। ऐसा लगता है कि आप वैसे भी क्या चाहते हैं क्योंकि इसके अलावा अन्य चीजें tarकम्प्यूटेशनल रूप से महंगे कार्यों को करने में सक्षम हैं, बस इसके लिए आप tarइसे सबसे अधिक देख रहे हैं।

ऐसा करने का तरीका है:

  1. करने के लिए जाना /sys/devices/system/cpu/cpuX/cpufreqआपके सीपीयू से प्रत्येक के लिए (की जगह cpuXप्रत्येक सीपीयू के साथ)।
  2. फिर फ़ाइल scaling_available_frequenciesमें देखें कि आपका सीपीयू किस आवृत्तियों का समर्थन करता है।
  3. एक आवृत्ति चुनें (1234567 कहते हैं) और करते हैं echo 1234567 > scaling_max_freq

यह सीपीयू को निर्दिष्ट आवृत्ति से ऊपर जाने से रोकेगा।


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