Create a Script to Analyze Basic Server Performance Stats

Create a Script to Analyze Basic Server Performance Stats

Status
Done
Created
Nov 25, 2024 09:54 AM
Tags
Project
🐧 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:
  1. Total CPU usage
  1. Total memory usage (Free & Used including percentage
  1. Total disk usage (Free & Used including percentage)
  1. Top 5 processes by CPU usage
  1. Top 5 processes by memory usage
Stretch goal:
  1. OS Version
  1. Uptime
  1. Load average
  1. Logged in users
  1. Failed login attempts

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:
notion image

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:
notion image
Dari command top ini perhatikan baris ketiga yakni %Cpu(s):
notion image
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 iterasi
top -bn2 | grep '%Cpu' | tail -1 | grep -P '(....|...) id,'| \ awk '{print "CPU Usage: " 100-$8 "%"}'
Explanation
  1. 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.
  1. grep '%Cpu'
      • Filters the lines containing %Cpu, where CPU statistics are shown.
  1. tail -1
      • Takes the last occurrence of %Cpu, which corresponds to the second iteration.
  1. grep -P '(....|...) id,'
      • This ensures the matching of id (idle time) value, regardless of whether it is 3 or 4 characters wide, such as 97.4 or 7.2.
  1. 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