全部产品
Search
文档中心

:Apa yang harus saya lakukan jika aplikasi pada Instance ECS sesekali menjatuhkan paket data dan pesan error "kernel: nf_conntrack: table full, dropping packet" muncul di log kernel?

更新时间:Jul 02, 2025

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.vhd atau yang lebih baru.

  • Kernel: kernel-4.19.24-9.al7 atau 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 perintah sysctl. 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=60
Penting

Nilai 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.

Catatan

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_max dan nf_conntrack_buckets. Pada sebagian besar kasus, nilai parameter nf_conntrack_max sebaiknya empat kali lipat dari nilai parameter nf_conntrack_buckets.

  • Ubah nilai parameter nf_conntrack_buckets dan nf_conntrack_max bersamaan. Jika hanya mengubah nilai parameter nf_conntrack_max, daftar tertaut pada tabel hash mungkin menjadi panjang, mengurangi efisiensi query. Jika hanya mengubah nilai parameter nf_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_wait ke 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_wait atau 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_wait dapat 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 NOTRACK
Catatan

Perintah 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.

Referensi