Technology

Memory Leak ตัวร้าย กับ Programmer หัวร้อน

By Arnon Puitrakul - 09 พฤศจิกายน 2021 - 1 min read min(s)

Memory Leak ตัวร้าย กับ Programmer หัวร้อน

หลาย ๆ คนที่ใช้ macOS และได้ทำการ Upgrade เป็น macOS Montery 12.0.1 น่าจะได้เจออาการอย่าง Memory Leak แน่นอน ไม่ใช่แค่สื่อต่างประเทศ และคนใกล้ตัวเราที่เจอ เราก็เจอปัญหาเหมือนกัน ทำให้เราอยากจะมาให้ความรู้กันดีกว่าว่า Memory Leak มันคืออะไร ทำไมมันถึงเป็นปัญหาได้ขนาดนั้น

Memory ยืมมาก็ต้องคืน ไม่ใช่นาฬิกาที่ไม่ต้องคืนก็ได้

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

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

ถามว่าทำไม่ต้องขอ เพราะว่า ในระบบคอมพิวเตอร์ในปัจจุบัน เราไม่ได้ทำงานด้วยโปรแกรมเดียวแล้ว ไหนจะ OS ไหนจะโปรแกรมที่ทำงานบน Background และ Foreground ที่เราใช้งานเองก็ตาม ทำให้เราจะต้องไปบอกเพื่อจอง ซึ่งใน OS ก็จะดูว่า โอเค ตอนนี้มันเหลือเท่าไหร่ แล้วที่โปรแกรมจะจองมันพอมั้ย ถ้าไม่พอ เราจะทำ Paging (ย้ายข้อมูลจาก Primary Memory ไปยัง Secondary Memory) ได้มั้ย

จนมันออกมาเป็นรายการที่เราเห็น ๆ ที่ว่า ตอนนี้ในเครื่องของเรามันมีการใช้ Memory เท่าไหร่ โปรแกรมแต่ละตัวมันใช้งาน Memory อยู่เท่าไหร่บ้าง

ส่งผลให้ เมื่อโปรแกรมทำงานแล้วใช้ Memory ส่วนนึงเสร็จแล้ว มันก็จะส่งสัญญาณไปบอก OS ว่า โอเค ชั้นไม่ได้ใช้แล้วนะ เธอเอาไปให้ใครใช้ได้เลย แค่นั้นเลย นี่คือสถานกาณ์ปกติ ก็คือ ยืมมา ก็ต้องคืน เพราะ Memory ไม่ใช่ นาฬิกา ⌚️ ที่ตายแล้วไม่ต้องคืน

ปล. จริง ๆ มันยังมีเรื่องของ Physical Addressing และ Virtual Addressing ที่ยิบย่อย แต่ช่างมัน ไม่ได้เป็นประเด็นสำคัญเท่าไหร่ ถ้าอยากรู้ลองไปหาอ่านเอาได้

มีคนร้ายนักฮุบ อยู่ในหมู่พวกเรา !

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

มันเป็นอาการที่เกิดจากโปรแกรม ทำการจอง Memory เพื่อทำอะไรบางอย่าง และ เมื่อใช้เสร็จมันก็ไม่ยอมคืน จนทำให้เมื่อโปรแกรมมันทำอะไรบางอย่างที่มีการจองแล้วไม่คืนไปเรื่อย ๆ จนทำให้ระบบไม่มี Memory เหลือให้กับโปรแกรมอื่น ๆ หรือแม้แต่ตัว OS เองก็อาจจะทำให้ระบบ Crash ไปได้เลยก็มี

ดังนั้นเรื่องของ Memory Leak ไม่ใช่เรื่องเล็ก ๆ เลย โดยเฉพาะกับระบบ หรือโปรแกรมที่ทำงานบน Server ที่ต้องทำงานแบบ 24/7 ไม่ใช่ใช้ ๆ ไป อ้าว อิบ้า อยู่ ๆ ก็ Crash ตายเลยอะไรแบบนั้น

