วิธีลดการใช้หน่วยความจำ SpamAssassin (spamd)


15

ฉันกำลังใช้ SpamAssassin บน Debian (การกำหนดค่าเริ่มต้นด้วย Pyzor, AWL และ Bayes และการเปิดใช้งาน sa-compile) และกระบวนการ childs spamd แต่ละอันใช้หน่วยความจำประมาณ 100 ถึง 150MB (ประมาณ 50MB ของหน่วยความจำจริง) ใน 32 บิตเซิร์ฟเวอร์และเพิ่มเป็นสองเท่า (พอพอสมควร) บนเซิร์ฟเวอร์ 64 บิต โดยทั่วไปจะมีกระบวนการลูกสองกระบวนการ แต่ในเวลาไม่ว่างอาจมีการทำงานห้า (สูงสุด)

ISTM ที่ 200 ถึง 600MB เป็นหน่วยความจำจำนวนมากสำหรับงานนี้ ฉันต้องการใช้ SA ต่อไปเป็นส่วนหนึ่งของโครงสร้างการกรองของฉัน แต่มันก็ยากที่จะพิสูจน์ความจำได้มาก

มีวิธีใดบ้างที่จะลดจำนวนหน่วยความจำที่กระบวนการลูกแต่ละอันใช้? (หรือมิฉะนั้นให้ทำกระบวนการลูกเดียวเร็วจนฉันสามารถตั้งค่าเด็กสูงสุดให้เป็น 2 อย่างได้) ฉันยินดีที่จะพิจารณาตัวเลือกต่าง ๆ รวมถึงตัวเลือกที่จะหรืออาจส่งผลให้ความแม่นยำลดลง

ผมเคยอ่านแล้ว"ออกจากปัญหาหน่วยความจำ" หน้าสาวิกิพีเดีย ; ไม่มีสิ่งใดที่มีประโยชน์ ข้อความที่มีขนาดใหญ่กว่า 5 MB จะไม่ถูกสแกนด้วย SA


1
โปรดทราบว่าเด็กที่มีทางแยกอาจใช้ RAM ที่มีอยู่จริงน้อยกว่าผลรวมของตัวเลข ps หรือการแสดงยอดนิยม นี่คือสาเหตุที่กลยุทธ์การคัดลอกเมื่อเขียนฟอร์ก
David Schmitt

คำตอบ:


5

ฉันคิดว่าคุณเข้าใจผิดเกี่ยวกับวิธีที่ Linux รายงานการใช้หน่วยความจำ เมื่อกระบวนการส้อมกระบวนการนั้นจะส่งผลให้เกิดกระบวนการที่สองซึ่งแบ่งใช้ทรัพยากรจำนวนมากกับกระบวนการดั้งเดิม รวมอยู่ในนั่นคือหน่วยความจำ อย่างไรก็ตาม Linux ใช้เทคนิคที่เรียกว่า Copy On Write (COW) สำหรับสิ่งนี้ สิ่งที่หมายถึงคือกระบวนการลูกที่แยกแต่ละอันจะเห็นข้อมูลเดียวกันในหน่วยความจำเหมือนกับกระบวนการดั้งเดิม แต่เมื่อใดก็ตามที่ข้อมูลนั้นเปลี่ยนแปลง (โดยลูกหรือผู้ปกครอง) การเปลี่ยนแปลงจะถูกคัดลอกและชี้ไปที่ตำแหน่งใหม่เท่านั้น

จนกว่าหนึ่งในกระบวนการจะทำการเปลี่ยนแปลงข้อมูลนั้นพวกเขากำลังแบ่งปันสำเนาเดียวกัน เป็นผลให้ฉันสามารถมีกระบวนการที่ใช้ RAM 100MB และแยก 10 ครั้ง กระบวนการที่มีการแยกแต่ละอันนั้นจะแสดง RAM 100MB ที่ใช้ แต่ถ้าคุณดูที่การใช้หน่วยความจำโดยรวมในกล่องก็อาจแสดงได้ว่ามีการใช้ RAM 130MB เท่านั้น (100MB ใช้ร่วมกันระหว่างกระบวนการบวกกับค่าใช้จ่ายไม่กี่ MB บวกอีกโหล MB หรือสองสำหรับส่วนที่เหลือของระบบ)

เป็นตัวอย่างสุดท้ายฉันมีกล่องตอนนี้กับ 30 apache กระบวนการทำงาน แต่ละกระบวนการกำลังแสดงการใช้ RAM 22MB อย่างไรก็ตามเมื่อฉันรันฟรี -mเพื่อแสดงการใช้ 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

อย่างที่คุณเห็นกล่องนี้มี RAM ไม่เพียงพอที่จะเรียกใช้ 30 กระบวนการที่แต่ละกระบวนการใช้ RAM "จริง" 18MB นอกจากว่าคุณหมด RAM หรือแอพของคุณกำลังแลกเปลี่ยนกันอย่างหนักฉันก็ไม่ต้องกังวลกับสิ่งต่าง ๆ

UPDATE: นอกจากนี้ตรวจสอบเครื่องมือนี้เรียกว่าsmemกล่าวโดยjlduggerในคำตอบของคำถามอื่นบนลินุกซ์ใช้หน่วยความจำที่นี่


