Дроп бафера и кеша (buffer/cache) са RAM-a на Линуксу

Дроп бафера (енг. buffer), може да се користи, рецимо у сценарију кад на хипервизору имате 20 виртуалних машина које користе 100% физичког RAM-а. Сама виртуална машина, примера ради – ако сте јој доделили 10GB RAM-а, она може тренутно да користи 2GB док је рецимо 7GB кеширано и ‘reusable’ – ви иако коритите 2GB RAM-а вас ће то на физичком хосту коштати укупно 9GB RAM-а…а да при том не желите да самој виртуалној машини смањујете RAM који сте јој дали на коришћење.

Слика 1 – Пре дроповања бафер кеша

Из примера са слике 1, рецимо – сервер користи 1345MB RAM-а и толико му тренутно треба – али на хипервизору на којем се налази овај VPS ће бити показано како сервер користи used+buff/cache = 1345+5859=7204MB RAM-а.

У buffer/cache јесте reusable RAM који је систем кеширао због бржег извршавања (RAM је бржи од HDD-а) и читања података који се често користе а уколико зафали RAM-а за корићење (колона ‘used’) биће преузето одатле аутоматски. Систем је паметан па је сконтао, на горњој слици, да 5GB некаквих података користим често и то је запаковао да чека позив или читање уколико се деси…и то ће бити брже одрађено кроз RAM него кроз диск.

Колико RAM-а онда имам на располагању? 617MB?
НЕ. Оно колико имаш је под колоном ‘available’, тј у овом случају 5826MB. Тих 617MB RAM-а је RAM који зврји празан и неискоришћен.

#!/bin/bash
#########################################################################################
# Опис: Скрипта за дроп buffer cache-a због ослобађања RAM-а на хипервизору
# Аутор: Kompjuteras.com - али можете скрипту користити или мењати како вам срцу драго
# Корисите само на виртуалним машинама ако имате проблем са укупном колицином RAM-а на 
# хипервизору који користите. Ово се не препоручује на прод машинама јер утиче на 
# перформансе система, јер "Free memory is unused memory is wasted memory"
#
# Crontab пример (да се окида сваког првог у месецу):
# 00  *  *  *  *  /root/skripte/DropBufferCache.sh > /tmp/CrontabDropBufferCache.log 2>&1
#
#########################################################################################

################### ВАРИЈАБЛЕ ###################
# Ставите LOG_FAJL=/dev/null ако не желите лог
LOG_FAJL=/tmp/DropBufferCache.log
#################################################

echo "------------------ `date` Before ------------------" >> ${LOG_FAJL}
free -m | grep -v Swap | grep -v "buffers/cache" >> ${LOG_FAJL}

################### DROP ACTION ####################
# Free pagecache
sync ; echo 1 > /proc/sys/vm/drop_caches
# Free dentries and inodes
sync ; echo 2 > /proc/sys/vm/drop_caches
# Free pagecache, dentries and inodes
sync ; echo 3 > /proc/sys/vm/drop_caches
###################################################

echo "------------------ `date` After ------------------" >> ${LOG_FAJL}
free -m | grep -v Swap | grep -v "buffers/cache" >> ${LOG_FAJL}

exit 0

После окидања скрипте добићемо овако неко стање

Слика 2 – После дроповања бафер кеша

Као што видите, бафер је са 5859MB пао на 439MB али систем и даље користи исто RAM-а и исто RAM-а има на располагању и даље (100MB горе-доле) док је све из бафера прешло у стање блеје (free). Овим смо – хипервизору ослободили око 5GB RAM-а, али смо виртуалној машини набацили нови посао јер уместо да податке које често чита – чита из RAM-а, мора да чита са диска – док не превуче поново назад у бафер чиме се губи на перформансама.

Људи који желе трајно да на овај уврнути начин ослобађају RAM јер кубуре са RAM-ом, неће да га прошире или смање коришћење RAM-а на постојећим VM-овима (или гасити VM-ове) ову скрипту могу поставити у crontab да се под root корисником окида на 20 минута…цена је наравно обарање перформанси, које додуше неће бити баш драстично али ће свакако постојати. Корисници на неким мојим тестним VM-овима нису приметили неке велике разлике у перформансама – што не значи да их и нема.

Дакле, ово користите само на дев машинама, и само на виртуалим машинама које се налазе на хипервизору који кубури са RAM-ом. Нећете ништа системски појебати – али ћете утицати на пад перформанси.