Apa yang harus saya lakukan untuk memastikan bahwa IIS tidak mendaur ulang aplikasi saya?


83

Saya memiliki aplikasi layanan WCF yang di-host di IIS. Pada startup, ia pergi dan mengambil sumber daya yang sangat mahal (dalam hal waktu dan cpu) untuk digunakan sebagai cache lokal.

Sayangnya, IIS tampaknya mendaur ulang proses secara cukup teratur. Jadi saya mencoba mengubah pengaturan pada Application Pool untuk memastikan bahwa IIS tidak mendaur ulang aplikasi. Sejauh ini, saya telah mengubah yang berikut:

  • Batasi Interval di bawah CPU dari 5 hingga 0.
  • Waktu Istirahat menganggur dalam Model Proses dari 20 hingga 0.
  • Interval Waktu Reguler dalam Daur Ulang dari 1740 ke 0.

Apakah ini cukup? Dan saya memiliki pertanyaan spesifik tentang item yang saya ubah:

  1. Apa yang dimaksud secara khusus pengaturan Batas Interval di bawah CPU? Apakah ini berarti bahwa jika penggunaan CPU tertentu terlampaui, kumpulan aplikasi akan didaur ulang?
  2. Apa sebenarnya arti "daur ulang"? Apakah aplikasi sepenuhnya dihancurkan dan mulai lagi?
  3. Apa perbedaan antara "Shutdown Proses Pekerja" dan "Daur Ulang Application Pool"? Dokumentasi untuk Idle Time-out dalam Model Proses berbicara tentang mematikan proses pekerja. Sementara dokumen untuk Interval Waktu Reguler dalam Daur Ulang berbicara tentang daur ulang kumpulan aplikasi. Saya tidak begitu mengerti perbedaan antara keduanya. Saya pikir w3wp.exe adalah proses pekerja yang menjalankan kumpulan aplikasi. Bisakah seseorang menjelaskan perbedaan pada aplikasi antara keduanya?

Alasan untuk memiliki tag IIS7 dan IIS7.5 adalah karena aplikasi akan berjalan di keduanya dan berharap jawabannya sama antara versi.

Gambar untuk referensi: masukkan deskripsi gambar di sini


Di mana Anda mendapatkan tangkapan layar di atas dengan pengaturan untuk IIS?
Andrew William Ross

Itu lembar properti Advanced App Pool.
TristanK

Jawaban:


105

Mendaur ulang

Daur ulang biasanya * di mana IIS memulai proses baru sebagai wadah untuk aplikasi Anda, dan kemudian memberikan yang lama ke ShutdownTimeLimit untuk pergi dari kemauannya sendiri sebelum terbunuh.

* - biasanya: lihat pengaturan DisallowOverlappingRotation / "Disable overlapped recycle"

Ini destruktif , karena proses asli dan semua informasi statusnya dibuang. Menggunakan status sesi yang tidak dalam proses (mis. Server Negara atau database, atau bahkan cookie jika status Anda kecil) dapat memungkinkan Anda untuk mengatasi hal ini.

Tapi secara default tumpang tindih - yang berarti durasi pemadaman diminimalkan karena proses baru dimulai dan dihubungkan ke antrian permintaan, sebelum yang lama diberitahu "Anda memiliki [ShutdownTimeLimit] detik untuk pergi. Harap patuhi."

Pengaturan

Untuk pertanyaan Anda: semua pengaturan pada halaman tersebut mengontrol daur ulang dengan cara tertentu. "Shutdown" dapat digambarkan sebagai "daur ulang proaktif" - di mana proses itu sendiri memutuskan saatnya untuk pergi, dan keluar dengan tertib.

Daur ulang reaktif adalah tempat WAS mendeteksi masalah dan memotret proses (setelah membuat W3WP pengganti yang sesuai).

Sekarang, inilah beberapa hal yang dapat menyebabkan daur ulang dari satu bentuk atau lainnya:

  • sebuah ISAPI memutuskan itu tidak sehat
  • modul apa pun mogok
  • batas waktu idle
  • pembatasan cpu
  • menyesuaikan properti kumpulan aplikasi
    • seperti ibumu mungkin berteriak pada satu titik: "Berhenti mengambil itu, atau itu tidak akan pernah menjadi lebih baik!"
  • "ping" kegagalan * tidak benar-benar ping per se, karena menggunakan pipa bernama - lebih banyak "deteksi hidup"
  • semua pengaturan pada tangkapan layar di atas

Apa yang harus dilakukan:

