Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Selama pengembangan atau setelah menyebarkan proyek aplikasi fungsi Python lokal Anda ke Azure, Lakukan praktik yang baik dengan menganalisis potensi hambatan memori dalam fungsi Anda. Hambatan semacam itu dapat mengurangi kinerja fungsi dan menyebabkan kesalahan. Instruksi berikut menunjukkan kepada Anda cara menggunakan paket Python memory-profiler , yang menyediakan analisis konsumsi memori baris demi baris dari fungsi Anda saat dijalankan.
Catatan
Pembuatan profil memori hanya ditujukan untuk analisis jejak memori di lingkungan pengembangan. Harap jangan menerapkan pembuatan profil memori pada aplikasi fungsi produksi.
Prasyarat
Sebelum Anda mulai mengembangkan aplikasi fungsi Python, Anda harus memenuhi persyaratan ini:
Python 3.7 atau lebih tinggi. Untuk memeriksa daftar lengkap versi Python yang didukung di Azure Functions, bacalah Panduan pengembang Python.
Azure Functions Core Tools, versi 4.x atau yang lebih tinggi. Periksa versi Anda dengan
func --version. Untuk mempelajari tentang memperbarui, lihat Azure Functions Core Tools di GitHub.Visual Studio Code dipasang pada salah satu platform yang didukung.
Langganan Azure aktif.
Jika Anda tidak memiliki akun Azure, buat akun gratis sebelum memulai.
Proses pembuatan profil memori
Di requirements.txt Anda, tambahkan
memory-profileruntuk memastikan paket dibundel dengan penyebaran Anda. Jika Anda mengembangkan di komputer lokal, Anda mungkin ingin mengaktifkan lingkungan virtual Python dan melakukan resolusi paket denganpip install -r requirements.txt.Dalam skrip fungsi Anda (misalnya, __init__.py untuk model pemrograman Python v1 dan function_app.py untuk model v2), tambahkan baris berikut di atas
main()fungsi. Baris ini memastikan pencatat akar melaporkan nama pencatat anak, sehingga log pembuatan profil memori dapat dibedakan oleh awalanmemory_profiler_logs.import logging import memory_profiler root_logger = logging.getLogger() root_logger.handlers[0].setFormatter(logging.Formatter("%(name)s: %(message)s")) profiler_logstream = memory_profiler.LogFile('memory_profiler_logs', True)Terapkan dekorator berikut di atas fungsi apa pun yang memerlukan profil memori. Dekorator tidak berfungsi langsung pada metode titik
main()masuk pemicu. Anda perlu membuat subfungsi dan menghiasnya. Selain itu, karena masalah yang diketahui profiler memori, ketika menerapkan ke koroutin asinkron, nilai pengembalian coroutine selaluNone.@memory_profiler.profile(stream=profiler_logstream)Uji profiler memori di komputer lokal Anda dengan menggunakan perintah
func host startAzure Functions Core Tools . Saat Anda memanggil fungsi, fungsi tersebut harus menghasilkan laporan penggunaan memori. Laporan berisi nama file, baris kode, penggunaan memori, kenaikan memori, dan konten baris di dalamnya.Untuk memeriksa log pembuatan profil memori pada instans aplikasi fungsi yang ada di Azure, Anda dapat meminta log pembuatan profil memori untuk pemanggilan terbaru dengan kueri Kusto di Application Insights, Logs.
traces | where timestamp > ago(1d) | where message startswith_cs "memory_profiler_logs:" | parse message with "memory_profiler_logs: " LineNumber " " TotalMem_MiB " " IncreMem_MiB " " Occurrences " " Contents | union ( traces | where timestamp > ago(1d) | where message startswith_cs "memory_profiler_logs: Filename: " | parse message with "memory_profiler_logs: Filename: " FileName | project timestamp, FileName, itemId ) | project timestamp, LineNumber=iff(FileName != "", FileName, LineNumber), TotalMem_MiB, IncreMem_MiB, Occurrences, Contents, RequestId=itemId | order by timestamp asc
Contoh
Berikut adalah contoh melakukan pembuatan profil memori pada pemicu HTTP asinkron dan sinkron, bernama "HttpTriggerAsync" dan "HttpTriggerSync" masing-masing. Kami akan membuat aplikasi fungsi Python yang hanya mengirimkan permintaan GET ke beranda Microsoft.
Membuat aplikasi fungsi Python
Aplikasi fungsi Python harus mengikuti struktur folder yang ditentukan Azure Functions. Untuk perancah proyek, sebaiknya gunakan Azure Functions Core Tools dengan menjalankan perintah berikut:
func init PythonMemoryProfilingDemo --python
cd PythonMemoryProfilingDemo
func new -l python -t HttpTrigger -n HttpTriggerAsync -a anonymous
func new -l python -t HttpTrigger -n HttpTriggerSync -a anonymous
Memperbarui konten file
requirements.txt mendefinisikan paket yang digunakan dalam proyek kami. Selain Azure Functions SDK dan memory-profiler, kami memperkenalkan aiohttp untuk permintaan HTTP asinkron dan requests untuk panggilan HTTP sinkron.
# requirements.txt
azure-functions
memory-profiler
aiohttp
requests
Buat pemicu HTTP asinkron.
Ganti kode dalam pemicu HTTP asinkron HttpTriggerAsync/__init__.py dengan kode berikut, yang mengonfigurasi profiler memori, format pencatat akar, dan pengikatan streaming pencatat.
# HttpTriggerAsync/__init__.py
import azure.functions as func
import aiohttp
import logging
import memory_profiler
# Update root logger's format to include the logger name. Ensure logs generated
# from memory profiler can be filtered by "memory_profiler_logs" prefix.
root_logger = logging.getLogger()
root_logger.handlers[0].setFormatter(logging.Formatter("%(name)s: %(message)s"))
profiler_logstream = memory_profiler.LogFile('memory_profiler_logs', True)
async def main(req: func.HttpRequest) -> func.HttpResponse:
await get_microsoft_page_async('https://microsoft.com')
return func.HttpResponse(
f"Microsoft page loaded.",
status_code=200
)
@memory_profiler.profile(stream=profiler_logstream)
async def get_microsoft_page_async(url: str):
async with aiohttp.ClientSession() as client:
async with client.get(url) as response:
await response.text()
# @memory_profiler.profile does not support return for coroutines.
# All returns become None in the parent functions.
# GitHub Issue: https://github.com/pythonprofilers/memory_profiler/issues/289
Buat pemicu HTTP sinkron.
Ganti kode dalam pemicu HTTP asinkron HttpTriggerSync/__init__.py dengan kode berikut.
# HttpTriggerSync/__init__.py
import azure.functions as func
import requests
import logging
import memory_profiler
# Update root logger's format to include the logger name. Ensure logs generated
# from memory profiler can be filtered by "memory_profiler_logs" prefix.
root_logger = logging.getLogger()
root_logger.handlers[0].setFormatter(logging.Formatter("%(name)s: %(message)s"))
profiler_logstream = memory_profiler.LogFile('memory_profiler_logs', True)
def main(req: func.HttpRequest) -> func.HttpResponse:
content = profile_get_request('https://microsoft.com')
return func.HttpResponse(
f"Microsoft page response size: {len(content)}",
status_code=200
)
@memory_profiler.profile(stream=profiler_logstream)
def profile_get_request(url: str):
response = requests.get(url)
return response.content
Profil aplikasi fungsi Python di lingkungan pengembangan lokal
Setelah Anda membuat perubahan di atas, ada beberapa langkah lagi untuk menginisialisasi lingkungan virtual Python untuk runtime Azure Functions.
Buka Windows PowerShell atau shell Linux apa pun yang Anda inginkan.
Buat lingkungan virtual Python dengan
py -m venv .venvdi windows, ataupython3 -m venv .venvdi Linux.Aktifkan lingkungan virtual Python dengan
.venv\Scripts\Activate.ps1di Windows PowerShell atausource .venv/bin/activatedi shell Linux.Pulihkan dependensi Python dengan
pip install -r requirements.txtMemulai runtime Azure Functions secara lokal dengan Azure Functions Core Tools
func host startKirim permintaan GET ke
https://localhost:7071/api/HttpTriggerAsyncatauhttps://localhost:7071/api/HttpTriggerSync.Ini harus menampilkan laporan pembuatan profil memori yang mirip dengan bagian berikut di Azure Functions Core Tools.
Filename: <ProjectRoot>\HttpTriggerAsync\__init__.py Line # Mem usage Increment Occurrences Line Contents ============================================================ 19 45.1 MiB 45.1 MiB 1 @memory_profiler.profile 20 async def get_microsoft_page_async(url: str): 21 45.1 MiB 0.0 MiB 1 async with aiohttp.ClientSession() as client: 22 46.6 MiB 1.5 MiB 10 async with client.get(url) as response: 23 47.6 MiB 1.0 MiB 4 await response.text()
Langkah berikutnya
Untuk informasi selengkapnya tentang pengembangan Azure Functions Phyton, lihat referensi berikut ini: