Memory Pressure และเทคนิคการจัดการ Memory ของ macOS

หลาย ๆ คนที่ใช้ macOS น่าจะเคยประสบปัญหา หรือคำถามว่า เอ๋ เครื่องที่เราใช้งานอยู่ Ram มันพอมั้ยนะ หรือถ้าใช้มา อาจจะรู้สึกว่า เอ๊ะ ทำไมเครื่อง Mac ของเราถึงเปิดนั่นนี่ได้เยอะจัง ทั้ง ๆ ที่ RAM มันมีเท่านี้เอง วันนี้เรามาเล่าถึงกลไกที่ macOS ใช้ในการจัดการ Memory ในเครื่องกันดีกว่า

ทำไมต้องใช้ Memory?

เราขอเริ่มที่พื้นฐานการทำงานของระบบคอมพิวเตอร์กันก่อน สำหรับคนที่อาจจะยังไม่มีพื้นฐาน ให้เราลองคิดภาพถึงเครื่องคอมพิวเตอร์จริง ๆ มันไม่ต่างจากเครื่องคิดเลข เมื่อเราบวกเลข เราจำเป็นต้องป้อนตัวเลข จำนวนแรกเข้าไป จากนั้นเรากดบวก แล้วเราก็ป้อนตัวเลขใหม่เข้าไป ทำให้แม้แต่เครื่องคิดเลขเอง ก็ยังต้องมีหน่วยความจำสำหรับการจำตัวเลขตัวแรก ก่อนจะเอามาบวกกับจำนวนตัวเลขที่สองเข้ามา ตรงนี้แหละ ที่เราเริ่มมีสิ่งที่เรียกว่า Primary Memory

ใน Primary Memory ตรงนี้แหละ ที่ในเครื่องคอมพิวเตอร์สมัยนี้ เราใช้ Memory ประเภทพวก RAM (Random Access Memory) หรือในเครื่อง Mac ที่ใช้ Apple Silicon แพคมาใส่ลงไปใน SoC แล้วตั้งชื่อว่า Unified Memory ถึงชื่อจะต่างกัน แต่การทำงานไม่ต่างกัน ทำหน้าที่ในการเก็บข้อมูลชั่วคราว เช่นผลลัพธ์ของการคำนวณต่าง ๆ เพื่อให้เราไม่จำเป็นต้องคำนวณใหม่ทุกครั้ง หรือเก็บค่าบางอย่างสำหรับการคำนวณต่อไปก็ได้เหมือนกัน

int a = 10;

ยกตัวอย่างง่าย ๆ เวลาเราเขียนโปรแกรม เราประกาศตัวแปร ถามว่า แล้วค่า 10 ที่เราใส่ลงไปในโปรแกรมมันจะอยู่ที่ไหนละ แน่นอนว่า เมื่อโปรแกรมมันทำงาน มันจะเอาค่า 10 นี่แหละไปใส่ใน RAM เมื่อมันสำคัญขนาดนี้ มันเป็น Memory ที่เครื่องคอมพิวเตอร์ทุกเครื่องจำเป็นต้องมี ไม่งั้นเปิดเครื่องไม่ผ่านแน่นอน

Memory พวกนี้ความยากคือ เราจะทำงานอยู่บน Memory แบบ Volatile Memory หรือ Memory ที่เมื่อไฟตัดไปข้อมูลหายหมดเลย แต่มันแลกมากับความเร็วที่สูงมาก ๆ แต่... ถ้าเป็นแบบนั้น ไฟห้ามขาด ไม่งั้นข้อมูลหายหมดเลย ตั้งแต่ข้อมูลของเรา ยัน OS ถ้าหายไป แล้วเราจะ Boot อะไรขึ้นมาใช้งาน ทำให้เครื่องมันมี Memory อีกตัวขึ้นมา เรียกว่า Secondary Memory

Memory ในกลุ่มนี้จะเป็นพวก Non-Volatile Memory กัน หรือตรงข้ามกับ Volatile Memory ที่เมื่อไฟขาดไป ข้อมูลก็ยังอยู่เหมือนเดิมไม่ไปไหน แต่แน่นอนว่า มันแลกมากับความเร็วที่ช้าลงกว่า Volatile Memory มาก

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

