Bagikan melalui


Profil penggunaan memori aplikasi Python di Azure Functions

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:

Jika Anda tidak memiliki akun Azure, buat akun gratis sebelum memulai.

Proses pembuatan profil memori

  1. Di requirements.txt Anda, tambahkan memory-profiler untuk memastikan paket dibundel dengan penyebaran Anda. Jika Anda mengembangkan di komputer lokal, Anda mungkin ingin mengaktifkan lingkungan virtual Python dan melakukan resolusi paket dengan pip install -r requirements.txt.

  2. 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 awalan memory_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)
    
  3. 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 selalu None.

    @memory_profiler.profile(stream=profiler_logstream)
    
  4. 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.

  5. 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.

    Cuplikan layar memperlihatkan penggunaan memori kueri aplikasi Python di Application Insights.

    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.

  1. Buka Windows PowerShell atau shell Linux apa pun yang Anda inginkan.

  2. Buat lingkungan virtual Python dengan py -m venv .venv di windows, atau python3 -m venv .venv di Linux.

  3. Aktifkan lingkungan virtual Python dengan .venv\Scripts\Activate.ps1 di Windows PowerShell atau source .venv/bin/activate di shell Linux.

  4. Pulihkan dependensi Python dengan pip install -r requirements.txt

  5. Memulai runtime Azure Functions secara lokal dengan Azure Functions Core Tools func host start

  6. Kirim permintaan GET ke https://localhost:7071/api/HttpTriggerAsync atau https://localhost:7071/api/HttpTriggerSync.

  7. 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: