वेबसर्वर फ्रीजिंग के बिना बहुत बड़ी फ़ाइल हटाना


11

मेरे वेब सर्वर में (अपाचे चल रहा है, लिनक्स सेंटोस), एक बहुत बड़ी लॉग फ़ाइल ( 50 Gbyte ) है। इस वेब सर्वर के उत्पादन में कुछ वेब सेवाएँ हैं।

जब मैंने लॉग फ़ाइल को हटाने की कोशिश की, तो वेब सर्वर के पास 10 सेकंड के बारे में कोई प्रतिक्रिया नहीं थी। (सेवा का समय)

rm -f monthly.log

क्या बिना अपाचे फ्रीजिंग के इस बड़ी फ़ाइल को हटाने का कोई तरीका है?

जवाबों:


23

logrotateइस तरह से एक विन्यास का उपयोग करके इसे पहले घुमाएँ :

/path/to/the/log {
    missingok
    notifempty
    sharedscripts
    daily   
    rotate 7
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
    compress
}

तब घुमाई गई फ़ाइल को हटाने के लिए आधी रात को क्रॉन जॉब बनाएं:

30 2 * * * nice -n 19 ionice -c2 -n7 rm -f /path/to/the/log/file.1

क्या आप बता सकते हैं कि इसका क्या मतलब / है?
मावलवकर

1
आप नष्ट कर रहे हैं और 'आयनिंग' कर रहे हैं। अच्छा यकीनन किसी भी सीपीयू को रोकने के लिए इस्तेमाल किया जाता था, लेकिन यहां सबसे महत्वपूर्ण आयनिस है, जहां आप वास्तव में शेड्यूलर को कम प्राथमिकता के साथ फाइल को हटाने के लिए कह रहे हैं। -c कक्षा के लिए है, जहाँ 1 वास्तविक समय, 2 सामान्य और 3 निष्क्रिय है। कक्षा 2 के भीतर, आपके पास 0 से 7 (IRRC) है जहां 7 सबसे कम है। यदि वह अभी भी समस्याएं पैदा करता है, तो इसे 'आयनिस -c3' के साथ चलाएं और यह ठीक होना चाहिए।
गोलन

5

बड़ी फ़ाइलों को तेजी से हटाने के लिए, आप truncateकमांड का उपयोग कर सकते हैं - इसे शून्य के आकार में सिकोड़ने के लिए कहें और फिर इसे हटा दें:

 truncate -s 0  monthly.log && rm -f monthly.log

जैसा कि क्वांटा ने सिफारिश की थी, आपको पहले इसे लॉग इन करना होगा।


कैसे truncateअलग है >?
कोजिरो

हम्म अच्छा सवाल है। परिणाम समान है, लेकिन मेरे पास कोई जवाब नहीं है कि वे कार्यान्वयन में कैसे भिन्न हैं।
डैनियल टी।

की तुलना में truncateउपयोग करने के लिए आसान sudoहै >। इसके साथ भी आसान है find -exec
kubanczyk


3

मैं : > /path/to/monthly.logऑपरेशन के साथ फ़ाइल को छोटा / शून्य कर दूंगा । फिर संभवतः अपाचे प्रक्रिया को पुनरारंभ करें और भविष्य में ऐसा होने से रोकने के लिए लॉग रोटेशन स्थापित करें ...

यह अक्सर आता है, हालांकि:

देखें: क्या IO / लोड को बिना थके लिनक्स पर 100GB फ़ाइल को हटाने का एक तरीका है?

यूनिक्स में, एक विशाल लॉग फ़ाइल के आकार को कम करने का सबसे अच्छा तरीका क्या है जिसे सक्रिय रूप से लिखा जा रहा है?

लिनक्स सर्वर अंतरिक्ष से बाहर


की कोई आवश्यकता नहीं है :। आप बस कर सकते हैं> /path/to/monthly.log
kojiro

मुझे पता है कि यह एक है noop, लेकिन यह एक अनुदेशात्मक दृष्टिकोण से अधिक समझ में आता है।
इविविट

… लेकिन फिर कुछ भविष्य के प्रशिक्षक को उस गलत धारणा को सुधारना होगा । ओह ठीक है, मुझे लगता है कि यह नौकरी की सुरक्षा है।
कोजिरो

नहीं चाहेंगे true > /path/to/monthly.logएक ही बात करते हैं, और यह तो कम पुरातन है :?
स्टेफान लासिवस्की

शायद सच है ...
ewwhite

3

यदि आपको डेटा की आवश्यकता नहीं है, तो / dev / null का उपयोग करके इसे छोटा करें:

