Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Python kullanarak Azure Functions için geliştirme yaparken işlevlerinizin performansını ve bu performansın işlev uygulamanızın ölçeklendiriliş biçimini nasıl etkilediğini anlamanız gerekir. Yüksek performanslı uygulamalar tasarlarken ihtiyaç daha önemlidir. İşlev uygulamalarınızı tasarlarken, yazarken ve yapılandırırken dikkate alınması gereken temel faktörler yatay ölçeklendirme ve aktarım hızı performans yapılandırmalarıdır.
Yatay ölçeklendirme
Varsayılan olarak, Azure Functions uygulamanızdaki yükü otomatik olarak izler ve gerektiğinde Python için daha fazla konak örneği oluşturur. Azure Functions, queueTrigger için iletilerin yaşı ve kuyruk boyutu gibi örneklerin ne zaman ekleneceğine karar vermek üzere farklı tetikleyici türleri için yerleşik eşikleri kullanır. Bu eşikler kullanıcı tarafından yapılandırılamaz. Daha fazla bilgi için Azure Functions'ta Olay Tabanlı Ölçeklendirme sayfasına bakın.
Aktarım hızı performansını iyileştirme
Varsayılan yapılandırmalar Azure Functions uygulamaların çoğu için uygundur. Ancak, iş yükü profilinize göre yapılandırmalar kullanarak uygulamalarınızın aktarım hızının performansını geliştirebilirsiniz. İlk adım, çalıştırdığınız iş yükünün türünü anlamaktır.
| İş yükü türü | İşlev uygulaması özellikleri | Örnekler |
|---|---|---|
| G/Ç bağlı | • Uygulamanın birçok eşzamanlı çağrıyı işlemesi gerekir. • Uygulama, ağ çağrıları ve disk okuma/yazma işlemleri gibi çok sayıda G/Ç olayını işler. |
• Web API'leri |
| CPU'ya bağlı | • Uygulama, görüntü yeniden boyutlandırma gibi uzun süre çalışan hesaplamalar yapar. • Uygulama veri dönüştürme yapar. |
• Veri işleme • Makine öğrenmesi çıkarımı |
Gerçek dünya işlev iş yükleri genellikle G/Ç ve CPU bağlı bir karışımı olduğundan, gerçekçi üretim yükleri altında uygulamanın profilini oluşturmanız gerekir.
Performansa özgü yapılandırmalar
İşlev uygulamanızın iş yükü profilini anladıktan sonra, işlevlerinizin aktarım hızı performansını geliştirmek için kullanabileceğiniz yapılandırmalar aşağıdadır.
- Async
- Birden çok dil çalışanı
- Bir dil çalışanı işlemi içindeki maksimum çalışan sayısı
- Olay döngüsü
- Dikey Ölçeklendirme
Async
Python, tek iş parçacıklı bir çalışma zamanı olduğundan, Python için bir ana bilgisayar örneği varsayılan olarak bir kerede yalnızca bir işlev çağrısını işleyebilir. Çok sayıda G/Ç olayını işleyen ve/veya G/Ç'ye bağlı olan uygulamalar için, işlevleri zaman uyumsuz olarak çalıştırarak performansı önemli ölçüde geliştirebilirsiniz.
Bir işlevi zaman uyumsuz olarak çalıştırmak için, işlevi doğrudan async def ile çalıştıran deyimini kullanın:
async def main():
await some_nonblocking_socket_io_op()
Aşağıda, aiohttp http istemcisi kullanan HTTP tetikleyicisine sahip bir işlev örneği verilmişti:
import aiohttp
import azure.functions as func
async def main(req: func.HttpRequest) -> func.HttpResponse:
async with aiohttp.ClientSession() as client:
async with client.get("PUT_YOUR_URL_HERE") as response:
return func.HttpResponse(await response.text())
return func.HttpResponse(body='NotFound', status_code=404)
Anahtar sözcüğü olmayan async bir işlev ThreadPoolExecutor iş parçacığı havuzunda otomatik olarak çalıştırılır:
# Runs in a ThreadPoolExecutor threadpool. Number of threads is defined by PYTHON_THREADPOOL_THREAD_COUNT.
# The example is intended to show how default synchronous functions are handled.
def main():
some_blocking_socket_io()
İşlevleri eşzamansız çalıştırmanın tam avantajını elde etmek için, kodunuzda kullanılan G/Ç işlemi veya kitaplığının da eşzamansız çalışmayı desteklemesi gerekmektedir. Zaman uyumsuz olarak tanımlanan işlevlerde zaman uyumlu G/Ç işlemlerinin kullanılması genel performansa zarar verebilir . Kullandığınız kitaplıklarda zaman uyumsuz sürüm uygulanmıyorsa, uygulamanızda olay döngüsünü yöneterek kodunuzu zaman uyumsuz olarak çalıştırmanın avantajını yine de elde edebilirsiniz.
Asenkron desenler uygulayan birkaç istemci kitaplığına örnekler aşağıda verilmiştir:
- aiohttp - Asyncio için Http istemcisi/sunucusu
- Akışlar API'si - Ağ bağlantısıyla çalışmak için üst düzey asenkron/beklemeye hazır ilkel yapı taşları
- Janus Kuyruğu - Python için iş parçacığı güvenliği sağlayan ve zaman uyumsuz çalışabilen kuyruk
- pyzmq - ZeroMQ için Python bağlamaları
Python işçisinde asenkronu anlama
bir işlev imzası önünde async tanımladığınızda, Python işlevi bir eş yordam olarak işaretler. Eş yordamı çağırdığınızda, olay döngüsüne görev olarak zamanlanabilir. Zaman uyumsuz bir işlevi çağırdığınızda await , olay döngüsüne bir devamlılık kaydeder ve bu da olay döngüsünün bekleme süresi boyunca bir sonraki görevi işlemesine olanak tanır.
Python Çalışanımızda çalışan, olay döngüsünü müşterinin async işleviyle paylaşır ve aynı anda birden çok isteği işleyebilecektir. Müşterilerimizin aiohttp ve pyzmq gibi asyncio uyumlu kitaplıklardan yararlanmalarını kesinlikle öneririz. Bu önerilerin senkron olarak uygulanması, işlevinizin verimliliğini üçüncü taraf kütüphanelerle karşılaştırıldığında artırır.
Uyarı
İşleviniz, async'suz bir şekilde ve uygulamasında await olmadan bildirilirse, olay döngüsü engellenir ve Python çalışanının eşzamanlı istekleri işlemesini engeller. Bu durumda, işlevinizin performansı ciddi şekilde olumsuz etkilenir.
Birden fazla dil işleme süreçleri kullanımı
Varsayılan olarak, her İşlev ana bilgisayar örneğinin tek bir dil çalışanı işlemi vardır. Uygulama ayarını kullanarak konak başına çalışan işlemlerinin sayısını artırabilirsiniz (10'a FUNCTIONS_WORKER_PROCESS_COUNT kadar). Azure Functions sonra eş zamanlı işlev çağrılarını bu çalışanlara eşit olarak dağıtmaya çalışır.
CPU bağlı uygulamalarda, dil çalışanlarının sayısını işlev uygulaması başına kullanılabilir çekirdek sayısıyla aynı veya daha yüksek olacak şekilde ayarlamanız gerekir. Daha fazla bilgi edinmek için bkz. Kullanılabilir örnek SKU'ları.
G/Ç'ye bağlı uygulamalar, çalışan işlemlerinin sayısını kullanılabilir çekirdek sayısının ötesinde artırmanın da avantajını elde edebilir. Gerekli bağlam anahtarlarının sayısının artması nedeniyle çalışan sayısını çok yüksek ayarlamanın genel performansı etkileyebileceğini unutmayın.
FUNCTIONS_WORKER_PROCESS_COUNT, Azure Functions uygulamanızın talebe göre ölçeklendirilmesi sırasında oluşturduğu her konak için geçerlidir.
Bir dil çalışanı işlemi içinde maksimum çalışan sayısını ayarlama
Asenkron section bölümünde belirtildiği gibi, Python işleyicisi işlevleri ve coroutines farklı şekilde ele alır. Coroutine, dil çalışanının üzerinde çalıştığı olay döngüsü içinde çalıştırılır. Öte yandan, bir işlev çağrısı, dil çalışanı tarafından bir iş parçacığı olarak tutulan ThreadPoolExecutor içinde çalıştırılır.
PYTHON_THREADPOOL_THREAD_COUNT uygulama ayarını kullanarak eşitleme işlevlerini çalıştırmak için izin verilen en fazla çalışanın değerini ayarlayabilirsiniz. Bu değer ThreadPoolExecutor nesnesinin max_worker bağımsız değişkenini ayarlar. Bu, Python zaman uyumsuz çağrıları yürütmek için en fazla max_worker iş parçacıklarının havuzunu kullanmasına olanak tanır.
PYTHON_THREADPOOL_THREAD_COUNT Sunucunun oluşturduğu her çalışan için geçerlidir ve Python, yeni iş parçacığını ne zaman oluşturacağını veya mevcut boş iş parçacığını ne zaman yeniden kullanacağını belirler. Eski Python sürümleri için (yani, 3.8, 3.7 ve 3.6), max_worker değeri 1 olarak ayarlanır. Python sürüm 3.9 için, max_worker, None olarak ayarlanır.
CPU'ya bağlı uygulamalar için ayarı 1'den başlayarak ve iş yükünüzle denemeler yapınken artarak düşük bir sayıya tutmanız gerekir. Bu öneri, bağlam anahtarlarında harcanan süreyi azaltmak ve CPU'ya bağlı görevlerin bitmesini sağlamaktır.
İ/O'ya bağlı uygulamalarda, her çağrı için çalışan iş parçacığı sayısını artırarak önemli kazançlar elde etmeniz gerekebilir. Öneri, varsayılan Python (çekirdek sayısı) + 4 ile başlayıp gördüğünüz aktarım hızı değerlerine göre ayarlamalar yapmaktır.
Karma iş yükleri uygulamalarında, aktarım hızını en üst düzeye çıkarmak için hem hem FUNCTIONS_WORKER_PROCESS_COUNT de PYTHON_THREADPOOL_THREAD_COUNT yapılandırmaları dengelemeniz gerekir. İşlev uygulamalarınızın en çok ne üzerinde zaman geçirdiğini anlamak için profil oluşturmanızı ve değerleri davranışlarına göre ayarlamanızı öneririz. Bu uygulama ayarları hakkında bilgi edinmek için bkz. Birden çok çalışan işlemi kullanma.
Uyarı
Bu öneriler hem HTTP hem de HTTP ile tetiklenmeyen işlevler için geçerli olsa da, işlev uygulamalarınızdan beklenen performansı elde etmek için HTTP ile tetiklenmeyen işlevler için tetikleyiciye özgü diğer yapılandırmaları ayarlamanız gerekebilir. Bu konuda daha fazla bilgi için lütfen güvenilir Azure Functions için bu en iyi uygulamalarına bakın.
Olay döngüsünü yönetme
Asyncio uyumlu üçüncü taraf kitaplıklar kullanmanız gerekir. Üçüncü taraf kitaplıklardan hiçbiri gereksinimlerinizi karşılamıyorsa, Azure Functions olay döngülerini de yönetebilirsiniz. Olay döngülerini yönetmek, hesaplama kaynağı yönetiminde size daha fazla esneklik sağlar ve senkron G/Ç kütüphanelerini eş görevlere dönüştürmenizi mümkün kılar.
Yerleşik asyncio kitaplığını kullanarak Coroutines and Tasks ve Event Loop hakkında birçok yararlı Python resmi belge vardır.
Aşağıdaki istek kitaplığını örnek olarak ele alalım, bu kod parçacığı, asyncio kitaplığını kullanarak requests.get() yöntemini bir yordama sarar ve SAMPLE_URL için birden çok web isteğini eş zamanlı olarak çalıştırır.
import asyncio
import json
import logging
import azure.functions as func
from time import time
from requests import get, Response
async def invoke_get_request(eventloop: asyncio.AbstractEventLoop) -> Response:
# Wrap requests.get function into a coroutine
single_result = await eventloop.run_in_executor(
None, # using the default executor
get, # each task call invoke_get_request
'SAMPLE_URL' # the url to be passed into the requests.get function
)
return single_result
async def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
eventloop = asyncio.get_event_loop()
# Create 10 tasks for requests.get synchronous call
tasks = [
asyncio.create_task(
invoke_get_request(eventloop)
) for _ in range(10)
]
done_tasks, _ = await asyncio.wait(tasks)
status_codes = [d.result().status_code for d in done_tasks]
return func.HttpResponse(body=json.dumps(status_codes),
mimetype='application/json')
Dikey ölçeklendirme
Daha yüksek belirtimlere sahip premium plana yükselterek özellikle CPU'ya bağlı işlemlerde daha fazla işlem birimi elde edebilirsiniz. Daha yüksek işleme birimleriyle çalışan işlemlerinin sayısını kullanılabilir çekirdek sayısına göre ayarlayabilir ve daha yüksek paralellik derecesine ulaşabilirsiniz.
Sonraki Adımlar
Azure Functions Python geliştirme hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
- Azure Functions Python geliştirici kılavuzu
- Azure Functions için en iyi uygulamalar
- Azure Functions geliştirici başvurusu