มีสาเหตุหลายประการที่หน่วยความจำรั่วอาจเกิดขึ้นบน Ubuntu แต่โชคดีที่เห็นได้ชัดเมื่อเกิดขึ้น โค้ด Buggy มักเป็นสาเหตุที่สำคัญที่สุด เนื่องจากโปรแกรมเมอร์อาจไม่มีโอกาสตรวจสอบเพื่อให้แน่ใจว่าหน่วยความจำที่ไม่จำเป็นอีกต่อไปจะถูกปล่อยออกมา หากคุณได้ติดตั้งแพ็คเกจที่ไม่เสถียรหรือคอมไพล์โค้ดจากแหล่งที่มา คุณอาจกำลังเผชิญกับปัญหาหน่วยความจำรั่วด้วยเหตุผลนี้ คุณอาจเริ่มสังเกตเห็นมันเนื่องจากแพ็คเกจแอพพลิเคชั่นซอฟต์แวร์เริ่มบ่นว่าหน่วยความจำไม่เพียงพอเมื่อคุณติดตั้ง RAM จริงเกินเพียงพอ
หากคุณกังวลเกี่ยวกับหน่วยความจำรั่ว ให้ลองพิมพ์ฟรีซ้ำๆ ลงในเทอร์มินัล หากคุณเริ่มเห็นการใช้ RAM เพิ่มขึ้นอย่างรวดเร็ว แสดงว่าคุณได้ตรวจพบหน่วยความจำรั่วแล้ว หากคุณได้รับข้อผิดพลาดที่อ่านว่า bash:หน่วยความจำไม่เพียงพอในขณะทำเช่นนี้ และคุณไม่มีอะไรนอกจากเทอร์มินัลหรือแม้แต่คอนโซลเสมือนที่เปิดอยู่ คุณแทบจะไม่ต้องสงสัยเลยว่าจะจัดการกับมัน หน่วยความจำรั่วบางส่วนอาจดูละเอียดกว่าเล็กน้อย แต่ Ubuntu และเครื่องมือและแพ็คเกจฟีเจอร์แยกส่วนต่างๆ ที่สามารถช่วยคุณตรวจจับสิ่งเหล่านี้ได้
การตรวจจับการรั่วไหลของหน่วยความจำใน Ubuntu
เนื่องจากเครื่องมือที่ใช้ในการตรวจจับการรั่วไหลของหน่วยความจำจะขึ้นอยู่กับพรอมต์ของ CLI เป็นหลัก จึงไม่สำคัญว่าคุณจะใช้งาน Ubuntu เวอร์ชันใด สิ่งเหล่านี้ควรทำงานได้ดีภายในเทอร์มินัล Unity ใน Ubuntu ปกติ จากคอนโซลเสมือนในเซิร์ฟเวอร์ Ubuntu จาก lxterm ใน Lubuntu, Konsole ใน Kubuntu หรือแม้แต่ภายใน Xfce ใน Xubuntu ลองทำงานง่ายๆ เช่น sudo -s แล้วพิมพ์รหัสผ่านของคุณเพื่อเริ่มต้น
สิ่งนี้น่าจะทำให้คุณได้รับรูทเชลล์หากดำเนินการอย่างถูกต้อง แต่อาจทำให้เกิดข้อผิดพลาดของหน่วยความจำหากคุณกำลังทำงานกับการรั่วไหลที่เกิดขึ้นมากเกินไป หากคุณสามารถเข้าถึงรูทเชลล์ได้จริง ให้ลองพิมพ์ echo 3> /proc/sys/m/drop_caches กดปุ่ม Enter แล้วพิมพ์ exit ลองเรียกใช้ free หรือ free -m อีกครั้งเพื่อดูว่าสามารถช่วยปลดปล่อยหน่วยความจำได้หรือไม่
โปรแกรมเมอร์บางคนแย้งว่าไม่มีประโยชน์ที่จะบังคับให้เคอร์เนลละทิ้งแคช เนื่องจากควรล้างแคชและเรียกคืนทันทีที่จำเป็นต้องใช้หน่วยความจำกายภาพเพิ่มเติม อย่างไรก็ตาม แม้ว่าการบังคับล้างแคชเหล่านี้จะส่งผลเสียต่อประสิทธิภาพของระบบ โปรดทราบว่านี่เป็นเพียงการทดสอบเท่านั้น เมื่อคุณรีบูทระบบแล้ว เคอร์เนล Linux ควรประกอบแคชหน่วยความจำในลักษณะเดิมอีกครั้ง
มีคนแนะนำให้เพิ่มการซิงค์สาย sudo echo 3> /proc/sys/vm/drop_caches ไปยังสคริปต์ที่ cron ทำงานอย่างสม่ำเสมอ แต่สิ่งนี้เอาชนะจุดประสงค์ของการแคชหน่วยความจำตั้งแต่แรก หน่วยความจำที่ว่างนั้นเป็นเพียง RAM ที่ไม่ได้ใช้ และนั่นหมายความว่าจะต้องโหลดข้อมูลจากอุปกรณ์ระบบเครื่องกลไฟฟ้าหรืออุปกรณ์จัดเก็บข้อมูล NAND ที่ช้ากว่ามาก ไม่ว่าอุปกรณ์เหล่านี้จะเร็วแค่ไหนก็ตาม อุปกรณ์เหล่านั้นก็ไม่เร็วเท่ากับ RAM ซึ่งหมายความว่าแม้คุณควรแก้ไขปัญหาหน่วยความจำรั่ว แต่คุณไม่ควรยุ่งเกี่ยวกับระบบแคชจริงๆ เมื่อคุณได้ตั้งค่าเป็นการตั้งค่าที่เหมาะสมที่สุดแล้ว
หากคุณตัดสินใจว่าคุณมีหน่วยความจำรั่วอย่างต่อเนื่องซึ่งเกิดขึ้นเป็นระยะๆ ในขณะที่ใช้งานเครื่องของคุณ และไม่สามารถจำกัดให้แคบลงได้โดยเฉพาะ แต่คุณยังคงมีสิทธิ์เข้าถึง CLI ให้ลองเรียกใช้คำสั่ง top นี่ควรให้รายการกระบวนการที่ทำงานอยู่แก่คุณ
ป>
หาก Ubuntu ให้ข้อผิดพลาดที่ผิดปกติเกี่ยวกับ top ให้ลองออก busybox top แทนเพื่อเข้าถึงเวอร์ชันที่ง่ายกว่าของโปรแกรมนี้ เมื่อคุณมีรายการแล้ว ให้ดูที่ %MEM หรือคอลัมน์ที่คล้ายกันเพื่อดูว่าแอปพลิเคชันใดถูกกำหนดให้มีหน่วยความจำมากที่สุด แม้ว่าคุณจะสามารถจดบันทึก PID และออกคำสั่ง kill ตามจำนวน PID ที่แน่นอนได้ แต่การดำเนินการนี้จะเป็นเพียงการบังคับให้ปิดแอปพลิเคชันเท่านั้น หน่วยความจำที่พวกเขาใช้อาจยังคงไม่ถูกปล่อยออกมาหลังจากที่คุณทำเช่นนี้ แม้ว่าแน่นอนว่ามันคุ้มค่าที่จะลองก็ตาม
ป>
หากคุณพบแอปพลิเคชันที่ใช้หน่วยความจำจำนวนมาก ให้กด q เพื่อออก จากนั้นลอง kill #### ด้วยหมายเลข PID จากหน้าจอก่อนหน้า กระบวนการของระบบไม่ควรถูกฆ่าด้วยวิธีนี้ และไม่ควรทำงานใดๆ ที่คุณไม่ได้บันทึกไว้ ลองคิดดูว่าสิ่งนี้คล้ายกับการฆ่าบางสิ่งด้วยรายการงาน Ctrl+Alt+Del ซึ่งคุณสามารถใช้สำหรับกระบวนการเดียวกันนี้ได้เช่นกัน
เมื่อคุณพบโปรแกรมที่เหตุการณ์นี้เกิดขึ้นอย่างต่อเนื่อง คุณสามารถกำหนดค่าเพื่อป้องกันพฤติกรรมดังกล่าวในอนาคตได้ แน่นอนว่าแต่ละโปรแกรมจะต้องมีแนวทางที่แตกต่างกัน ซึ่งอยู่นอกเหนือหน้าที่แค่การตรวจจับการรั่วไหลของหน่วยความจำ
หากคุณไม่เพียงแต่แก้ไขปัญหาแอปพลิเคชันเท่านั้น แต่ยังต้องทำงานกับโค้ดจริงด้วย คุณยังมีวิธีช่วยเหลืออื่นๆ อีกสองสามอย่างที่คุณมี Ubuntu และอนุพันธ์ของมันนำเสนอรูทีน C ของ membarrier, memusage และ memusagestat สำหรับการเขียนโปรแกรม
ป>
เพียงใช้ man membarrier, man memusage หรือ man memusagestat เพื่อดูหน้าคู่มือของ Linux Programmer เกี่ยวกับรูทีนที่สำคัญเหล่านี้ หากมีการอัพเกรดไลบรารี่เวอร์ชันต่อๆ ไปเมื่อ Ubuntu เวอร์ชันใหม่ออกมา การเปลี่ยนแปลงจะถูกสรุปไว้ที่นี่เสมอ
ป>
หากคุณต้องการเนื้อหากราฟิก memusagestat ยังมีตัวเลือกในการบันทึกการแสดงหน่วยความจำแบบกราฟิกที่ใช้ลงในไฟล์ PNG สิ่งนี้ทำให้คุณสมบัตินี้น่าสนใจสำหรับผู้เขียนยูทิลิตี้เช่นกัน เนื่องจากสามารถใช้เพื่อสร้างแอปพลิเคชันที่ตรวจสอบการรั่วไหลของหน่วยความจำเป็นประจำ
ป>
คุณอาจต้องการติดตั้ง memprof ซึ่งเป็นเครื่องมือสำหรับโปรไฟล์การใช้หน่วยความจำ เพื่อช่วยคุณในการค้นหาหน่วยความจำรั่ว มันสร้างโปรไฟล์เกี่ยวกับจำนวนหน่วยความจำที่แต่ละฟังก์ชันในโปรแกรมที่คุณกำลังเขียนจัดสรร นอกจากนี้ยังสามารถสแกนหน่วยความจำที่มีอยู่เพื่อค้นหาบล็อกที่ได้รับการจัดสรร แต่ไม่มีการอ้างอิงของแท้อีกต่อไป ทำได้โดยการโหลดไลบรารีล่วงหน้าเพื่อแทนที่คุณสมบัติการจัดสรรหน่วยความจำของไลบรารี C มาตรฐาน
หากคุณวางแผนที่จะใช้สิ่งนี้ ตรวจสอบให้แน่ใจว่าได้ลบบรรทัดรวม memprof ออกจากจุดเริ่มต้นของโค้ดของคุณก่อนที่จะปล่อย สิ่งนี้ถูกใช้เพื่อให้แน่ใจว่าคุณไม่มีการรั่วไหล แต่ไม่ควรกลายเป็นการพึ่งพาหากคุณจัดทำโค้ดของคุณและเผยแพร่ในที่เก็บ
เกี่ยวกับผู้เขียน
เควิน แอร์โรว์ส
Kevin Arrows เป็นผู้เชี่ยวชาญด้านเทคโนโลยีที่มีประสบการณ์สูงและมีความรู้และมีประสบการณ์ในอุตสาหกรรมมานานกว่าทศวรรษ เขาได้รับการรับรองจาก Microsoft Certified Technology Specialist (MCTS) และมีความมุ่งมั่นอย่างแรงกล้าที่จะติดตามข่าวสารเกี่ยวกับการพัฒนาเทคโนโลยีล่าสุด Kevin ได้เขียนหัวข้อที่เกี่ยวข้องกับเทคโนโลยีอย่างกว้างขวาง โดยนำเสนอความเชี่ยวชาญและความรู้ของเขาในด้านต่างๆ เช่น การพัฒนาซอฟต์แวร์ ความปลอดภัยทางไซเบอร์ และการประมวลผลแบบคลาวด์ การมีส่วนร่วมของเขาในด้านเทคโนโลยีได้รับการยอมรับและเคารพอย่างกว้างขวางจากเพื่อนร่วมงานของเขา และเขาได้รับการยกย่องอย่างสูงจากความสามารถของเขาในการอธิบายแนวคิดทางเทคนิคที่ซับซ้อนในลักษณะที่ชัดเจนและรัดกุม ป>