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
Kondisi Test
- Set MinSpareServers = dengan jumlah core dari server
lscpu | grep 'CPU(s)'
- Set MaxSpareServers = MinSpareServers + 1; jika MaxSpareServers tinggi, maka pengujian menjadi bias karena adanya thread yang dibiarkan hidup meskipun tidak melakukan apa-apa
- Ganti MaxSpareServers = 4 kali jumlah core dari server jika sudah selesai pengujian
Penyiapan Data
- Ketahui penggunaan RAM riil
- Ketahui informasi penggunaan RAM dari suatu aplikasi/program (jika menggunakan CPU >0):
- Kelompokkan ke dalam setiap 100 MB
- Hitung jumlah penggunaan RAM total dan per group
- Hitung jumlah proses aplikasi total dan per group
- Hitung penggunaan RAM maksimal dan minimal per group
Mencari Nilai RAM per Proses
- Looping untuk setiap group
- Tampilkan informasi group
- 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
- 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)