ถามว่า แล้วเราสามารถเอา Non-Volatile Memory มาเป็น Primary ได้มั้ย คำตอบคือ ได้ แต่คิดดูนะว่า Performance ในการโหลด และเขียน ข้อมูลมันช้าได้ขนาดไหน ถึงเราจะมี SSD ที่เร็วแรงแล้วก็เถอะ แต่ยังไงมันสู้พวก RAM หรือ Volatile Memory ไม่ไหวแน่นอน

เรารู้ได้ยังไงว่า เราใช้ RAM อยู่เท่าไหร่ ?

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

ในหน้าต่างของ Activity Monitor ด้านบน มันจะ List ออกมาว่า แต่ละ Process มีการใช้ Memory ขนาดเท่าไหร่ ให้เราดูได้จาก Column ที่เขียนว่า Memory และอีกช่องที่อยากให้รู้จักคือ User เป็นช่องที่บอกว่า Process ถูกเปิดขึ้นโดยใคร ส่วนนึงอาจจะเป็นโปรแกรมที่เราเปิดขึ้นมาเอง แต่บางส่วนก็เป็นตัว OS ของเราเปิดขึ้นมาเอง ดูได้ไม่ยาก ถ้าเป็นชื่อเรา ก็เรานี่แหละเปิด แต่ถ้าไม่ใช่ เช่น root, _windowserver และ _fpsd จะเป็นตัว OS มันเปิดขึ้นมาเอง เป็น Process ที่ OS จำเป็นต้องทำงาน อย่าไปยุ่งกับมันเชียว

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

ส่วนด้านขวา จะแบ่งเป็น Memory ทั้งหมด 3 ส่วนด้วยกันคือ App Memory คือ Memory ที่เรากำลังใช้งานกับโปรแกรมและ Process ต่าง ๆ ถัดไปคือ Wired Memory คือ Memory ที่ OS จองไว้สำหรับการทำงานของตัวเอง และ Compressed คือ Memory ที่ได้รับการบีบอัดที่เราจะไปดูกันในหัวข้อย่อยต่อไป

macOS มีกลไกในการจัดการ Memory ให้มีประสิทธิภาพ

เทคนิคนึงที่ทำให้ OS มันทำงานได้มีประสิทธิภาพมากขึ้น คือการจัดการ Memory ให้มีประสิทธิภาพ เรามาดูกันดีกว่าว่า ใน macOS เขาทำยังไงกันบ้าง

เราต้องเริ่มจาก Core Concept สำหรับการจัดการ Memory บน macOS ก่อนว่า Free Memory = Wasted Memory หรือ Memory ที่ว่างมากเท่าไหร่ เท่ากับมันเปลือง ไร้ประสิทธิภาพมากขึ้นเท่านั้น ทำให้ในการใช้งานจริง ๆ macOS พยายามที่จะใช้ Memory ให้ได้มากที่สุด

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

View memory usage in Activity Monitor on Mac
In Activity Monitor, view the amount of system memory being used on your Mac, including physical, compressed, wired and app memory.

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

Memory Compression

แต่ถ้าเกิด Memory เรามีน้อย หรือ เราเปิดโปรแกรมเยอะจัด ๆ จนทำให้ Memory เริ่มไม่พอใน macOS ยังมีอีกกลไกที่เข้ามาช่วยนั่นคือ การทำ Memory Compression

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

เมื่อ Process นั้นกลับมาทำงานอีกครั้ง ตัว OS จะ Decompress มันกลับมาเป็นข้อมูลเดิม เพื่อให้โปรแกรมเข้ามาเรียกได้เหมือนเดิม โดยกระบวนการนี้ OS ทำหน้าที่ในการจัดการเลือก Compress และ Decompress ด้วยตัวเอง สำหรับนักพัฒนาเอง Apple เปิดให้เราสามารถเลือกบอกได้ด้วยว่า ส่วนไหนอนุญาติให้ OS Compress ได้ด้วย เพื่อให้ใช้ Memory ได้อย่างมีประสิทธิภาพมากกว่าเดิม

Swap Memory