Umumnya:

  • Nonaktifkan batas waktu Idle . 20 menit tidak aktif = boom! Proses baru pada permintaan masuk berikutnya. Setel ke nol.

  • Nonaktifkan Interval waktu reguler - standar 29 jam telah digambarkan sebagai "gila", "menjengkelkan" dan "pintar" oleh berbagai pihak. Sebenarnya, hanya dua yang benar.

  • Secara opsional Aktifkan DisallowRotationOnConfigChange (di atas, Nonaktifkan Reycling untuk perubahan konfigurasi ) jika Anda tidak bisa berhenti bermain dengannya - ini memungkinkan Anda untuk mengubah pengaturan kumpulan aplikasi apa pun tanpa secara langsung memberi sinyal ke proses pekerja yang harus dibunuh. Anda perlu mendaur ulang App Pool secara manual untuk mengaktifkan pengaturan, yang memungkinkan Anda melakukan pra-setel pengaturan dan kemudian menggunakan jendela perubahan untuk menerapkannya melalui proses daur ulang Anda.

  • Sebagai prinsip umum, biarkan ping diaktifkan . Itu jaring pengaman Anda. Saya telah melihat orang-orang mematikannya, dan kadang-kadang situs hang tanpa batas waktu, menyebabkan kepanikan ... jadi jika pengaturannya terlalu agresif untuk aplikasi Anda yang tampaknya sangat sangat lambat untuk merespons, mundur sedikit dan lihat apa yang Anda dapatkan, alih-alih mematikannya. (Kecuali Anda memiliki pengaturan dump-mode-crash-mode untuk W3WP yang digantung melalui proses pemantauan Anda sendiri)

Itu cukup untuk menyebabkan proses berperilaku baik untuk hidup selamanya. Jika mati, tentu, itu akan diganti. Jika hang, ping harus mengambil yang baru dan akan mulai dalam 2 menit (secara default; calc kasus terburuk harus: hingga frekuensi ping + ping timeout + batas waktu startup sebelum permintaan mulai bekerja lagi).

Pembatasan CPU biasanya tidak menarik, karena secara default dimatikan, dan juga dikonfigurasi untuk tidak melakukan apa-apa; jika itu dikonfigurasi untuk mematikan proses, tentu saja, itu akan menjadi pemicu daur ulang. Biarkan saja. Catatan untuk IIS 8.x, CPU Throttling menjadi opsi juga.

AppPool (IIS) bukan AppDomain (.Net) (tetapi mungkin mengandung satu / beberapa)

Tapi ... lalu kita masuk ke .Net land, dan daur ulang AppDomain, yang juga bisa menyebabkan hilangnya status. (Lihat: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Versi singkat, Anda melakukannya dengan menyentuh file web.config di folder konten Anda (lagi dengan memilih!), Atau dengan membuat folder di folder itu, atau file ASPX, atau .. hal-hal lain ... dan itu tentang sama merusaknya dengan daur ulang App Pool, dikurangi biaya startup kode asli (ini murni konsep kode terkelola (.Net), jadi hanya hal-hal kode terkelola yang terjadi di sini).

Antivirus juga dapat memicu ini karena memindai file web.config, menyebabkan pemberitahuan perubahan, menyebabkan ....


2
Tunggu, tunggu, tunggu ... mengapa MEMBACA web.config dari Antivirus memicu pemberitahuan perubahan? Antivirus apa pun yang "menyentuh" ​​web.config tanpa alasan adalah trash imho.
Shiv

AV mungkin tidak hanya membaca, tetapi mungkin menulis - misalnya ke aliran data alternatif, merekam versi mesin yang terakhir digunakan untuk memindai file. Sebagai pemikiran.
TristanK

7

Mohon periksa,

Mengapa Kita Mendaur Ulang Kolam Aplikasi Kita?

jika Anda menelusuri web untuk menemukan alasan mengapa kumpulan aplikasi dikonfigurasikan untuk mendaur ulang secara otomatis secara berkala, Anda akan kesulitan menemukan jawaban yang masuk akal yang tidak berkaitan dengan masalah memori. Ini seperti komunitas pada umumnya telah cukup menerima kenyataan bahwa aplikasi web kami (atau lapisan layanan yang dihosting di IIS) perlu didaur ulang untuk menghindari masalah memori.

Saya selalu berpendapat bahwa jika kode Anda membutuhkan restart secara berkala untuk tetap bekerja dengan benar, maka ada sesuatu yang jelas salah. Ada bug dalam kode Anda di suatu tempat dan Anda harus memperbaikinya, alih-alih memulai kembali proses sesekali untuk membuat masalah 'hilang'.

Benar-benar perlu untuk mulai lebih fokus pada manajemen memori di .NET dan memastikan bahwa aplikasi kami dapat terus berjalan tanpa masalah.


3
Salah satu alasannya adalah bahwa .NET menggunakan tumpukan terpisah untuk 'objek besar' (biasanya 85K atau lebih besar atau sesuatu) yang tidak dipadatkan ketika pengumpulan sampah terjadi (meskipun dalam. NET 4.5.1 Saya pikir mereka menambahkan opsi untuk memadatkan LOH), dan di ASP.NET ketika merender HTML di sisi server, tidak jarang melihat 85K HTML (terutama untuk konten berulang seperti tabel dan kisi) dan HTML ini pada dasarnya hanya berupa objek String besar di server, dan jika memenuhi syarat sebagai sebuah objek besar, memberikan kontribusi untuk fragmentasi tumpukan objek besar, akhirnya mengakibatkan OutOfMemoryException, maka daur ulang
nothingisnecessary

0

Berdasarkan skenario OP (inisialisasi panjang pada startup / pemanasan), hal lain yang perlu diperiksa adalah batas waktu Startup (detik) yang memiliki nilai default 90 detik. Jika inisialisasi membutuhkan lebih dari batas waktu Startup, proses pekerja dapat dihentikan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.