Deskripsi Masalah
Paket loss kadang terjadi saat menghubungkan ke aplikasi pada Instance ECS. Jaringan periferal dari Instance ECS berfungsi normal. Namun, ketika menjalankan perintah dmesg untuk memeriksa log kernel, pesan error "kernel: nf_conntrack: table full, dropping packet" muncul. Instance ECS yang mengalami masalah ini memenuhi kondisi berikut:
Gambar:
aliyun-2.1903-x64-20G-alibase-20190327.vhdatau yang lebih baru.Kernel:
kernel-4.19.24-9.al7atau yang lebih baru.
Penyebab
Modul NAT nf_conntrack melacak entri koneksi dalam sistem operasi Linux menggunakan tabel hash untuk mencatat koneksi TCP yang telah dibuat. Ketika entri dalam tabel hash habis, pembuatan koneksi TCP baru menyebabkan modul melaporkan kesalahan "nf_conntrack: table full, dropping packet". Berikut adalah parameter-parameter penting dari modul nf_conntrack:
nf_conntrack_buckets: ukuran tabel hash. Parameter ini dapat ditentukan saat memuat modul atau diubah dengan perintahsysctl. Saat jumlah memori sistem lebih besar atau sama dengan 4 GB, nilai defaultnya adalah 65.536.nf_conntrack_max: jumlah maksimum node dalam tabel hash, yaitu jumlah maksimum koneksi yang didukung oleh modul
nf_conntrack. Saat jumlah memori sistem lebih besar atau sama dengan 4 GB, nilai defaultnya adalah 262.144. Untuk server dengan beban tinggi, Anda dapat meningkatkan nilainya sesuai kebutuhan bisnis.nf_conntrack_tcp_timeout_time_wait: durasi koneksi TCP dalam status TIME_WAIT yang disimpan dalam modul
nf_conntrack. Nilai defaultnya adalah 120 detik.
Solusi
Gunakan salah satu solusi berikut sesuai dengan skenario bisnis Anda.
Solusi 1: Gunakan antarmuka sysctl untuk mengubah nilai parameter dalam modul nf_conntrack
Estimasi nilai nf_conntrack_max yang diperlukan untuk aplikasi Anda, lalu jalankan perintah sysctl untuk mengubah nilai parameter dalam modul nf_conntrack. Contoh perintah:
sysctl -w net.netfilter.nf_conntrack_max=1503232
sysctl -w net.netfilter.nf_conntrack_buckets=375808 # Opsi ini tidak dapat dimodifikasi selama runtime jika versi kernel bukan 4.19.
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=60Nilai parameter dalam perintah hanya untuk referensi. Sesuaikan nilai berdasarkan kebutuhan bisnis Anda. Sebelum memodifikasi nilai parameter, buat snapshot untuk Instance ECS atau cadangkan file penting untuk memastikan keamanan data.
Saran untuk mengubah nilai parameter:
Jika aplikasi Anda melibatkan sejumlah besar koneksi singkat secara konkuren, pertimbangkan saran berikut: Untuk mencegah koneksi berlebih menghabiskan entri dalam tabel hash nf_conntrack, tingkatkan nilai parameter
nf_conntrack_maxdannf_conntrack_buckets. Pada sebagian besar kasus, nilai parameternf_conntrack_maxsebaiknya empat kali lipat dari nilai parameternf_conntrack_buckets.Ubah nilai parameter
nf_conntrack_bucketsdannf_conntrack_maxbersamaan. Jika hanya mengubah nilai parameternf_conntrack_max, daftar tertaut pada tabel hash mungkin menjadi panjang, mengurangi efisiensi query. Jika hanya mengubah nilai parameternf_conntrack_buckets, masalah penghapusan paket sebelumnya tetap ada.Sebelum mengubah nilai parameter
nf_conntrack_tcp_timeout_time_wait, pahami cara kerja parameter tersebut dan dampak potensial dari perubahan nilai. Kemudian, ubah nilai parameter dengan hati-hati berdasarkan skenario aplikasi dan data pemantauan kinerja. Berikut beberapa saran:Untuk aplikasi dengan tingkat konkurensi tinggi yang menangani sejumlah besar koneksi singkat dalam waktu singkat, seperti server web, atur parameter
nf_conntrack_tcp_timeout_time_waitke nilai kecil, seperti 30 atau 60. Ini mempercepat pengembalian sumber daya port dan mendukung lebih banyak koneksi baru. Namun, pastikan aplikasi dapat mentoleransi kemungkinan retransmisi sejumlah kecil data atau latensi.Jika aplikasi Anda memiliki persyaratan ketat untuk integritas data yang ditransmisikan, seperti sistem transaksi keuangan, gunakan nilai default parameter
nf_conntrack_tcp_timeout_time_waitatau atur ke nilai yang mendekati nilai default. Ini memastikan semua paket data ditransmisikan sesuai harapan.Pada jaringan dengan latensi tinggi atau tidak stabil, nilai kecil parameter
nf_conntrack_tcp_timeout_time_waitdapat meningkatkan risiko kehilangan data, sehingga nilai yang lebih besar mungkin diperlukan.
Solusi 2: Gunakan utilitas Iptables untuk menyaring koneksi yang tidak perlu dilacak
Jalankan perintah berikut untuk menambahkan parameter -j NOTRACK ke aturan Iptables guna menyaring koneksi yang tidak perlu dilacak. Metode ini menghapus catatan koneksi yang tidak relevan dari tabel hash dan mencegah koneksi berlebih menyebabkan kesalahan "kernel: nf_conntrack: table full, dropping packet".
sudo iptables -t raw -A PREROUTING -p udp -j NOTRACK
sudo iptables -t raw -A PREROUTING -p tcp --dport 22 -j NOTRACKPerintah di atas hanya untuk referensi. Mereka dirancang untuk mencegah modul nf_conntrack melacak koneksi UDP dan koneksi TCP melalui port 22. Anda dapat memodifikasi perintah sesuai kebutuhan bisnis Anda.