CPU, penggunaan memori, penggunaan kumpulan utas - Identitas inti ASP NET tidak dikonfirmasi pengguna email penanganan hapus - Dalam aplikasi atau aplikasi terpisah?

Aug 19 2020

Saya bertanya-tanya solusi apa yang lebih cocok. Saya perlu menerapkan robot untuk memeriksa dan menghapus pengguna terdaftar yang belum dikonfirmasi selama misalnya 7 hari setelah email konfirmasi dikirim. (Jika pengguna tidak mengkonfirmasi akunnya, saya ingin menghapus pengguna dari database). Saya memikirkan 3 cara:

  1. mengimplementasikan delegasi di aplikasi inti ASP NET secara langsung dan menjalankannya sebagai tugas asinkron dalam satu loop dengan waktu tidur 24 jam.
  2. buat aplikasi konsol yang akan berjalan dalam loop dengan waktu tidur 24 jam
  3. buat aplikasi konsol yang akan dimulai oleh perangkat lunak pihak ketiga secara teratur (misalnya Cron atau TaskScheduler)

Manakah dari cara berikut yang memiliki dampak paling kecil untuk penggunaan CPU dan memori?
Juga kumpulan benang memiliki jumlah yang terbatas untuk diambil, semakin banyak robot, semakin sedikit benang untuk orang yang mencoba mengakses situs web ASP saya, apakah saya benar?
Dan pertanyaan terakhir saya> apakah sebaiknya Thread.Sleep begitu lama? Sesuatu memberitahuku bahwa sebenarnya tidak. Di sisi lain itu adalah ASP yang akan berjalan selama berbulan-bulan mungkin bertahun-tahun.

Bagaimanapun, saya menyukai visi memiliki semua dalam satu aplikasi (dapat dikonfigurasi dalam satu file dan semuanya dimulai sekaligus). Di sisi lain, sesuatu memberi tahu saya bahwa ini bukanlah ide yang sangat bagus.

Jawaban

2 JonasH Aug 21 2020 at 18:48

Ketika tugas benar-benar berjalan, saya mengharapkan penggunaan memori dan proses didominasi oleh apa pun yang diperlukan untuk tugas tersebut, dan harus sebanding untuk setiap metode. Jadi akan lebih menarik untuk melihat penggunaan sumber daya saat tidak berjalan.

  1. Dalam proses, menggunakan pengatur waktu (atau await Task.Delay(..)loop)

Ini hanya akan membutuhkan memori untuk pengatur waktu atau mesin status async, dan beberapa memori tambahan untuk kode tersebut. Ini seharusnya cukup kecil, mungkin beberapa kilobyte. Tidak ada waktu prosesor dan tidak ada utas yang akan digunakan saat menganggur. Ini mengasumsikan bahwa Anda tidak memegang struktur data besar apa pun.

  1. Dalam proses konsol persisten yang terpisah

Ini akan menggunakan beberapa MB memori untuk .Net runtime, dan beberapa memori tambahan untuk kode dan data. Dalam praktiknya, saya mengharapkan memori di-paged ke disk jika komputer kehabisan memori. Tidak ada waktu prosesor yang akan digunakan saat idle.

  1. Dalam proses konsol terjadwal yang terpisah

Ini hanya akan menghabiskan memori untuk objek penjadwal, dan ini harus minimal. Jelas tidak ada waktu atau utas prosesor yang akan digunakan saat idle.

Ringkasan

menjadwalkan proses terpisah akan menggunakan sumber daya paling sedikit. Tetapi semua metode harus menggunakan sumber daya dalam jumlah yang tidak signifikan saat tidak digunakan. Jadi saya berpendapat bahwa pilihan harus dibuat berdasarkan kriteria lain, seperti apa yang paling mudah untuk dipertahankan dan / atau diterapkan.

Kumpulan utas akan mengalokasikan lebih banyak utas jika diperlukan. Utas secara umum seharusnya hanya digunakan ketika mereka benar-benar melakukan sesuatu (yaitu menggunakan await taskdaripada task.Wait()), dan Anda akan memiliki lebih banyak utas kumpulan utas daripada Anda memiliki utas perangkat keras. Saya hanya akan khawatir tentang ini jika saya mengamati jumlah utas yang jauh lebih tinggi dari biasanya.

Saya akan menghindari Thread.Sleepjika memungkinkan. Pengatur waktu atau await Task.Delaybiasanya akan lebih tepat.