How to จับโจร?

การจับพวกกินแล้วไม่คืน เราขอแบ่งออกเป็น 2 กลุ่มละกัน คือ กลุ่มของคนทั่ว ๆ ไป หรือผู้ใช้งานโปรแกรม กับ Programmer

เริ่มจากเป็นผู้ใช้ การลองเช็คง่าย ๆ เลย เราอาจจะเข้าไปใน Activity Monitor เลือก Tab Memory ด้านบน และให้เราดูด้านล่างก่อนเลย ตรง Memory Used คือ Memory ที่เรากำลังใช้งานอยู่ว่าเราใช้เท่าไหร่ ส่วนแถวแรกเป็นขนาดของ Memory ที่เครื่องเรามี ทีนี้ด้านบนนี่แหละ เราอาจจะลอง Sort จาก Memory โดยการกดที่หัวตารางตรง Memory ให้ลูกศรด้านขวามันชี้ลง มันจะเป็นการเรียงจากโปรแกรมที่กิน Memory เยอะไปหาน้อยให้เราเลย ตรงนี้เราอาจจะต้องใช้การสังเกตมากหน่อย ว่าเอ๊ะ ถ้าเราเปิดแค่นี้มันใช้มากกว่าที่ควรจะเป็นมั้ยหรือยังไง โดยเฉพาะโปรแกรมที่ใช้ Memory เยอะมาก ๆ จนเสี่ยงทำให้เครื่องเรา Crash ได้

หรือบางคนอาจจะใช้โปรแกรม Monitor อย่างเราใช้ iStat Menu มันก็จะทำให้เราสามารถเอาพวกการใช้งาน Resource ต่าง ๆ ของเครื่องเราขึ้นไปอยู่บน Status Bar ด้านบนได้ ถ้าเรากด Memory ลงมาดู คือ จะเห็นเลยว่า โปรแกรมไหนใช้ Memory เท่าไหร่บ้าง

ตัวอย่างภาพนี้จากเครื่องเราเองเลย จะเห็นว่า Safari ที่เป็น Web Browser ใช้ไป 6.11 GB โดยที่เราเปิด Facebook อยู่ Tab เดียวเลย ฮัลโหล ถึงจะเป็น Facebook บน Web Browser จะกิน 6 GB กว่าไม่ได้นะหนู !!! ถ้าเปิดแค่นี้มันกินเท่านี้จริง ๆ คนที่ใช้เครื่อง RAM 8 GB ไม่นอนร้องไห้ไปแล้วเหรอซื้อเครื่อง 3 หมื่นกว่าบาท เปิด Facebook อย่างเดียวก็เต็มแล้ว TT

อันนี้รัน MAFFT สำหรับทำ Multiple Sequence Alignment (MSA) บน SARS-CoV-2 Sequence หลายหมื่นตัวอย่าง

หรืออีกตัวอย่างจากเครื่องเราเองเหมือนกัน อันนี้ดูเผิน ๆ ว่าเหมือนจะไม่รอดเหมือนกัน แต่จริง ๆ แล้ว มันไม่ได้มีปัญหาอะไร เพราะโปรแกรมที่เรารันมันกินเยอะจริง ๆ

หลาย ๆ ครั้งเมื่อเกิด Memory Leak จำนวน Memory ที่เราใช้ มันไม่ได้เป็นค่าที่โปรแกรมใช้จริง ๆ ทำให้วิธีอีกวิธีที่พอจะช่วยได้ โดยเฉพาะในเคสของ macOS คือ การที่เราลองปิดโปรแกรมเลย และลองเปิด โปรแกรมเดิมใน Condition เดิม ๆ เลย เช่น อาจจะเปิด Facebook ใน Google Chrome หรือ Safari แล้วเอา Memory มาดูว่า มันใช้เท่าไหร่ จำไว้ก่อน และให้เราใช้งานปกติเลย แต่สุดท้ายแล้ว ให้กลับมาที่ State เดิม แล้วลองดู Memory ว่า มันต่างกันขนาดไหน ถ้ามันต่างกันไม่เกิน 10-15% เรามองว่า ไม่มีปัญหาหรอก แต่มากกว่านั้น 100-200% อันนั้นแหละ มีปัญหาละ ไม่น่าใช่

