SpamAssassin (स्‍पैमड) मेमोरी का उपयोग कैसे कम करें


15

मैं डेबियन पर SpamAssassin (Pyzor, AWL और बेयस के साथ डिफ़ॉल्ट कॉन्फ़िगरेशन, और sa- संकलित सक्षम) का उपयोग कर रहा हूं, और प्रत्येक स्पैमाड चाइल्ड प्रक्रिया में लगभग 100 से 150MB मेमोरी (लगभग 50MB वास्तविक मेमोरी) 32 पर खपत होती है बिट सर्वर, और 64 बिट सर्वर पर इस (तार्किक रूप से पर्याप्त) के बारे में दोगुना। आम तौर पर दो बच्चे की प्रक्रिया होती है, लेकिन व्यस्त समय में पांच (अधिकतम) चल सकते हैं।

ISTM कि इस कार्य के लिए 200 से 600MB बहुत मेमोरी है। मैं अपने फ़िल्टरिंग संरचना के भाग के रूप में SA का उपयोग जारी रखना चाहूंगा, लेकिन इतनी मेमोरी को सही ठहराना मुश्किल हो रहा है।

क्या प्रत्येक बच्चे की प्रक्रिया का उपयोग करने वाली स्मृति की मात्रा को कम करने के लिए कोई उपाय हैं? (या वैकल्पिक रूप से, एक ही बच्चे की प्रक्रिया को इतनी तेजी से करें कि मैं अधिकतम बच्चों को 2 जैसी चीज के लिए सेट कर सकूं?)। मैं किसी भी विकल्प पर विचार करने के लिए तैयार हूं, जिसमें कम सटीकता शामिल हो सकती है।

मैंने पहले ही SA विकी पर "मेमोरी समस्याओं से बाहर" पृष्ठ पढ़ा है ; कुछ भी काम का नहीं है। 5 एमबी से बड़े संदेशों को SA के साथ स्कैन नहीं किया जाता है।


1
ध्यान दें कि फोर्क किए गए बच्चे संख्या पीएस या शीर्ष शो के योग की तुलना में बहुत कम भौतिक रैम का उपयोग कर सकते हैं। यह फोर्किंग पर कॉपी-ऑन-राइट रणनीति के कारण है।
डेविड श्मिट

जवाबों:


5

मुझे लगता है कि आप जिस तरह से लिनक्स के मेमोरी उपयोग की रिपोर्ट करते हैं उसे गलत समझ रहे हैं। जब कोई प्रक्रिया आगे बढ़ती है, तो यह दूसरी प्रक्रिया में परिणत होती है जो मूल प्रक्रिया के साथ बहुत सारे संसाधनों को साझा करती है। उसमे शामिल है मेमोरी। हालाँकि, लिनक्स इसके लिए Copy On Write (COW) नामक एक तकनीक का उपयोग करता है। इसका मतलब यह है कि प्रत्येक कांटेक्ट चाइल्ड प्रोसेस में मूल प्रोसेस की तरह मेमोरी में एक ही डेटा दिखाई देगा, लेकिन जब भी वह डेटा बदलता है (बच्चे या माता-पिता द्वारा), तो बदलाव कॉपी हो जाते हैं और उसके बाद ही किसी नए स्थान की ओर इशारा करते हैं।

जब तक कोई भी प्रक्रिया उस डेटा में परिवर्तन नहीं करती, तब तक वे एक ही प्रतिलिपि साझा कर रहे हैं। नतीजतन, मेरे पास एक प्रक्रिया हो सकती है जो 100 एमबी रैम का उपयोग करती है, और इसे 10 बार कांटा। उनमें से प्रत्येक काँटेदार प्रक्रिया में 100MB RAM का उपयोग होता दिखा, लेकिन यदि आपने बॉक्स पर समग्र मेमोरी उपयोग को देखा, तो यह केवल यह दिखा सकता है कि 130MB RAM का उपयोग किया जा रहा है (100MB प्रक्रियाओं के बीच साझा किया गया है, साथ ही कुछ MB का ओवरहेड भी है , प्लस एक दर्जन एमबी या बाकी सिस्टम के लिए दो)।

अंतिम उदाहरण के रूप में, मेरे पास अभी एक बॉक्स है जिसमें 30 अपाचे प्रक्रियाएं चल रही हैं। प्रत्येक प्रक्रिया 22MB RAM का उपयोग दिखा रही है। हालाँकि, जब मैं अपना समग्र रैम उपयोग दिखाने के लिए फ्री-एम चलाता हूं, मुझे यह मिलता है:

topher@crucible:/tmp$ free -m
             total       used       free     shared    buffers     cached
Mem:           349        310         39          0         24         73
-/+ buffers/cache:        212        136
Swap:          511         51        460

जैसा कि आप देख सकते हैं, इस बॉक्स में 30 प्रक्रियाओं को चलाने के लिए पर्याप्त रैम भी नहीं है जो प्रत्येक 18 एमबी "वास्तविक" रैम का उपयोग कर रहे थे। जब तक आप शाब्दिक रूप से RAM से बाहर नहीं निकल रहे हैं या आपके ऐप्स बहुत तेज़ी से स्वैप कर रहे हैं, मुझे चीजों की चिंता नहीं होगी।

अद्यतन: इसके अलावा, इस उपकरण की जाँच करें जिसे smem कहा जाता है , जिसका उल्लेख लिनक्स मेमोरी उपयोग पर एक अन्य प्रश्न के उत्तर में jldugger द्वारा किया गया है


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

