Algoritma Mencari Nilai RAM per Proses

Oleh: Basit Adhi Prabowo, S.T. (22 Juni, 12 Juli 2020)

Studi Kasus

Apache2 di Ubuntu

Algoritma Asal

sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}'

https://serverfault.com/questions/684424/how-to-tune-apache-on-ubuntu-14-04-server

Ide

Menemukan informasi penggunaan RAM diantara semua group yang menggunakan resource signifikan, yaitu jika penggunaan RAM di dalam group melebihi 20% atau jumlah proses aplikasi di dalam group melebihi 20%. Nilai tersebut dapat digunakan untuk memperkirakan penggunaan RAM per proses, yaitu diambil dari (lihat hasil run):

  • nilai penggunaan RAM tertinggi di dalam group terpilih (kandidat tertinggi),
  • nilai tengah antara penggunaan RAM tertinggi dan rata-rata di dalam group terpilih (kandidat tertinggi),
  • nilai penggunaan RAM rata-rata di dalam group terpilih (kandidat tertinggi), atau
  • nilai rerata penggunaan RAM tertinggi di semua group kandidat
  • nilai penggunaan RAM tertinggi di dalam group kandidat yang memiliki proses terbanyak

Pengguna dapat memilih satu diantara beberapa rekomendasi yang diajukan

Contoh Tidak Signifikan: group 200-300 baik penggunaan RAM maupun jumlah proses tidak lebih dari 20%

Kondisi Test

  1. Set MinSpareServers = dengan jumlah core dari server
    lscpu | grep 'CPU(s)'
  2. Set MaxSpareServers = MinSpareServers + 1; jika MaxSpareServers tinggi, maka pengujian menjadi bias karena adanya thread yang dibiarkan hidup meskipun tidak melakukan apa-apa
  3. Ganti MaxSpareServers = 4 kali jumlah core dari server jika sudah selesai pengujian

Penyiapan Data

  1. Ketahui penggunaan RAM riil
  2. Ketahui informasi penggunaan RAM dari suatu aplikasi/program (jika menggunakan CPU >0):
    1. Kelompokkan ke dalam setiap 100 MB
    2. Hitung jumlah penggunaan RAM total dan per group
    3. Hitung jumlah proses aplikasi total dan per group
    4. Hitung penggunaan RAM maksimal dan minimal per group

Mencari Nilai RAM per Proses

  1. Looping untuk setiap group
    1. Tampilkan informasi group
    2. Jika penggunaan RAM di dalam group melebihi 20% atau jumlah proses aplikasi di dalam group melebihi 20%, maka group ini sebagai kandidat menggantikan kandidat sebelumnya
  2. Menampilkan rekomendasi, dengan rumus:
    ketakutan = max[terpilih]
    moderat = (max[terpilih] + avg[terpilih]) / 2
    percayadiri = avg[terpilih]
    hybrid = sum(maxkandidat[i] x processkandidat[i]) / sum(processkandidat[i])
    populer = max[prosesterbanyak]

Implementasi di Linux

Kode ini dapat di simpan di berkas *.sh, misal: ramperproses.sh, dieksekusi dengan perintah sh ramperproses.sh

#ketahui penggunaan RAM riil
all=$(free | grep 'Mem' | awk '{print $2}')
used=$(free | grep 'Mem' | awk '{print $3}')
shared=$(free | grep 'Mem' | awk '{print $5}')
#ketahui penggunaan RAM dari aplikasi/program
sudo ps -o %cpu,rss -C apache2 |
awk -v used="$used" -v shared="$shared" -v all="$all" '{
if (strtonum($2) > 0 && $1 != 0.0)
{
#kelompokkan ke dalam setiap 100MB
g = int($2/102400);
i[g] = g;
#hitung jumlah penggunaan RAM total dan per group
xtot += $2;
x[g] += $2;
#hitung jumlah proses aplikasi total dan per group
ytot += 1;
y[g] += 1;
#hitung penggunaan RAM maksimal dan minimal per group
if (strtonum($2) > mx[g]) mx[g] = strtonum($2);
if (mn[g] == 0 || strtonum($2) < mn[g]) mn[g] = strtonum($2);
}
else if (strtonum($2) > 0)
{
idle += 1;
}
}
END {
#looping untuk setiap group
for (idx in i)
{
#tampilkan informasi group
print "Range "idx*100" to "(idx+1)*100" MB";
print "[Include Shared Memory]"
print "Apache Memory Usage (MB): "x[idx]/1024;
print "Max Process Size (MB): "mx[idx]/1024;
print "Average Process Size (MB): "x[idx]/((y[idx])*1024);
print "Min Process Size (MB): "mn[idx]/1024;
print "Process: "(y[idx]);
if (x[idx]/1024 / xtot > 0.2 || y[idx] / ytot > 0.2) 
{
hybridx += mx[idx]/1024 * y[idx];
hybridy += y[idx];
chosen = idx;
if (y[idx] > ymax) 
{
ymax = y[idx];
pop = idx;
}
#jika penggunaan RAM di dalam group melebihi 20% atau jumlah proses aplikasi di dalam group melebihi 20%, maka group ini sebagai terpilih mengalahkan kandidat sebelumnya
print "Candidate"
}
else
{
print "Not a Candidate"
}
print ""
}
print "Total Apache Memory Usage (MB), Include Shared: "xtot/1024
print "Memory (MB): "all/1024
print "Actual Memory Usage (MB): "used/1024
print "Shared Memory Usage (MB): "shared/1024
print "Idle Process: "idle
print "Total Process: "ytot
print ""
#Menampilkan rekomendasi
print "Recomendation"
print "Paranoid Value: "mx[chosen]/1024;
print "Moderate Value: "((mx[chosen]/1024)+(x[chosen]/((y[chosen])*1024)))/2;
print "Confident Value: "(x[chosen]/((y[chosen])*1024));
print "Hybrid Value: "hybridx/hybridy;
print "Popular Value: "mx[pop]/1024;
print ""
if (all / (used+shared) >= 2)
{
print "Note:"
print "If "ytot" is maximum process number in the setting, then You can try to multiply maximum process number in the setting up to "all/(used+shared)*0.9", but take a caution of Swapping."
}
}'

Stress Test

Untuk apache2 dapat dilakukan dengan perintah

ab -n 10000 -c 1000 https://alamatweb.com/

di mana n adalah jumlah permintaan, c adalah banyaknya koneksi sekaligus dalam 1 waktu (concurency)

Contoh Hasil Run

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.