Bagikan melalui


Studi kasus: Mengisolasi masalah performa (C#, Visual Basic, F#)

Studi kasus ini menunjukkan cara menggunakan alat pembuatan profil Visual Studio untuk mengidentifikasi dan menyelesaikan masalah performa dalam sampel aplikasi ASP.NET. Untuk perbandingan alat pembuatan profil, lihat Alat mana yang harus saya pilih?

Anda akan mempelajari:

  • Cara menggunakan alat pembuatan profil Visual Studio untuk menganalisis performa aplikasi.
  • Cara menginterpretasikan data pembuatan profil untuk menemukan hambatan.
  • Strategi praktis untuk mengoptimalkan kode menggunakan Penghitung .NET, jumlah panggilan, dan data waktu.

Terapkan teknik ini untuk meningkatkan aplikasi Anda sendiri.

Mengidentifikasi studi kasus permasalahan performa

Sampel ASP.NET aplikasi menjalankan kueri terhadap database yang disimulasikan dan didasarkan pada Sampel Diagnostik.

Gejala performa utama:

  • Penggunaan CPU Rendah: CPU bukan hambatan.
  • Jumlah Utas ThreadPool Tinggi: Jumlah utas naik dengan stabil, menunjukkan kelaparan kumpulan utas.
  • Respons Aplikasi Lambat: Aplikasi merespons secara perlahan disebabkan oleh kurangnya utas eksekusi yang tersedia.

Studi kasus ini menggunakan alat pembuatan profil Visual Studio untuk menentukan dan mengatasi masalah ini, membantu Anda membuat kode Anda lebih cepat dan lebih efisien.

Tantangan

Memperbaiki masalah ini melibatkan beberapa tantangan:

  • Mendiagnosis Hambatan: Penggunaan CPU rendah dengan performa lambat dapat memiliki beberapa penyebab. Penggunaan alat pembuatan profil yang efektif dan menafsirkan outputnya sangat penting.
  • Batasan Pengetahuan dan Sumber Daya: Pembuatan profil dan pengoptimalan memerlukan keterampilan dan pengalaman tertentu, yang mungkin tidak selalu tersedia.

Pendekatan strategis yang menggabungkan alat pembuatan profil, pengetahuan teknis, dan pengujian yang cermat adalah kunci untuk mengatasi tantangan ini.

Strategi

Berikut adalah tampilan tingkat tinggi dari pendekatan dalam studi kasus ini:

  • Mulailah dengan memantau metrik penghitung .NET saat mengumpulkan data kinerja. Alat Penghitung .NET Visual Studio adalah titik awal yang baik.
  • Untuk wawasan yang lebih mendalam, kumpulkan jejak dengan alat pembuatan profil tambahan, seperti alat Instrumentasi untuk jumlah panggilan dan data waktu.

Pengumpulan data memerlukan tugas berikut:

  • Atur aplikasi ke versi rilis.
  • Pilih alat Penghitung .NET di Profiler Performa (Alt+F2).
  • Mulai aplikasi dan kumpulkan jejak.

Memeriksa penghitung kinerja

Saat menjalankan aplikasi, kami mengamati penghitung dalam alat .NET Counters. Untuk penyelidikan awal, beberapa metrik utama yang perlu diwaspadai meliputi:

  • CPU Usage. Tonton penghitung ini untuk melihat apakah masalah performa terjadi dengan penggunaan CPU tinggi atau rendah. Ini bisa menjadi petunjuk untuk jenis masalah performa tertentu. Misalnya:
    • Dengan penggunaan CPU yang tinggi, gunakan alat Penggunaan CPU untuk mengidentifikasi area di mana kami mungkin dapat mengoptimalkan kode. Untuk tutorial tentang hal ini, lihat studi kasus : Panduan pemula untuk mengoptimalkan kode.
    • Dengan penggunaan CPU yang rendah, gunakan alat Instrumentasi untuk mengidentifikasi jumlah panggilan dan waktu fungsi rata-rata berdasarkan waktu jam dinding. Ini dapat membantu mengidentifikasi masalah seperti perebutan sumber daya atau kekurangan kumpulan utas.
  • Allocation Rate. Untuk aplikasi web yang melayani permintaan, tarifnya harus cukup stabil.
  • GC Heap Size. Perhatikan penghitung ini untuk melihat apakah penggunaan memori terus tumbuh dan berpotensi bocor. Jika tampaknya tinggi, gunakan salah satu alat penggunaan memori.
  • Threadpool Thread Count. Untuk aplikasi web yang menerima permintaan, pantau penghitung ini untuk melihat apakah jumlah utas tetap stabil atau naik pada tingkat yang stabil.

Berikut adalah contoh yang menunjukkan bagaimana CPU Usage rendah, sementara ThreadPool Thread Count relatif tinggi.

Cuplikan layar penghitung yang ditampilkan di alat Penghitung .NET.

Jumlah utas yang terus meningkat dengan penggunaan CPU yang rendah merupakan indikator terjadinya ketidakcukupan dalam kumpulan utas. Kumpulan utas dipaksa untuk terus menghasilkan utas baru. Kelaparan kumpulan utas terjadi ketika kumpulan tidak memiliki utas yang tersedia untuk memproses item kerja baru dan sering menyebabkan aplikasi merespons dengan lambat.

Berdasarkan penggunaan CPU yang rendah dan jumlah utas yang relatif tinggi, dan mengerjakan teori kemungkinan kasus kelaparan kumpulan utas, beralihlah menggunakan alat Instrumentasi.

Menyelidiki jumlah panggilan dan data waktu

Mari kita amati jejak dari alat Instrumentasi untuk melihat apakah kita dapat menemukan lebih banyak informasi tentang apa yang terjadi dengan thread tersebut.

Setelah mengumpulkan jejak dengan alat Instrumentasi dan memuatnya ke Visual Studio, pertama-tama kami memeriksa halaman laporan .diagsession awal yang menampilkan data ringkasan. Dalam jejak yang dikumpulkan, kami menggunakan tautan detail Buka dalam laporan lalu pilih Flame Graph.

Cuplikan layar Grafik Api di alat Instrumentasi.

Visualisasi Grafik Api menunjukkan kepada kita bahwa fungsi QueryCustomerDB (ditampilkan dalam warna kuning) bertanggung jawab atas sebagian besar waktu berjalan aplikasi.

Klik kanan fungsi QueryCustomerDB dan pilih Tampilan di Pohon Panggilan.

Cuplikan layar Pohon Panggilan di alat Instrumentasi.

Jalur kode dengan penggunaan CPU tertinggi dalam aplikasi disebut jalur panas . Ikon nyala jalur panas (Cuplikan layar yang menampilkan ikon Jalur Panas.) dapat membantu mengidentifikasi masalah performa yang mungkin ditingkatkan dengan cepat.

Dalam tampilan Pohon Panggilan, Anda dapat melihat bahwa jalur panas menyertakan fungsi QueryCustomerDB, yang menunjuk ke masalah kinerja yang potensial.

Relatif terhadap waktu yang dihabiskan dalam fungsi lain, nilai Self dan Avg Self untuk fungsi QueryCustomerDB sangat tinggi. Tidak seperti Total dan Avg Total, nilai Self mengecualikan waktu yang dihabiskan dalam fungsi lain, jadi ini adalah tempat yang baik untuk mencari hambatan performa.

Tips

Jika nilai Mandiri relatif rendah alih-alih tinggi, Anda mungkin ingin melihat kueri aktual yang dipanggil oleh fungsi QueryCustomerDB.

Klik dua kali fungsi QueryCustomerDB untuk menampilkan kode sumber untuk fungsi tersebut.

public ActionResult<string> QueryCustomerDB()
{
    Customer c = QueryCustomerFromDbAsync("Dana").Result;
    return "success:taskwait";
}

Kami melakukan sedikit penelitian. Atau, kita dapat menghemat waktu dan membiarkan Copilot melakukan penelitian untuk kita.

Jika kita menggunakan Copilot, pilih Tanyakan Copilot dari menu konteks dan ketik pertanyaan berikut:

Can you identify a performance issue in the QueryCustomerDB method?

Tips

Anda dapat menggunakan perintah slash seperti /optimize untuk membantu membentuk pertanyaan yang baik untuk Copilot.

Copilot memberi tahu kami bahwa kode ini memanggil API asinkron tanpa menggunakan tunggu. Ini adalah pola kode sync-over-async, yang merupakan penyebab umum kehabisan threadpool, dan dapat memblokir thread.

Untuk mengatasinya, gunakan tunggu. Dalam contoh ini, Copilot memberikan saran kode berikut bersama dengan penjelasan.

public async Task<ActionResult<string>> QueryCustomerDB()
{
    Customer c = await QueryCustomerFromDbAsync("Dana");
    return "success:taskwait";
}

Jika Anda melihat masalah performa yang terkait dengan kueri database, Anda bisa menggunakan alat Database untuk menyelidiki apakah panggilan tertentu lebih lambat. Data ini mungkin menunjukkan peluang untuk mengoptimalkan kueri. Untuk tutorial yang menunjukkan cara menggunakan alat Database untuk menyelidiki masalah performa, lihat Studi kasus: Panduan pemula untuk mengoptimalkan kode. Alat Database mendukung .NET Core dengan ADO.NET atau Entity Framework Core.

Untuk mendapatkan visualisasi di Visual Studio untuk perilaku utas individual, Anda dapat menggunakan jendela Parallel Stacks saat debugging. Jendela ini menunjukkan utas individual bersama dengan informasi tentang utas yang menunggu, utas yang mereka tunggu, dan kebuntuan.

Untuk informasi tambahan tentang ketiadaan kumpulan utas, lihat Mendeteksi ketiadaan kumpulan utas.

Langkah berikutnya

Artikel dan posting blog berikut ini menyediakan informasi selengkapnya untuk membantu Anda belajar menggunakan alat performa Visual Studio secara efektif.