1
ฉันหมด RAM อย่างแท้จริงดังนั้นฉันจึงต้องกังวลกับมัน อย่างไรก็ตามอาจเป็นได้ว่าเป็นกระบวนการอื่นที่ใช้แรมและ SA ไม่ได้ใช้งานมากนัก
Tony Meyer

จากการสังเกตของฉันและการใช้เครื่องมือsmemดูเหมือนว่า spamassassin จะใช้ RAM ประมาณ 50 MB และถ้าคุณแยกมันออกเป็นหลาย ๆ กระบวนการหน่วยความจำเกือบทั้งหมดเป็นหน่วยความจำที่ใช้ร่วมกันดังนั้นมันจะยังคงใช้ RAM รวมประมาณ 50 MB ท่ามกลางกระบวนการทั้งหมดถึงแม้ว่าpsรายงานว่าแต่ละรายการมี RSS 50 MB YMMV
thomasrutter

1

การใช้การคอมไพล์คุณอาจสามารถปรับปรุงความเร็วการจับคู่ของกฎหลายข้อได้


ขออภัยฉันควรกล่าวถึงในคำถามที่ฉันใช้ sa-compile อยู่แล้ว คำแนะนำที่ดีแม้ว่า
Tony Meyer

1

นี่คือสิ่งที่ฉันได้ทำ

ฉันมีการตั้งค่าที่มีข้อความจำนวนมากมีแนวโน้มที่จะส่งมอบในเวลาเดียวกัน สำหรับชุดการทดลองฉันเรียกใช้ SA บนข้อความที่คัดลอกไปยังสปูลชั่วคราวจากนั้นส่งงาน cron ทุกห้านาที

spamd จะพิมพ์ต่อไป "บางทีคุณควรเพิ่มพารามิเตอร์ max-children" และฉันได้เพิ่มขึ้นถึง 40 ในจุดหนึ่ง แต่ฉันมีเซิร์ฟเวอร์ที่ใช้พื้นที่ swap และการล่มทั้งหมด

ตอนนี้ฉันได้ใช้ระบอบการปกครองที่แตกต่างกันซึ่งการจัดส่งถูกควบคุมโดยไฟล์ล็อค Procmail เพราะมันง่ายที่จะทำฉันแค่ใช้เลขหลักสุดท้ายของ ID กระบวนการและเรียกใช้กับเด็ก 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

ค่าเฉลี่ยการโหลดสูงคือ (บางครั้ง) อาการทางอ้อมที่เครื่องของคุณไม่มี RAM (และใช้ CPU ในการสลับกระบวนการกลับไปกลับมาจากหน่วยความจำเสมือน) ดังนั้นคุณสามารถลองกำหนดค่าเซิร์ฟเวอร์อีเมลของคุณเพื่อไม่ให้ส่งเมลผ่าน SpamAssassin หาก โหลดเฉลี่ยสูงเกินไป

คุณไม่ได้พูดถึง MTA ที่คุณกำลังใช้งานอยู่ แต่ถ้าคุณโทรหา SA จากรายการควบคุมการเข้าถึงใน exim4 คำแนะนำที่ด้านล่างของข้อความนี้จะมีผล

นอกจากนี้คุณสามารถลดภาระใน SA และลดการใช้หน่วยความจำโดยการใส่วิธีการกรองสแปมที่ใช้ทรัพยากรน้อยลงก่อนหน้านั้น (เช่นเพื่อให้พวกเขาประมวลผลและปฏิเสธสแปมก่อนที่จะถึง SA) - ตัวอย่างเช่น greylisting และผู้ส่งตรวจสอบข้อความเสริมใช้ RAM ค่อนข้างน้อย


ในบันทึกที่เกี่ยวข้องฉันกำลังพิจารณาการทำ SA อย่างจริงจังเพื่อสนับสนุน dspam ในเซิร์ฟเวอร์สองเครื่องที่ฉันทำงานเนื่องจาก dspam ถูกกล่าวหาว่าใช้ RAM น้อยกว่า
David North

ในฐานะที่เป็นพื้นกลางคุณสามารถเรียกใช้ตัวกรอง Bayesian เป็นขั้นตอนแรกและกลับไปที่ SpamAssassin เฉพาะสำหรับข้อความที่ตัวกรองแรกไม่ได้เกิดขึ้นกับคำตัดสินที่ชัดเจน ผู้ส่งอีเมลขยะมักจะทำซ้ำตัวเอง
บ่อยครั้ง

0

เราอยู่ในสถานการณ์ที่คล้ายคลึงกันเมื่อหลายเดือนก่อน SpamAssassin และ ClamAV ใช้หน่วยความจำจำนวนมากบนเซิร์ฟเวอร์ที่โฮสต์ เรามีตัวเลือกในการเพิ่มหน่วยความจำให้กับเซิร์ฟเวอร์มากขึ้น แต่กลับกลายเป็นว่ามีค่าใช้จ่ายและประหยัดเวลามากขึ้นในการเปลี่ยนไปใช้ Postini YMMV

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.