Memecahkan masalah kesalahan koneksi keluar terputus-terputus di Azure App Service

Artikel ini membantu Anda memecahkan masalah kesalahan koneksi terputus-terputus dan masalah performa terkait di Azure App Service. Ini memberikan informasi lebih lanjut tentang, dan metodologi pemecahan masalah untuk, kelelahan port terjemahan alamat jaringan sumber (SNAT). Jika Anda sewaktu-waktu memerlukan bantuan lebi lanjut dalam artikel ini, hubungi pakar Azure di forum MSDN Azure dan Stack Overflow. Atau, ajukan insiden dukungan Azure. Buka situs Dukungan Azure lalu pilih Dapatkan Dukungan.

Gejala

Aplikasi dan Fungsi yang dihosting di layanan Azure App dapat menunjukkan satu atau beberapa gejala berikut:

  • Waktu respons lambat pada semua atau beberapa instans dalam paket layanan.
  • Kesalahan Intermittent 5xx atau Gateway Buruk
  • Pesan kesalahan waktu habis
  • Tidak dapat tersambung ke titik akhir eksternal (seperti SQLDB, Service Fabric, layanan Aplikasi lainnya, dll.)

Penyebab

Penyebab utama untuk masalah koneksi terputus-terputus adalah tercapainya batasan saat membuat koneksi keluar baru. Batasan yang dapat Anda capai meliputi:

  • Koneksi TCP: Ada batasan jumlah koneksi keluar yang dapat dibuat. Batasan koneksi keluar berkaitan dengan ukuran pekerja yang digunakan.
  • Port SNAT: Koneksi keluar di Azure menjelaskan pembatasan port SNAT dan bagaimana pengaruhnya terhadap koneksi keluar. Azure menggunakan NAT sumber (SNAT) dan Azure Load Balancer (tidak terekspos ke pelanggan) untuk berkomunikasi dengan alamat IP publik. Setiap instans pada layanan Azure App awalnya diberi jumlah 128 port SNAT yang telah dialokasikan sebelumnya. Batas port SNAT memengaruhi pembukaan koneksi ke kombinasi alamat dan port yang sama. Jika aplikasi Anda membuat koneksi ke campuran kombinasi alamat dan port, Anda tidak akan menggunakan port SNAT Anda. Port SNAT habis ketika Anda melakukan panggilan berulang ke alamat dan kombinasi port yang sama. Setelah port dirilis, port tersedia untuk digunakan kembali sesuai kebutuhan. Penyeimbang beban Azure Network akan mengklaim kembali port SNAT dari koneksi tertutup hanya setelah menunggu 4 menit.

Ketika aplikasi atau fungsi dengan cepat membuka koneksi baru, aplikasi dapat dengan cepat menghabiskan kuota yang telah dialokasikan sebelumnya dari 128 port. Mereka kemudian diblokir sampai port SNAT baru tersedia, baik melalui mengalokasikan lebih banyak port SNAT secara dinamis, atau melalui penggunaan kembali port SNAT yang diklaim kembali. Jika aplikasi Anda kehabisan port SNAT, aplikasi tersebut akan mengalami masalah konektivitas keluar yang terputus-terputus.

Menghindari masalah

Ada beberapa solusi yang dapat Anda gunakan unuk menghindari keterbatasan port SNAT. Dukungan tersebut termasuk:

  • kumpulan koneksi: Dengan mengumpulkan koneksi Anda, Anda menghindari membuka koneksi jaringan baru untuk panggilan ke alamat dan port yang sama.
  • titik akhir layanan: Anda tidak memiliki batasan port SNAT ke layanan yang diamankan dengan titik akhir layanan.
  • titik akhir privat: Anda tidak memiliki batasan port SNAT ke layanan yang diamankan dengan titik akhir privat.
  • NAT gateway: Dengan NAT gateway, Anda memiliki 64k port SNAT keluar yang dapat digunakan oleh sumber daya yang mengirim lalu lintas melaluinya.

Untuk menghindari masalah port SNAT, Anda mencegah pembuatan koneksi baru secara berulang ke host dan port yang sama. Kumpulan koneksi adalah salah satu cara yang lebih jelas untuk menyelesaikan masalah tersebut.

Jika tujuan Anda adalah layanan Azure yang mendukung titik akhir layanan, Anda dapat menghindari masalah kehabisan port SNAT dengan menggunakan Integrasi VNet regional dan titik akhir layanan atau titik akhir privat. Saat Anda menggunakan Integrasi VNet regional dan menempatkan titik akhir layanan pada subnet integrasi, lalu lintas keluar aplikasi Anda ke layanan tersebut tidak akan memiliki batasan port SNAT keluar. Demikian juga, jika Anda menggunakan Integrasi VNet regional dan titik akhir privat, Anda tidak akan memiliki masalah port SNAT keluar ke tujuan tersebut.

Jika tujuan Anda adalah titik akhir eksternal di luar Azure, menggunakan NAT gateway akan memberi Anda 64k port SNAT keluar. Ini juga memberi Anda alamat keluar khusus yang tidak boleh Anda bagikan dengan siapa pun.

Jika memungkinkan, tingkatkan kode Anda untuk menggunakan kumpulan koneksi dan hindari seluruh masalah ini. Mengubah kode dengan cepat untuk mengurangi situasi ini tidak selalu dapat dilakukan. Untuk kasus saat Anda tidak dapat mengubah kode tepat waktu, manfaatkan solusi lainnya. Solusi terbaik untuk masalah ini adalah menggabungkan semua solusi sebaik mungkin. Cobalah untuk menggunakan titik akhir layanan dan titik akhir privat untuk layanan Azure dan NAT gateway untuk sisanya.

Strategi umum untuk mengurangi kehabisan port SNAT dibahas di bagian Pemecahan Masalah dari dokumentasi Koneksi keluar dari Azure. Dari semua strategi tersebut, strategi berikut ini dapat diterapkan untuk aplikasi dan fungsi yang dihosting di layanan Azure App.

Mengubah aplikasi untuk menggunakan kumpulan koneksi

Berikut adalah kumpulan tautan untuk menerapkan Pengumpulan koneksi dengan tumpukan solusi yang berbeda.

Simpul

Secara default, koneksi untuk NodeJS tidak tetap hidup. Di bawah ini adalah database dan paket populer untuk pengumpulan koneksi yang berisi contoh cara penerapannya.

HTTP Tetap Aktif

Java

Di bawah ini adalah pustaka populer yang digunakan untuk pooling koneksi JDBC yang berisi contoh cara menerapkannya: Pengumpulan Koneksi JDBC.

Pengumpulan Koneksi HTTP

PHP

Meskipun PHP tidak mendukung pengumpulan koneksi, Anda dapat mencoba menggunakan Penghubungan Database persisten ke server back-end Anda.

Python

Di bawah ini adalah database dan modul populer untuk pengumpulan koneksi yang berisi contoh cara mengimplementasikannya.

Pengumpulan Koneksi HTTP

  • Pengumpulan koneksi tetap aktif dan HTTP diaktifkan secara default dalam modul Permintaan .
  • Urllib3

Mengubah aplikasi untuk menggunakan kembali koneksi

Mengubah aplikasi untuk menggunakan logika coba lagi yang tidak terlalu agresif

Gunakan keepalive untuk mengatur ulang batas waktu habis siaga keluar

Panduan lebih spesifik untuk App Service:

  • Tes beban harus menyimulasikan data dunia nyata dalam kecepatan umpan yang stabil. Pengujian aplikasi dan fungsi di dunia nyata dapat mengidentifikasi dan menyelesaikan masalah kehabisan port SNAT sebelumnya.
  • Pastikan bahwa layanan ujung belakang dapat mengembalikan respons dengan cepat. Untuk pemecahan masalah performa dengan Azure SQL Database, tinjau Memecahkan masalah performa Azure SQL Database dengan Wawasan Cerdas.
  • Perluas skala paket App Service ke lebih banyak instans. Untuk informasi lebih lanjut tentang penskalaan, lihat Menskalakan aplikasi di Azure App Service. Setiap instans pekerja dalam paket layanan aplikasi dialokasikan sejumlah port SNAT. Jika Anda menyebarkan penggunaan di lebih banyak instans, Anda mungkin mendapatkan penggunaan port SNAT per instans di bawah batas yang disarankan dari 100 koneksi keluar, per titik akhir jarak jauh yang unik.
  • Pertimbangkan untuk pindah ke App Service Environment (ASE), di mana Anda dialokasikan satu alamat IP keluar, dan batasan untuk koneksi dan port SNAT lebih tinggi. Dalam ASE, jumlah port SNAT per instans didasarkan pada tabel praalokasi penyeimbang muatan Azure. Misalnya, ASE dengan 1-50 instans pekerja memiliki 1024 port yang telah dialokasikan sebelumnya per instans, sementara ASE dengan 51-100 instans pekerja memiliki 512 port yang telah dialokasikan sebelumnya per instans.

Menghindari batas TCP keluar lebih mudah diatasi, karena batas ditetapkan oleh ukuran pekerja Anda. Anda dapat melihat batasan tersebut di Batas Numerik Kotak Pasir Lintas VM - Koneksi TCP

Nama batas Deskripsi Kecil (A1) Sedang (A2) Besar (A3) Tingkat terisolasi (ASE)
Koneksi Jumlah koneksi di seluruh komputer virtual 1920 3968 8064 16.000

Untuk menghindari batas TCP keluar, Anda dapat meningkatkan ukuran pekerja Anda, atau meluaskan skala secara horizontal.

Pemecahan Masalah

Mengetahui dua jenis batas koneksi keluar, dan apa yang dilakukan aplikasi Anda, akan mempermudah pemecahan masalah. Jika Anda mengetahui bahwa aplikasi Anda melakukan banyak panggilan ke akun penyimpanan yang sama, Anda mungkin harus mencurigai batas SNAT. Jika aplikasi Anda membuat banyak panggilan ke titik akhir di seluruh internet, Anda akan menduga Anda mencapai batas VM.

Jika Anda tidak cukup mengetahui perilaku aplikasi untuk menentukan penyebabnya dengan cepat, ada beberapa alat dan teknik yang tersedia di App Service untuk membantu penentuan tersebut.

Temukan informasi alokasi port SNAT

Anda dapat menggunakan Diagnostik App Service untuk menemukan informasi alokasi port SNAT, dan mengamati metrik alokasi port SNAT dari situs App Service. Untuk menemukan informasi alokasi port SNAT, ikuti langkah-langkah berikut:

  1. Untuk mengakses diagnostik App Service, beralihkan ke aplikasi web App Service atau Lingkungan App Service di portal Microsoft Azure. Di navigasi kiri, pilih Diagnosis dan selesaikan masalah.
  2. Pilih Kategori Ketersediaan dan Performa
  3. Pilih petak SNAT Port Exhaustion dalam daftar petak yang tersedia di bagian kategori tersebut. Tujuannya adalah untuk tetap di bawah 128. Jika Anda membutuhkannya, Anda masih dapat membuka tiket dukungan, dan teknisi dukungan akan mendapatkan metrik dari ujung belakang untuk Anda.

Karena penggunaan port SNAT tidak tersedia sebagai metrik, tidak dimungkinkan untuk menskalakan otomatis berdasarkan penggunaan port SNAT, atau untuk mengonfigurasi skala otomatis berdasarkan metrik alokasi port SNAT.

Sambungan TCP dan Port SNAT

Koneksi TCP dan port SNAT tidak terkait langsung. Detektor penggunaan koneksi TCP disertakan dalam halaman manajemen Diagnosis dan Selesaikan Masalah dari aplikasi App Service apa pun. Cari frasa "koneksi TCP" untuk menemukannya.

  • Port SNAT hanya digunakan untuk aliran jaringan eksternal, sedangkan total Sambungan TCP menyertakan sambungan loopback lokal.
  • Port SNAT dapat dibagikan oleh alur yang berbeda, jika alurnya berbeda baik dalam protokol, alamat IP, atau port. Metrik Koneksi TCP menghitung setiap koneksi TCP.
  • Batas koneksi TCP terjadi pada tingkat instans pekerja. Penyeimbangan beban keluar Azure Network tidak menggunakan metrik Koneksi TCP untuk pembatasan port SNAT.
  • Batas koneksi TCP dijelaskan dalam Batas Numerik Kotak Pasir Lintas VM - Koneksi TCP
  • Sesi TCP yang ada gagal ketika sesi TCP keluar baru ditambahkan dari port sumber Azure App Service. Anda dapat menggunakan satu IP atau mengonfigurasi ulang anggota kumpulan backend untuk menghindari konflik.
Nama batas Deskripsi Kecil (A1) Sedang (A2) Besar (A3) Tingkat terisolasi (ASE)
Koneksi Jumlah koneksi di seluruh komputer virtual 1920 3968 8064 16.000

Koneksi WebJob dan Database

Jika port SNAT habis, dan WebJobs tidak dapat terhubung ke SQL Database, tidak ada metrik untuk menunjukkan berapa banyak koneksi yang dibuka oleh setiap proses aplikasi web individu. Untuk menemukan WebJob yang bermasalah, pindahkan beberapa WebJob ke paket App Service lain untuk melihat apakah situasinya membaik, atau jika masalah tetap ada di salah satu paket. Ulangi proses hingga Anda menemukan WebJob yang bermasalah.

Informasi tambahan