แต่ถ้าเกิด OS พยายาม Compress แล้ว เท่าไหร่ก็ยังไม่ไหวสักที เราเปิดแน่นเกิ้นนนน มันจำเป็นต้องมีกลไกเพื่อเข้ามาช่วยเหลือ ไม่งั้น เครื่องจะ Crash ตุยไปได้เลย กลไกที่ว่านั่นคือ Swap

หลักการคือ เมื่อ Primary Memory เราไม่ไหวแล้ว ไม่พอแล้ว งั้นเราเอาบางส่วนที่ยังไม่น่าจะได้ใช้ ไปเก็บไว้ใน Secondary Memory ที่มีขนาดใหญ่กว่าก่อนสิ หรือก็คือ การย้ายข้อมูลจาก Unified Memory ที่เร็วแต่เล็ก ไปไว้ใน SSD ที่ช้ากว่าแต่ใหญ่กว่าก่อน เมื่อเราจะต้องใช้งานอีกครั้ง OS จะเข้าไปโหลดจาก SSD ใส่กลับเข้ามาใน Unified Memory

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

โดยเราสามารถดู Swap Memory ที่กำลังใช้งานได้อยู่จากด้านล่างที่เขียนว่า Swap Used ถ้าเราลองรันโหด ๆ แล้วปิดออก เราจะเห็นเลยว่า Swap Memory มันก็ยังจะไม่หายไปหมด 100% เพราะ ถ้าข้อมูลมันถูกเก็บลงไปใน Swap แล้วยังไม่มีการเรียกใช้งานอีกครั้ง มันก็จะยังเก็บไว้ในนั้นแหละ เพราะถ้ามันต้องโหลดกลับมาทั้งหมดเมื่อ Memory เพียงพอ มันน่าจะเสียเวลา และ Resource มากแน่นอน

จะดูทั้งหมดยาก ใช้ Memory Pressure สิ

3 กลไกที่เราว่ามา เป็นกลไกที่ macOS ใช้ในการจัดการ การใช้งาน Memory ในเครื่องของเรา แต่ถ้าจะให้เราดูการใช้งานของทั้งสามกลไกเลยจะเป็นเรื่องที่เข้าใจยากไปหน่อย Apple เลยทำอีก Matric นึงขึ้นมาคือ Memory Pressure

เราสามารถดูได้ใน Activity Monitor ด้านล่าง โดยทั่ว ๆ ไป เราจะเห็นว่า มันเป็นสีเขียว ๆ แปลว่า Memory ของเราเหลือใช้งานปกติ ไม่มีปัญหาอะไร

แต่ถ้ามันเริ่มเป็นสีเหลืองแล้ว แปลว่า Memory เราเริ่มจะไม่พอละ มันเริ่มจำเป็นต้องเข้าไป Compress Memory และเริ่มใช้ Swap บางส่วน เพื่อให้เราสามารถใช้งานได้ต่อไป และสีแดงเลยนุ้งส์ไม่ไหวเลี้ยว !!!! หยุดเถอะ

สรุป

นอกจาก 3 กลไกในการจัดการ Memory ของ macOS ที่เล่าไปแล้ว ยังมีอีกหลายกลไกในการจัดการภายในเครื่องของเรา แต่ทั้ง 3 ตัวที่เราเอามาเล่าในบทความนี้เป็นเพียงตัวใหญ่ ๆ ที่ทำงานเป็นแกนหลักมาก ๆ บน macOS เริ่มตั้งแต่ การ Cache File เอาไว้ เพื่อสามารถเรียกได้อย่างรวดเร็วเมื่อเราต้องการเรียกอีกครั้ง แต่ถ้า Memory เริ่มจะไม่พอ macOS จะเริ่มเข้าไปหาว่า Process ไหน Memory ส่วนไหนสามารถ Compress ได้มันจะจัดการ หรือในกรณีเลวร้ายที่สุด มันจำเป็นต้องใช้ Swap โดยการสลับ Memory บางส่วนไปแปะใน SSD ชั่วคราวก่อน โดยเครื่องมือที่เราสามารถใช้ในการ Monitor ได้ นั่นก็คือ Activity Monitor นั่นเอง ทำให้เราเห็นการใช้งาน Memory ของเครื่องทั้งหมดได้ค่อนข้างง่าย