April 24, 2012

Menggunakan TCP Keepalive Untuk Error Network

tcp keepalive
Menggunakan TCP keepalive untuk error network digunakan ketika terjadi suatu error pada jaringan dalam suatu sistem operasi, error tersebut dapat meliputi koneksi yang tidak tertutup atau menggantung, sehingga menyebabkan terjadinya antrian yang mengganggu kestabilan suatu proses dalam sistem operasi.

Ini pernah menjadi pengalaman yang saya alami, ketika itu koneksi database untuk postgresql yang berasal dari aplikasi java ada yang tidak tertutup, sehingga menyebabkan terjadinya antrian yang menurut analisa saya pribadi tidak akan ada habisnya, koneksi yang tidak tertutup ada di dua form yaitu pencetakan laporan dan form login.

Error terlihat di dalam log postgresql yang menyebutkan telah terjadi situasi dead lock untuk tabel yang digunakan sebagai login dan laporan, yang menyebabkan database stack dan berhenti beroperasi, otomatis pengguna juga tidak bisa mengakses aplikasi. Situasi seperti itu dapat normal kembali setelah database di reload atau di reboot.

Hanya menurut saya, hal itu bukanlah suatu solusi yang baik, karena hal tiu akan terus berulang-ulang terjadi. Akhirnya melalu search engine andalan "google" saya berusaha mencari solusi permanennya, dan ada dua hal yang saya dapatkan , yaitu :

1 . Membuka script diaplikasi dan melakukan close koneksi untuk dua form tersebut.
2.  Untuk mengantisipasi adanya koneksi yang tidak tertutup, tcp keepalive menjadi pilihan terbaik, Namun
     sayang tcp keepalive yang ada dikonfigurasi postgresql tidak bisa digunakan, jadi saya terpaksa
     mengkonfigurasinya dari sisi sistem operasi.

Ini petunjuk yang saya dapatkan untuk setting tcp keepalive dari beberapa sistem operasi dari hasil googling:

Sistem Operasi Linux
Gunakan perintah sysctl -A untuk mengetahui list variabel yang terdapat dalam kernel
dan grep untuk list net.ipv4 setting (sysctl -A | grep net.ipv4).
Temukan variable seperti dibawah ini :
- net.ipv4.tcp_keepalive_time- net.ipv4.tcp_keepalive_probes - net.ipv4.tcp_keepalive_intvl

Untuk memanipulasinya gunakan perintah berikut :
sysctl -w
net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_intvl=10

Perintah diatas mengubah TCP keepalive timeout menjadi 60 detik dengan 3 probes,
10 detik jarak/interval keduanya. Jadi koneksi TCP dari aplikasi akan dianggap mati atau terputus
setelah 90 detik (60 + 10 + 10 + 10)

FreeBSD and MacOS X
Untuk melihat list TCP settings (FreeBSD 4.8 ke atas dan 5.4):
sysctl -A | grep net.inet.tcp, temukan :
net.inet.tcp.keepidle
net.inet.tcp.keepintvl
net.inet.tcp.always_keepalive

Cara menghitung TCP koneksi
net.inet.tcp.keepidle + (net.inet.tcp.keepintvl x 8)

Hasilnya adalah dalam milliseconds, contoh :
net.inet.tcp.keepidle = 10000
net.inet.tcp.keepintvl = 5000
net.inet.tcp.always_keepalive =1 (harus selalu 1)

Sistem akan memutuskan sambungan setelah Koneksi TCP terputus dalam waktu:
10000 + (5000 x 8) = 50000 msec (50 sec)

Agar hal ini terpanggil saat sistem menyala, tambahkanlah hal tersebut diatas di /etc/sysctl.conf file.

Solaris
Untuk melihat list TCP settings:

ndd /dev/tcp \?
Keepalive related variables:
- tcp_keepalive_interval - idle timeout
Contoh:
ndd -set /dev/tcp tcp_keepalive_interval 60000

Windows
Search Knowledge Base for article ID 120642:
http://support.microsoft.com/kb/120642/EN-US

Sesuaikan entry registry didalam :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

Demikianlah dan Terima kasih, salam.

No comments:

Post a Comment