cat /dev/null > monthly.log

वेबसर्वर ट्रंकेशन के बाद फ़ाइल में डेटा लिखना जारी रखेगा, जो वेबसर्वर (इसके विपरीत rm monthly.log, जो फ़ाइल को निकालता है) को पुनरारंभ करने की किसी भी आवश्यकता से बचा जाता है ।

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

वेब लॉग को syslog ( /usr/bin/loggerउदाहरण के लिए उपयोग करके ) भेजने पर विचार करें । लॉग जो कि syslog का उपयोग करके बनाए जाते हैं, उनमें भी आमतौर पर पहले से ही लॉगरोटेशन सेट होता है।


5
आप बस >logfileबिल्ली की कोई जरूरत नहीं कर सकते
user9517

2

यदि आप ext3 फाइल सिस्टम का उपयोग कर रहे हैं, तो ext4 पर स्विच करने पर विचार करें।

Ext3 बड़ी फ़ाइलों को हटाने में धीमा हो सकता है क्योंकि यह प्रत्येक व्यक्ति 4k ब्लॉक के स्थान को संग्रहीत करता है: एक 50GiB फ़ाइल (50 * 1024 ^ 3 बाइट्स) 13107200 ब्लॉक रखता है, जिनमें से प्रत्येक को इनकोड तालिका में 32-बिट ब्लॉक संख्या के रूप में दर्ज किया जाता है। , बहीखाता डेटा की कुल 50MiB के लिए बस यह ट्रैक रखने के लिए कि फ़ाइल की सामग्री डिस्क पर कहाँ स्थित है। यह बड़ी ब्लॉक सूची कई अप्रत्यक्ष ब्लॉकों में बिखरी हो सकती है , जिनमें से सभी को फ़ाइल को हटाए जाने पर अद्यतन करना होगा। डिस्क उन सभी अप्रत्यक्ष ब्लॉकों तक पहुंचने की मांग कर रहा है जो संभवतः देरी का कारण बन रहा है।

दूसरी ओर, Ext4, 128MiB तक की "extents" में फाइलें आवंटित करता है। उस 50GiB फाइल को 13107200 व्यक्तिगत ब्लॉक नंबरों के बजाय सिर्फ 400 हद के रिकॉर्ड का उपयोग करते हुए इनकोड तालिका में दर्ज किया जा सकता है, जो फ़ाइल को हटाते समय आवश्यक रूप से डिस्क I / O की मात्रा को कम कर देता है।

ध्यान दें कि यदि आप किसी मौजूदा ext3 फाइलसिस्टम को इन -4 में बदलते हैं, तो एक्स्टेंट का उपयोग करके नई फाइलें आवंटित की जाएंगी, लेकिन मौजूदा फाइलें अभी भी ब्लॉक लिस्ट का उपयोग करेंगी। आप chattr +eमौजूदा फ़ाइल को extents का उपयोग करके पुनः प्राप्त करने के लिए कमांड का उपयोग कर सकते हैं; प्रदर्शन-वार, यह फ़ाइल की एक प्रतिलिपि बनाने और फिर मूल को हटाने के लिए तुलनीय है।


1

यह फाइलसिस्टम के प्रदर्शन के मुद्दे पर उबलता है। इस एसओ सवाल पर इसका एक दिलचस्प जवाब है लेकिन यह इस बात पर निर्भर करता है कि आप किस फाइलसिस्टम का उपयोग कर रहे हैं। मैं जब के लिए मल्टी-गीगाबाइट MPEG2 फ़ाइलों की दुकान सैकड़ों करने के लिए एक फाइल सिस्टम बनाने XFS इस्तेमाल किया MythTV क्योंकि समय XFS के हटाने प्रदर्शन अब तक ext3 से बेहतर था पर। बीच के वर्षों में हालात काफी बदल गए होंगे।

मुझे @ क्वांटा का उत्तर पसंद है। फ़ाइल को छोटे भागों में विभाजित करने से तेजी से विलोपन होगा।


1

समस्या यह है, मुझे लगता है, कि आप उन विशेषाधिकार प्राप्त उपयोगकर्ता से फ़ाइल को हटा रहे हैं, जिनके पास अपाचे वेबसर्वर उपयोगकर्ता की तुलना में डिस्क संचालन के लिए अधिक प्राथमिकता है। कोई फर्क नहीं पड़ता कि आप लॉग फ़ाइल (rm -f या truncate>) को हटाने के लिए क्या चुनते हैं, आपको इसकी डिस्क प्राथमिकता संचालन को घटाकर न्यूनतम करना चाहिए:

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