Clear file system memory cache

RAM เต็มแก้ปัญหาแบบไม่ต้องรีบูตเครื่องหรือรีบูต apache วิธีนี้ง่ายสุดๆด้วยคำสั่ง

sync
echo 3 > /proc/sys/vm/drop_caches

วิธีที่เราเช็คว่า Ram หรือเยอะแค่ไหนก็ free -m หากเครื่อง server ใช้ Ram หมดแล้วจะวิ่งไปทำงานที่ swap แทนซึ่งนั้นก็หมายความว่าข้อมูลทุกอย่างถูกเขียนบน Harddisk ปัญหาต่อมาจะทำให้ IO ของเครื่องสูง ซึ่งนั่นก็เป็นสาเหตุของเว็บช้าและ server ล่มตามมา วิธีแก้ปัญหาหากคุณอยู่หน้าเครื่องและคอย monitor ดูตลอดมันก็ไม่มีปัญหาอะไร แต่ถ้าเราไม่อยู่ล่ะทำไง วันนี้ณเดชเอา shell script ง่ายๆมาฝากครับซึ่งเราสามารถตั้งได้ว่าจะให้ restart apache หรือ restart mysql เราก็เปลี่ยนจาก

sync
echo 3 > /proc/sys/vm/drop_caches

เป็นคำสั่ง restart apache เช่น

/etc/init.d/mysqld restart

ก็ได้เช่นกันครับแต่ในตัวอย่างนี้คือจะเคลียร์ไฟล์แคสของระบบออกไปซึ่งก็จะได้แรมกลับคืนมาเหมือนเดิมครับ
ขั้นตอนแรกทำการสร้างไฟล์เพื่อเอาไว้ทำการรัน crontab จากตัวอย่างผมสร้างไฟล์ชื่อ restart_mem หลังจากนั้นก็ใส่ข้อความตามข้างล่างนี้แล้วทำการเชฟไฟล์แล้วเปลี่ยน permission เป็น 777

#!/bin/bash
mem_lmt=7500 # Size in MB
free_mem=$(free | grep "Mem:" | awk '{print $4}')
free_mem=$((free_mem/1024))
#echo $free_mem
if [ $free_mem -lt $mem_lmt ]
then
sync
echo 3 > /proc/sys/vm/drop_caches
echo "Apache and MySQL restarted on `date +'%Y-%m-%d %H:%M:%S'`. Available RAM is " $free_mem "MB" >> /var/log/memchecker.log
else
echo "memory status is safe and free memory is " $free_mem "MB"
fi
mem_lmt=7500 สามารถแก้ไขในส่วนนี้ได้เพราะว่าแต่ล่ะเครื่อง memnory ไม่เท่ากันครับ ตัวนี้มี 8G ครับ
ขั้นตอนต่อมาทำการสร้าง crontab เพื่อทำการรันไฟล์ด้วยคำสั่ง

crontab -e

*/10 * * * * /usr/local/admtools/restart_mem

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

หมายเหตุ เลือกใช้ได้เลยอยากได้แบบไหน
1. Free pagecache
$ echo 1 > /proc/sys/vm/drop_caches
2. Free dentries and inodes
echo 2 > /proc/sys/vm/drop_caches
3. Free pagecache, dentries and inodes
echo 3 > /proc/sys/vm/drop_caches