จะลดการใช้หน่วยความจำ ClamAV ได้อย่างไร?


26

ฉันใช้เว็บเซิร์ฟเวอร์ที่ใช้ Ubuntu (Apache, MySQL) ใน 512MB VPS นี่มันเกินพอสำหรับเว็บไซต์ที่มันกำลังทำงานอยู่ (ฟอรัมเล็ก ๆ )

ตามที่ฉันต้องการเพิ่มการป้องกันไวรัสฉันติดตั้ง ClamAV และใช้เพื่อสแกนไฟล์ที่อัปโหลดเป็นส่วนหนึ่งของสคริปต์จัดการการอัปโหลด (PHP)

ฉันกำลังเรียกใช้บริการ clamav-daemon ดังนั้นคำจำกัดความไม่จำเป็นต้องโหลดทุกครั้งที่สแกนไฟล์ ข้อเสียอย่างหนึ่งของการฝึกนี้ดูเหมือนจะเป็นจำนวนหน่วยความจำ "ใหญ่" ที่ใช้โดยบริการ clamav-daemon:> 200 MB สิ่งนี้ส่งผลให้บริการถูกบังคับให้หยุดและการอัปโหลดที่ถูกปฏิเสธ

ฉันสามารถอัพเกรดหน่วยความจำของ VPS เป็น 1024MB ได้ แต่ฉันต้องการทราบว่ามีวิธีลดการใช้หน่วยความจำของ ClamAV หรือไม่เช่นไม่โหลดคำจำกัดความที่ไม่ต้องการ

คำตอบ:


15

ClamAV เก็บสตริงการค้นหาโดยใช้สตริงคลาสสิก (Boyer Moore) และอัลกอริธึมการแสดงออกปกติ (Aho Corasick) เป็นอัลกอริทึมจากปี 1970 พวกเขามีประสิทธิภาพหน่วยความจำอย่างกว้างขวาง

ปัญหาคือจำนวนลายเซ็นของไวรัสจำนวนมาก สิ่งนี้นำไปสู่โครงสร้างข้อมูลของอัลกอริทึมที่เติบโตค่อนข้างใหญ่

คุณไม่สามารถส่งโครงสร้างข้อมูลเหล่านั้นเพื่อแลกเปลี่ยนเนื่องจากไม่มีส่วนใดของโครงสร้างข้อมูลของอัลกอริทึมที่เข้าถึงน้อยกว่าส่วนอื่น ๆ หากคุณบังคับให้เพจของพวกเขาสลับดิสก์จากนั้นพวกเขาจะถูกอ้างอิงช่วงเวลาต่อมาและเพียงแค่สลับกลับเข้ามาอีกครั้ง (ในทางเทคนิคแล้วเราพูดว่า "การเข้าถึงแบบสุ่มของโครงสร้างข้อมูลจะบังคับให้โครงสร้างข้อมูลทั้งหมดอยู่ใน ".)

โครงสร้างข้อมูลมีความจำเป็นหากคุณกำลังสแกนจากบรรทัดคำสั่งหรือสแกนจากภูต

คุณไม่สามารถใช้ลายเซ็นไวรัสเพียงบางส่วนได้เนื่องจากคุณไม่ได้เลือกว่าจะส่งไวรัสชนิดใดและดังนั้นจึงไม่สามารถบอกได้ว่าคุณต้องการลายเซ็นใด

นี่คือหน่วยความจำที่ใช้กับเครื่อง 32- บิตที่เรียกใช้ Debian Wheezy และมันคือ clamd

# ps_mem.py 
 Private  +   Shared  =  RAM used   Program
281.7 MiB + 422.5 KiB = 282.1 MiB   clamd

แก้ไข: ฉันเห็นบางคนแนะนำให้ตั้งค่าขนาดชุดที่อยู่อาศัย หากสิ่งนี้สำเร็จแล้วการมีขนาดชุดที่อยู่อาศัยน้อยกว่าขนาดชุดการทำงานจะนำไปสู่กระบวนการที่สลับไปมาระหว่างและสลับ สิ่งนี้จะลดประสิทธิภาพของระบบทั้งหมดลงอย่างมาก ในกรณีใด ๆ หน้าคู่มือ Linux สำหรับ setrlimit (RLIMIT_RSS, ... ) กล่าวว่าการตั้งค่าขนาดชุดที่อยู่อาศัยไม่ได้รับการสนับสนุนอีกต่อไปและไม่เคยมีผลกระทบต่อกระบวนการที่เลือกที่จะไม่เรียก madvise (MADV_WILLNEED, ... )


1

ฉันพบปัญหาคล้ายกันที่เรียกใช้ clamd ในกล่อง NAS ขนาดเล็กที่มีขนาดเพียง 512MB จากการสำรวจคำถามทั่วทั้งเน็ตดูเหมือนว่าไม่มีวิธีใดที่จะลดการใช้หน่วยความจำ ฐานข้อมูลของสิ่งที่น่ารังเกียจก็ยิ่งใหญ่ขึ้นเรื่อย ๆ

เป็นไปได้ที่จะกำหนดค่า clamav ให้ทำงานในโหมดที่ไม่ใช่ daemon โดยการติดตั้ง "clamav" แทน "clamav-daemon" สิ่งนี้อาจช่วยให้คุณมีหน่วยความจำมากขึ้นเป็นส่วนใหญ่ เมื่อคุณสแกนการอัปโหลดจะต้องมี RAM จำนวนมากเสมอ


1
ข้อเสียเปรียบหลักของวิธีนี้คือจะใช้เวลาในการสแกนนานกว่า ทุกครั้งที่อัพโหลดไฟล์ฐานข้อมูลจะต้องโหลดก่อนที่จะทำการสแกนได้ การโหลด db ใช้เวลาหลายนาทีอันมีค่าถ้าคุณต้องการให้ผู้ใช้ตอบสนองอย่างรวดเร็ว นอกจากนี้เมื่อประมวลผลการอัปโหลดหลายรายการในเวลาเดียวกันคุณจะมีหลายเธรดที่โหลดฐานข้อมูลทำให้มีการใช้ RAM มากยิ่งขึ้น ดังนั้นการใช้ daemon ทางออกของฉันคือการอัพเกรดบริการ VPS ของฉันและจ่ายเพิ่ม 5 USD / เดือนสำหรับ RAM เพิ่มเติม ฉันจะอยู่กับการเพิ่มขึ้นของค่าใช้จ่ายนี้ :)
นีลส์อาร์

1

คำตอบนี้ไม่ได้รับการยืนยันและอาจไม่ทำงาน นอกจากนี้ยังไม่ตอบวิธีการลดการใช้หน่วยความจำ แต่วิธี จำกัด การใช้งานหน่วยความจำซึ่งแตกต่างกันเล็กน้อย


คุณสามารถแก้ไขสคริปต์ ClamAV init (int /etc/init.d/เพื่อเพิ่มคำสั่งulimit -m amountofram.
มันจะเป็นไปได้ของการ จำกัด ClamAV และคุณอาจจะแลกเปลี่ยนซึ่งอาจจะชะลอตัวลงทั้งระบบของคุณ

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