🐧 The project specifications are taken from roadmap.sh. Feel free to take a look and do your own if you interested.
Goal
Write a script to analyse performance stats.
Requirements
You are required to write a script
server-stats.sh
that can analyse basic server performance stats. You should be able to run the script to any Linux server and it should give you the following stats:- Total CPU usage
- Total memory usage (Free & Used including percentage
- Total disk usage (Free & Used including percentage)
- Top 5 processes by CPU usage
- Top 5 processes by memory usage
Stretch goal:
- OS Version
- Uptime
- Load average
- Logged in users
- Failed login attempts
Menyiapkan EnvironmentPerintah Bawaan LinuxCPU UsageMemory UsageDisk UsageTop 5 Processes by CPU UsageTop 5 Processes by Memory UsageOS VersionUptimeLoad AverageLogged in UsersFailed Login Attempt
Menyiapkan Environment
Proyek ini akan mendemonstrasikan dua hal, mendapatkan metrik sistem dengan perintah bawaan Linux dan mengotomatiskan proses tersebut.
Pertama, kita lihat dulu batasannya. Script yang dibuat harus bisa berjalan di semua environment Linux server. Mungkin untuk pengembangan kita akan buat dulu aja di satu distribusi Linux seperti Ubuntu, baru nanti kalo udah jadi kita test lagi di distribusi lainnya.
Gua akan coba buat dulu aja VM nya dengan Hyper-V. Kalian bisa lihat artikel gua yang satu ini tentang cara mengsetup local VM dengan Hyper-V How To Have a Data Center On Your Laptop using Hyper-V.
Berikut udah ready VM Ubuntu Server versi 24.04:
Perintah Bawaan Linux
Jadi kita mesti dapetin 10 data metrik. Kita coba bahasa satu per satu metrik tersebut dan coba eksplor apa perintah built-in Linux untuk metrik-metrik ini. Mungkin gua akan coba dapetin definisi dari tiap metrik kali ya biar bisa paham sekalian maksud dari setiap metrik stats ini apa.
CPU Usage
Apa itu CPU Usage? Well singkatnya komputer bekerja dengan komponen bernama CPU atau Central Processing Unit. Dalam sebuah sistem, penggunaan CPU dihitung berdasarkan jumlah kapasitas CPU yang digunakan dengan jumlah kapasitas CPU yang tersedia. Maka, satuan nya biasa dihitung dengan persentase (%).
Sedikit pemahaman karena kapasitas maupun arsitektur CPU di setiap sistem berbeda-beda, maka angka ini hanya relevan jika dipakai untuk menghitung load kerja dalam satu sistem. Jadi setidaknya kita bisa tahu pada satu waktu seberapa besar workload yang sedang diproses.
Langsung aja untuk command nya, dari Linux tersedia command bawaan bernama
top
. Jika kita menjalankan command ini, maka kita dapat langsung mendapat statistik sistem yang terupdate setiap 1-2 detik:Dari command
top
ini perhatikan baris ketiga yakni %Cpu(s):Kita fokus pada angka disebelah
id
, yang adalah singkatan dari idle. Angka ini sangat berguna untuk menghitung CPU Usage dimana angka ini menunjukkan persentase CPU yang tidak digunakan. Sehingga jika ingin menghitung CPU yang sedang digunakan, maka tinggal mengurangi 100 dengan angka tersebut. Sangat sederhana bukan.Sekarang, gimana cara mendapatkannya. Triknya pertama adalah dari command
top
, kita perlu mengcapture hasil angkanya pada satu batch, karena command top
akan terus mengupdate angkanya setiap 1-2 detik. Maka, kita gunakan flag -bn2
Flag b supaya angka tidak diupdate terus menerus, dan flag n2 supaya kita mengcapture di dua kali iterasi (supaya kita mendapat hasil akurat karena iterasi pertama akan relatif lebih besar). top -bn2
Next, kita dapetin line dengan baris ‘%CPU’. Kita bisa gunakan pipeline lalu dapetin line nya dengan command
grep
. Karena kita mendapat dua iterasitop -bn2 | grep '%Cpu' | tail -1 | grep -P '(....|...) id,'| \ awk '{print "CPU Usage: " 100-$8 "%"}'
Explanation
top -bn2
- Runs
top
in batch mode (b
) with 2 iterations (n2
). The first iteration can sometimes show inaccurate results, so the second iteration gives more accurate data.
grep '%Cpu'
- Filters the lines containing
%Cpu
, where CPU statistics are shown.
tail -1
- Takes the last occurrence of
%Cpu
, which corresponds to the second iteration.
grep -P '(....|...) id,'
- This ensures the matching of
id
(idle time) value, regardless of whether it is 3 or 4 characters wide, such as97.4
or7.2
.
awk '{print "CPU Usage: " 100-$8 "%"}'
- Subtracts the idle CPU percentage (
$8
) from 100 to calculate CPU usage. $8
corresponds to the idle (id
) percentage value.
Memory Usage
free -b | awk '/Mem:/ {print $3}'
Disk Usage
All partition total:
df -B1 --total | awk '/total/ {print "Total: " $2 " bytes, Used: " $3 " bytes, Available: " $4 " bytes"}'
Per partition:
df -h | awk 'NR>1 {print "Partition: " $1 ", Total: " $2 ", Used: " $3 ", Available: " $4 ", Mounted on: " $6}'
Top 5 Processes by CPU Usage
ps -eo pid,user,%cpu,%mem,command --sort=-%cpu | head -n 6
Top 5 Processes by Memory Usage
ps -eo pid,user,%cpu,%mem,command --sort=-%mem | head -n 6
OS Version
echo "$(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"') - Kernel $(uname -r)"
Uptime
awk '{printf "Uptime: %d days, %d hours, %d minutes\n", $1/86400, ($1%86400)/3600, ($1%3600)/60}' /proc/uptime
Load Average
cat /proc/loadavg
Logged in Users
who
Failed Login Attempt
lastb