ในฝั่งของ Programmer ที่เขียนโปรแกรมเอง เราต้องเข้าใจก่อนว่า มันไม่ใช่สิ่งที่ Programmer อยากให้ผู้ใช้เจอเลย ดังนั้น Programmer ก็จะออกแบบโปรแกรมมาเพื่อป้องกันเรื่องพวกนี้อยู่แล้ว ไม่น่าจะมี Programmer คนไหนปล่อยมาโดยที่ยังรู้แน่ ๆ ทำให้ปลอดภัยไปเปราะนึง กับตัว OS เองมีระบบหลายตัวที่คอยตรวจสอบและป้องกันเรื่องพวกนี้อยู่แล้ว แต่ก็นะ เราเป็นมนุษย์ เราไม่ได้สมบูรณ์เสมอ มันก็จะมีช่องโหว่บางอย่างที่เราอาจจะไม่รู้ได้ ทำให้มันก็จะมีพวกโปรแกรมสำหรับการทำ Memory Profiler เข้ามาช่วยเราในการ Debug การใช้งาน Memory ของโปรแกรมเรานั่นเอง

การแก้ปัญหาเบื้องต้น

สำหรับการแก้ปัญหาเลยจริง ๆ ก็จะเป็นหน้าที่ของ Programmer ที่จะต้อง Debug ปัญหานี้ออกไป แต่ในฝั่งของผู้ใช้เอง เราก็อาจจะมีการตรวจสอบการใช้งาน Memory บ่อย ๆ หน่อยว่า ตอนนี้มันใช้งานแน่นเกินไปมั้ยหรือยัง ถ้ามันเริ่มแน่น หรือมันไม่ Make Sense แล้วเราก็อาจจะเปิด และ เปิดโปรแกรมเจ้าปัญหานี้ เพื่อบังคับให้มันคืน Memory ทั้งหมดกลับไป ก็จะพอช่วยได้ระหว่างเรารอ Patch จากผู้ผลิต Software ออกมาเพื่อแก้ปัญหา

สรุป

Memory Leak เป็นอาการของโปรแกรมที่มีการจอง Memory แล้วไม่คืน ทำให้โปรแกรมอื่น ไม่สามารถใช้ Memory ในส่วนที่หายไปได้ เหมือนกับ Memory รั่วออกไปจากระบบเรื่อย ๆ ทำให้เราเรียกอาการพวกนี้ตามชื่อของมันเลยนั่นเอง ซึ่งผลกระทบของมันก็ขึ้นกับว่า โปรแกรม หรือระบบอะไรเจอ ถ้าเป็นระบบใหญ่ ๆ อาจจะทำให้ Memory ไม่พอจนมัน Crash ไปได้เลย หรือในระบบเล็ก อย่างเครื่องบ้าน ๆ อย่างพวกเรา ก็อาจจะเจออาการที่โปรแกรมอะไรสักอย่างใช้ Memory เยอะ เลยทำให้เครื่องช้าไปหมด ก็เป็นไปได้ ทำให้ผลของมันมีตั้งแต่ระบบพังไปเลย จนเบาสุดคือ เครื่องช้า แค่นั้นเลย ซึ่งการแก้ปัญหา เราก็ต้องรอ Patch จากผู้ผลิต Software มาแก้ปัญหา แต่เบื้องต้น เราก็อาจจะปิดเปิด โปรแกรมเจ้าปัญหานี้เมื่อมันเริ่มกินเยอะไป ก็ Kill มันไปเลย แล้วเปิดใหม่