मेरे अवलोकन से और टूल स्मेम का उपयोग करने पर , ऐसा लगता है कि स्पैमसैसिन लगभग 50 एमबी रैम का उपयोग करता है, और यदि आप इसे कई प्रक्रियाओं में कांटा करते हैं, तो लगभग उनकी सभी मेमोरी को साझा किया जाता है, इसलिए यह अभी भी लगभग 50 एमबी रैम का उपयोग करेगा। सभी प्रक्रियाओं के बीच, भले ही पीएस हर एक को 50 एमबी का आरएसएस बताता है। YMMV।
थोमसट्रेटर

1

सा-संकलन का उपयोग करके आप कई नियमों की मिलान गति में सुधार करने में सक्षम हो सकते हैं।


क्षमा करें, मुझे इस प्रश्न में उल्लेख करना चाहिए कि मैं पहले से ही सा-संकलन का उपयोग कर रहा हूं। अच्छा सुझाव है, यद्यपि।
टोनी मेयर

1

यहाँ मैंने क्या किया है।

मेरे पास एक सेट-अप है जहां बहुत सारे संदेश एक ही समय में वितरित किए जाते हैं; प्रयोगों की एक श्रृंखला के लिए, मैं एसए को उन संदेशों पर चलाता हूं जो एक अस्थायी स्पूल में कॉपी किए जाते हैं और फिर हर पांच मिनट में क्रोन जॉब द्वारा वितरित किए जाते हैं।

spamd प्रिंट करता रहेगा "शायद आपको अधिकतम बच्चों के पैरामीटर में वृद्धि करनी चाहिए" और मैंने इसे एक बिंदु पर 40 तक बढ़ा दिया था, लेकिन मेरे पास सर्वर था जो इसके सभी स्वैप स्थान का उपभोग कर रहा था और दुर्घटनाग्रस्त हो रहा था।

अब मैंने एक अलग शासन लागू किया है, जहाँ डिलीवरी को एक Procmail लॉक फ़ाइल द्वारा नियंत्रित किया जाता है। क्योंकि यह करना आसान था, मैं सिर्फ प्रक्रिया आईडी के अंतिम अंक का उपयोग करता हूं, और 10 बच्चों के साथ चलता हूं। मुझे यकीन नहीं है कि यह इष्टतम है, लेकिन यह पहले से ही पागल लोड चोटियों से बचने में मदद करता है जिन्हें मैंने समय-समय पर अनुभव किया।

LINEBUF=10240

# Grab last digit of PID for lockfile
PID=$$
:0
* PID ?? ()\/[0-9]$
{ D=$MATCH }
:0
* > 512000
{ SA="(too large)" }
:0Ew:/tmp/20spamc.$D
SA=| spamc -p 38783 -l -y

इसके अलावा, मैं spamdकई ulimitप्रतिबंधों के साथ शुरुआत करता हूं । नंबरों को निकाल लिया गया http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-masses सिवाय इसके कि मैंने ulimit -uप्रतिबंध हटा दिया । (निश्चित नहीं है कि क्या चल रहा है। 32 किसी भी घटना में बहुत छोटा है। 500 जैसी किसी चीज के साथ मैं spamdथोड़ी देर तक दौड़ता रह सकता हूं , लेकिन आखिरकार सीमा में चला जाता हूं ।)

ulimit -v 204800
ulimit -m 204800
ulimit -n 256
#ulimit -u 32

perl -T -I lib -w spamd --min-children 2 --max-children 10 --max-spare 5 etc etc

मुझे लगता है कि यदि डिलीवरी एक विस्तारित समय के लिए बहुत अधिक है, तो मैं डिलीवरी विफलताओं के साथ समाप्त हो जाऊंगा, लेकिन अब तक, ऐसा लगता है कि मैं इस के साथ प्रबंधनीय स्तर पर लोड को कम करने में कामयाब रहा हूं; और असफल प्रसव का एक गुच्छा अभी भी स्वैप से बाहर चल रही मशीन की तुलना में बहुत बेहतर है।


0

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

आप यह उल्लेख नहीं करते हैं कि आप कौन से MTA चला रहे हैं, लेकिन यदि आप SA को exim4 में एक्सेस कंट्रोल लिस्ट से बुला रहे हैं, तो संदेश के निचले भाग में सुझाव दें प्रभावी है।

इसके अलावा, आप SA पर लोड को कम कर सकते हैं, और इस प्रकार इसके मेमोरी कम कर सकते हैं, इसके सामने कुछ अन्य, कम संसाधन-गहन स्पैम-फ़िल्टरिंग विधियों को डालकर (इसलिए, इसलिए वे SA पर पहुंचने से पहले कुछ स्पैम को संसाधित और अस्वीकार कर देते हैं) - उदाहरण के लिए, greylisting और प्रेषक सत्यापित कॉलआउट अपेक्षाकृत कम RAM का उपयोग करते हैं।


संबंधित नोट पर, मैं अपने द्वारा चलाए जा रहे सर्वरों के एक जोड़े पर dspam के पक्ष में SA को कम करने के बारे में गंभीरता से विचार कर रहा हूं, क्योंकि dspam में कथित रूप से कम RAM- भूखा है।
डेविड नॉर्थ

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

0

हम कई महीने पहले ऐसी ही स्थिति में थे। SpamAssassin और ClamAV एक होस्ट किए गए सर्वर पर बहुत सारी मेमोरी का उपयोग कर रहे थे। हमारे पास सर्वर में अधिक मेमोरी जोड़ने का विकल्प था, लेकिन यह पोस्टिनि पर स्विच करने के लिए अधिक लागत- और समय-प्रभावी निकला। YMMV।

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