Restart otomatis Debian ketika penggunaan memori mencapai 99% dapat diimplementasikan dengan beberapa cara. Pendekatan yang paling umum melibatkan penggunaan script yang dipadukan dengan cron job atau systemd service untuk memantau penggunaan memori dan memicu restart jika ambang batas tercapai.
Penting untuk Dipertimbangkan Sebelum Menerapkan:
- Penyebab Penggunaan Memori Tinggi: Restart otomatis adalah solusi sementara. Anda harus mencari tahu akar penyebab penggunaan memori yang tinggi (misalnya, memory leak di aplikasi, konfigurasi yang salah, atau beban kerja yang terlalu besar untuk kapasitas server Anda). Restart otomatis hanya mengatasi gejalanya.
- Risiko Restart Otomatis: Restart paksa dapat menyebabkan kehilangan data jika aplikasi tidak dimatikan dengan benar. Pastikan aplikasi Anda dapat menangani pemadaman yang tiba-tiba, atau pertimbangkan untuk mengimplementasikan graceful shutdown sebelum restart.
- Alternatif: Daripada langsung restart, Anda mungkin ingin mencoba membersihkan cache memori (
sync; echo 3 > /proc/sys/vm/drop_caches
) atau me-restart layanan spesifik yang mengonsumsi memori paling banyak terlebih dahulu. Restart sistem adalah upaya terakhir.
Berikut adalah beberapa metode yang bisa Anda gunakan:
Metode 1: Menggunakan Script Bash dengan Cron Job (Paling Sederhana)
Ini adalah cara yang paling cepat dan mudah untuk diimplementasikan.
-
Buat Script Pemantau Memori: Buat file baru, misalnya
/usr/local/bin/mem_monitor.sh
, dan isi dengan kode berikut:Bash#!/bin/bash # Ambang batas penggunaan memori (dalam persen) # Sesuaikan sesuai kebutuhan, misalnya 95 atau 99 MEM_THRESHOLD=99 # Dapatkan penggunaan memori saat ini dalam persen # Menggunakan 'free -m' untuk MB, lalu kalkulasi persen # -m: menampilkan dalam MB # awk '{print $NF}' di baris kedua (Mem:) adalah kolom 'used' (kolom 3) # kolom 4 adalah 'free', kolom 6 adalah 'available' # Pada sistem Linux modern, 'available' adalah metrik yang lebih baik untuk ketersediaan memori bagi aplikasi baru. # Namun, untuk deteksi 99% usage, 'used' masih relevan jika Anda ingin mencegah server crash. # Atau bisa juga pakai: PERCENTAGE=$(free | awk '/Mem:/ { printf("%d\n", ($3/$2)*100) }') # Atau jika ingin pakai available memory: PERCENTAGE=$(free | awk '/Mem:/ { printf("%d\n", ($3/$2)*100) }') # Atau lebih tepatnya pakai: PERCENTAGE=$(free | awk '/Mem:/ { print 100 - ($7/$2)*100 }' | cut -d'.' -f1) # ($7 adalah available, $2 adalah total) # Contoh yang lebih robust menggunakan available TOTAL_MEM=$(free -m | awk 'NR==2{print $2}') AVAILABLE_MEM=$(free -m | awk 'NR==2{print $7}') # Available memory, lebih akurat USED_MEM_PERCENT=$(( (TOTAL_MEM - AVAILABLE_MEM) * 100 / TOTAL_MEM )) LOG_FILE="/var/log/mem_monitor.log" DATE=$(date +"%Y-%m-%d %H:%M:%S") echo "$DATE - Current memory usage: $USED_MEM_PERCENT%" >> "$LOG_FILE" if [ "$USED_MEM_PERCENT" -ge "$MEM_THRESHOLD" ]; then echo "$DATE - Memory usage ($USED_MEM_PERCENT%) reached threshold ($MEM_THRESHOLD%). Restarting system." >> "$LOG_FILE" /sbin/shutdown -r now # Perintah untuk restart fi
-
Buat Script Bisa Dieksekusi:
Bashsudo chmod +x /usr/local/bin/mem_monitor.sh
-
Tambahkan ke Cron Job: Edit crontab untuk user root:
Bashsudo crontab -e
Tambahkan baris berikut di akhir file untuk menjalankan script setiap 5 menit (Anda bisa sesuaikan frekuensinya):
Code snippet*/5 * * * * /usr/local/bin/mem_monitor.sh >> /var/log/mem_monitor_cron.log 2>&1
*/5 * * * *
: Menjalankan setiap 5 menit.>> /var/log/mem_monitor_cron.log 2>&1
: Mengalihkan output standar dan error ke file log terpisah untuk debugging cron.
Metode 2: Menggunakan Systemd Service (Lebih Modern dan Robust)
Metode ini lebih disukai pada sistem Linux modern karena menawarkan integrasi yang lebih baik dengan systemd dan kontrol yang lebih granular.
-
Buat Script Pemantau Memori: Sama seperti Metode 1, simpan script Anda di
/usr/local/bin/mem_monitor.sh
. Pastikan tidak ada perintahshutdown -r now
di dalamnya untuk saat ini. Kita akan memicu restart dari service systemd itu sendiri.Bash#!/bin/bash MEM_THRESHOLD=99 TOTAL_MEM=$(free -m | awk 'NR==2{print $2}') AVAILABLE_MEM=$(free -m | awk 'NR==2{print $7}') USED_MEM_PERCENT=$(( (TOTAL_MEM - AVAILABLE_MEM) * 100 / TOTAL_MEM )) echo "Current memory usage: $USED_MEM_PERCENT%" if [ "$USED_MEM_PERCENT" -ge "$MEM_THRESHOLD" ]; then exit 1 # Keluar dengan status non-nol jika ambang batas tercapai else exit 0 # Keluar dengan status nol jika OK fi
-
Buat Script Bisa Dieksekusi:
Bashsudo chmod +x /usr/local/bin/mem_monitor.sh
-
Buat Unit Systemd Timer: Buat file baru bernama
/etc/systemd/system/mem_monitor.timer
:Ini, TOML[Unit] Description=Run memory monitor script every 5 minutes [Timer] OnBootSec=1min OnUnitActiveSec=5min Unit=mem_monitor.service [Install] WantedBy=timers.target
-
Buat Unit Systemd Service: Buat file baru bernama
/etc/systemd/system/mem_monitor.service
:Ini, TOML[Unit] Description=Monitor memory usage and restart if necessary After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/mem_monitor.sh # Perintah di bawah ini akan dijalankan jika ExecStart keluar dengan status non-nol (yaitu, memori tinggi) OnFailure=reboot.target # Trigger reboot.target jika script gagal (exit 1) # Atau, jika Anda ingin lebih spesifik: # ExecStopPost=/sbin/shutdown -r now [Install] WantedBy=multi-user.target
OnFailure=reboot.target
: Ini akan memicu system reboot jika scriptmem_monitor.sh
keluar dengan status non-nol.- Catatan:
Type=oneshot
berarti service akan berjalan sekali dan kemudian berhenti.OnFailure
hanya berlaku jika service gagal.
-
Reload Systemd, Enable, dan Start Timer:
Bashsudo systemctl daemon-reload sudo systemctl enable mem_monitor.timer sudo systemctl start mem_monitor.timer
-
Cek Status:
Bashsudo systemctl status mem_monitor.timer sudo systemctl status mem_monitor.service journalctl -u mem_monitor.service -f # Untuk melihat log dari service
Pertimbangan Keamanan dan Robustness:
- Pengguna (User): Pastikan script dieksekusi dengan hak akses yang memadai (
root
untukshutdown -r now
). Cron jobsudo crontab -e
menjalankan sebagai root. Systemd service juga berjalan sebagai root secara default. - Logging: Selalu tambahkan logging yang cukup untuk melacak kapan script berjalan dan apa hasilnya.
- Ambang Batas: Pilih ambang batas dengan hati-hati. Terlalu rendah bisa menyebabkan restart yang tidak perlu. Terlalu tinggi bisa menyebabkan server crash sebelum restart.
- Prioritas: Pastikan tidak ada proses lain yang memiliki prioritas lebih tinggi yang dapat mencegah perintah
shutdown
dijalankan. drop_caches
(Alternatif yang Lebih Lembut): Pertimbangkan untuk membersihkan cache memori terlebih dahulu sebelum restart. Anda bisa menambahkan baris ini ke script Anda:Bash# Dalam mem_monitor.sh, sebelum perintah shutdown if [ "$USED_MEM_PERCENT" -ge "$MEM_THRESHOLD" ]; then echo "$DATE - Memory usage ($USED_MEM_PERCENT%) reached threshold ($MEM_THRESHOLD%). Trying to drop caches." >> "$LOG_FILE" sudo sync sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' sleep 10 # Beri waktu untuk sistem menyesuaikan # Hitung ulang memori, dan baru restart jika masih tinggi TOTAL_MEM_AFTER=$(free -m | awk 'NR==2{print $2}') AVAILABLE_MEM_AFTER=$(free -m | awk 'NR==2{print $7}') USED_MEM_PERCENT_AFTER=$(( (TOTAL_MEM_AFTER - AVAILABLE_MEM_AFTER) * 100 / TOTAL_MEM_AFTER )) echo "$DATE - Memory usage after dropping caches: $USED_MEM_PERCENT_AFTER%" >> "$LOG_FILE" if [ "$USED_MEM_PERCENT_AFTER" -ge "$MEM_THRESHOLD" ]; then echo "$DATE - Still high. Restarting system." >> "$LOG_FILE" /sbin/shutdown -r now fi fi
Pilih metode yang paling sesuai dengan tingkat kenyamanan dan kebutuhan pengelolaan sistem Anda. Systemd adalah pendekatan yang lebih modern, tetapi cron job lebih cepat untuk disiapkan.
No comments:
Post a Comment