วิธีตรวจจับการรั่วไหลของหน่วยความจำใน Ubuntu



ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา

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



หากคุณกังวลเกี่ยวกับหน่วยความจำรั่วให้ลองพิมพ์ฟรีซ้ำ ๆ ในเทอร์มินัล หากจู่ๆคุณเริ่มเห็นการใช้ RAM เพิ่มขึ้นอย่างรวดเร็วแสดงว่าคุณตรวจพบหน่วยความจำรั่วแล้ว หากคุณได้รับข้อผิดพลาดที่อ่านบางอย่างเช่น bash: หน่วยความจำไม่เพียงพอในขณะที่ทำสิ่งนี้และคุณไม่มีอะไรเลยนอกจากเทอร์มินัลหรือแม้แต่คอนโซลเสมือนที่เปิดอยู่คุณก็แทบจะไม่ต้องสงสัยเลย การรั่วไหลของหน่วยความจำบางส่วนอาจเป็นเรื่องที่ละเอียดกว่าเล็กน้อย แต่ Ubuntu และมันเป็นเครื่องมือและแพ็คเกจคุณลักษณะต่างๆที่แยกออกมาซึ่งสามารถช่วยคุณตรวจจับสิ่งเหล่านี้ได้



การตรวจจับการรั่วไหลของหน่วยความจำใน Ubuntu

เนื่องจากเครื่องมือที่ใช้ในการตรวจจับการรั่วไหลของหน่วยความจำนั้นขึ้นอยู่กับพรอมต์ CLI เป็นหลักจึงไม่สำคัญว่าคุณจะใช้ Ubuntu เวอร์ชันใด สิ่งเหล่านี้ควรทำงานได้ดีภายในเทอร์มินัล Unity ใน Ubuntu ปกติจากคอนโซลเสมือนใน Ubuntu Server จาก lxterm ใน Lubuntu Konsole ใน Kubuntu หรือแม้แต่ภายใน Xfce ใน Xubuntu ลองทำงานง่ายๆเช่น sudo -s แล้วพิมพ์รหัสผ่านเพื่อเริ่มต้น



สิ่งนี้จะทำให้คุณได้รูทเชลล์หากดำเนินการอย่างถูกต้อง แต่อาจทำให้เกิดข้อผิดพลาดของหน่วยความจำหากคุณกำลังทำงานกับการรั่วไหลที่ไกลเกินไป หากคุณสามารถเข้าถึงรูทเชลล์ได้จริงให้ลองพิมพ์ echo 3> / proc / sys / m / drop_caches กดปุ่ม Enter จากนั้นพิมพ์ exit ลองเรียกใช้ฟรีหรือ free -m อีกครั้งเพื่อดูว่าช่วยปลดปล่อยหน่วยความจำได้หรือไม่

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

มีคนแนะนำให้เพิ่มไลน์ซิงค์ sudo echo 3> / proc / sys / vm / drop_caches ไปยังสคริปต์ที่ cron ทำงานอย่างสม่ำเสมอ แต่สิ่งนี้เอาชนะจุดประสงค์ของการแคชหน่วยความจำตั้งแต่แรก หน่วยความจำว่างนั้นเป็นเพียงแรมที่ไม่ได้ใช้งานและนั่นหมายความว่าข้อมูลจะต้องโหลดช้าลงมากเครื่องกลไฟฟ้า หรืออุปกรณ์จัดเก็บข้อมูล NAND ไม่ว่าอุปกรณ์เหล่านี้จะเร็วแค่ไหน แต่ก็ไม่เร็วเท่า RAM ซึ่งหมายความว่าในขณะที่คุณควรแก้ไขการรั่วไหลของหน่วยความจำคุณไม่ควรยุ่งเกี่ยวกับระบบแคชเมื่อคุณตั้งค่าเป็นการตั้งค่าที่เหมาะสมที่สุดแล้ว



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

หาก Ubuntu ให้ข้อผิดพลาดที่ผิดปกติเกี่ยวกับ top จากนั้นลองออก busybox top แทนเพื่อเข้าถึงโปรแกรมนี้ในเวอร์ชันที่ง่ายกว่า เมื่อคุณมีรายการแล้วให้ดูที่% MEM หรือคอลัมน์ที่คล้ายกันเพื่อดูว่าแอปพลิเคชันใดได้รับการกำหนดหน่วยความจำมากที่สุด ในขณะที่คุณสามารถจดบันทึก PID และออกคำสั่ง kill ตามจำนวนที่แน่นอนของ PID ได้ แต่สิ่งนี้จะบังคับให้ปิดแอปพลิเคชันเท่านั้น หน่วยความจำที่พวกเขาใช้อาจจะยังไม่ถูกปลดปล่อยหลังจากที่คุณทำเช่นนี้แม้ว่าจะคุ้มค่ากับการถ่ายภาพก็ตาม

หากคุณพบแอปพลิเคชันที่ใช้หน่วยความจำจำนวนมากให้กด q เพื่อออกจากนั้นลองฆ่า #### ด้วยหมายเลข PID จากหน้าจอก่อนหน้า กระบวนการของระบบไม่ควรถูกฆ่าด้วยวิธีนี้และไม่ควรมีสิ่งใดก็ตามที่คุณยังไม่ได้บันทึกทำงานให้ลองนึกถึงสิ่งนี้ในทำนองเดียวกันกับการฆ่าบางสิ่งด้วยรายการงาน Ctrl + Alt + Del ซึ่งคุณสามารถใช้สำหรับกระบวนการเดียวกันนี้ได้

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

หากคุณไม่ได้เป็นเพียงการแก้ไขปัญหาแอปพลิเคชัน แต่ยังใช้งานโค้ดได้จริงคุณก็มีทรัพยากรอื่น ๆ อีกสองสามรายการ อูบุนตูและอนุพันธ์นำเสนอกิจวัตร membarrier, memusage และ memusagestat C สำหรับการเขียนโปรแกรม

เพียงใช้ man membarrier, man memusage หรือ man memusagestat เพื่อดูหน้าคู่มือ Linux Programmer เกี่ยวกับกิจวัตรที่สำคัญเหล่านี้ หากมีการอัปเกรดในไลบรารีเวอร์ชันอนาคตเมื่อ Ubuntu เวอร์ชันใหม่ออกมาการเปลี่ยนแปลงจะถูกระบุไว้ที่นี่เสมอ

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

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

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

อ่าน 4 นาที