ضبط الأداء للتحميلات والتنزيلات باستخدام Python

عندما يقوم أحد التطبيقات بنقل البيانات باستخدام مكتبة عميل Azure Storage ل Python، هناك عدة عوامل يمكن أن تؤثر على سرعة الطلب واستخدام الذاكرة وحتى نجاح الطلب أو فشله. لتحقيق أقصى قدر من الأداء والموثوقية لنقل البيانات، من المهم أن تكون استباقيا في تكوين خيارات نقل مكتبة العميل استنادا إلى البيئة التي يعمل فيها تطبيقك.

تتناول هذه المقالة العديد من الاعتبارات لضبط خيارات نقل البيانات. عند ضبطها بشكل صحيح، يمكن لمكتبة العميل توزيع البيانات بكفاءة عبر طلبات متعددة، ما قد يؤدي إلى تحسين سرعة العملية واستخدام الذاكرة واستقرار الشبكة.

ضبط الأداء للتحميلات

ضبط خيارات نقل البيانات بشكل صحيح هو مفتاح الأداء الموثوق به للتحميلات. يتم تقسيم عمليات نقل التخزين إلى عدة تحويلات فرعية استنادا إلى قيم هذه الوسيطات. يختلف الحد الأقصى لحجم النقل المدعوم حسب إصدار العملية والخدمة، لذا تأكد من التحقق من الوثائق لتحديد الحدود. لمزيد من المعلومات حول حدود حجم النقل لتخزين Blob، راجع أهداف المقياس لتخزين Blob.

تعيين خيارات النقل للتحميلات

يمكن ضبط الوسيطات التالية استنادا إلى احتياجات تطبيقك:

  • max_single_put_size: الحد الأقصى لحجم الكائن الثنائي كبير الحجم المطلوب تحميله بطلب واحد. الافتراضيات إلى 64 ميبي بايت.
  • max_block_size: الحد الأقصى لطول النقل بالبايت عند تحميل كائن ثنائي كبير الحجم للكتلة في مجموعات. الافتراضيات إلى 4 ميبي بايت.
  • max_concurrency: الحد الأقصى لعدد التحويلات الفرعية التي يمكن استخدامها بالتوازي.

إشعار

ستستخدم مكتبات العميل الإعدادات الافتراضية لكل خيار نقل بيانات، إذا لم يتم توفيرها. عادة ما تكون هذه الإعدادات الافتراضية ذات أداء في بيئة مركز البيانات، ولكن من غير المحتمل أن تكون مناسبة لبيئات المستهلك المنزلية. يمكن أن تؤدي خيارات نقل البيانات التي تم ضبطها بشكل سيئ إلى عمليات طويلة للغاية وحتى طلب مهلات. من الأفضل أن تكون استباقيا في اختبار هذه القيم، وضبطها بناء على احتياجات التطبيق والبيئة.

max_single_put_size

الوسيطة max_single_put_size هي الحد الأقصى لحجم الكائن الثنائي كبير الحجم بالبايت لتحميل طلب واحد. إذا كان حجم الكائن الثنائي كبير الحجم أقل من أو يساوي max_single_put_size، يتم تحميل الكائن الثنائي كبير الحجم مع طلب Put Blob واحد. إذا كان حجم الكائن الثنائي كبير الحجم أكبر من max_single_put_size، أو إذا كان حجم الكائن الثنائي كبير الحجم غير معروف، يتم تحميل الكائن الثنائي كبير الحجم في مجموعات باستخدام سلسلة من استدعاءات Put Block متبوعة ب Put Block List.

من المهم ملاحظة أن القيمة التي تحددها max_block_sizeلا تحد من القيمة التي تحددها ل max_single_put_size. max_single_put_size تحدد الوسيطة قيد حجم منفصل لطلب تنفيذ العملية بأكملها في وقت واحد، دون أي تحويلات فرعية. غالبا ما تريد أن max_single_put_size تكون كبيرا على الأقل مثل القيمة التي تحددها ل max_block_size، إن لم تكن أكبر. اعتمادا على حجم نقل البيانات، يمكن أن يكون هذا النهج أكثر أداء، حيث يتم إكمال النقل بطلب واحد ويتجنب الحمل الزائد للطلبات المتعددة.

إذا لم تكن متأكدا من القيمة الأفضل لموقفك، فإن الخيار الآمن هو تعيين max_single_put_size إلى نفس القيمة المستخدمة ل max_block_size.

max_block_size

max_block_size الوسيطة هي الحد الأقصى لطول النقل بالبايت عند تحميل كائن ثنائي كبير الحجم للكتلة في مجموعات. كما ذكرنا سابقا، لا تحد هذه القيمة ، والتي يمكن أن تكون أكبر من max_block_size.max_single_put_size

للحفاظ على نقل البيانات بكفاءة، قد لا تصل مكتبات العميل دائما إلى max_block_size قيمة كل عملية نقل. اعتمادا على العملية، يمكن أن يختلف الحد الأقصى للقيمة المدعومة لحجم النقل. لمزيد من المعلومات حول حدود حجم النقل لتخزين Blob، راجع المخطط في أهداف المقياس لتخزين Blob.

مثال على الرمز

يوضح مثال التعليمات البرمجية التالي كيفية تحديد خيارات نقل البيانات عند إنشاء كائن BlobClient ، وكيفية تحميل البيانات باستخدام كائن العميل هذا. لا يقصد بالقيم المقدمة في هذه العينة أن تكون توصية. لضبط هذه القيم بشكل صحيح، تحتاج إلى مراعاة الاحتياجات المحددة لتطبيقك.

def upload_blob_transfer_options(self, account_url: str, container_name: str, blob_name: str):
    # Create a BlobClient object with data transfer options for upload
    blob_client = BlobClient(
        account_url=account_url, 
        container_name=container_name, 
        blob_name=blob_name,
        credential=DefaultAzureCredential(),
        max_block_size=1024*1024*4, # 4 MiB
        max_single_put_size=1024*1024*8 # 8 MiB
    )
    
    with open(file=os.path.join(r'file_path', blob_name), mode="rb") as data:
        blob_client = blob_client.upload_blob(data=data, overwrite=True, max_concurrency=2)

في هذا المثال، قمنا بتعيين عدد عمال النقل المتوازيين إلى 2، باستخدام الوسيطة max_concurrency على استدعاء الأسلوب. يفتح هذا التكوين ما يصل إلى اتصالين في وقت واحد، مما يسمح بحدوث التحميل بالتوازي. أثناء إنشاء مثيل العميل، قمنا بتعيين الوسيطة max_single_put_size إلى 8 MiB. إذا كان حجم الكائن الثنائي كبير الحجم أصغر من 8 ميبي بايت، فمن الضروري طلب واحد فقط لإكمال عملية التحميل. إذا كان حجم الكائن الثنائي كبير الحجم أكبر من 8 ميجابايت، يتم تحميل الكائن الثنائي كبير الحجم في مجموعات بحد أقصى لحجم القطعة 4 ميجابايت، كما تم تعيينه بواسطة الوسيطة max_block_size .

اعتبارات الأداء للتحميلات

أثناء التحميل، تقوم مكتبات عميل التخزين بتقسيم دفق تحميل معين إلى تحميلات فرعية متعددة استنادا إلى خيارات التكوين المحددة أثناء إنشاء العميل. كل تحميل فرعي له استدعاء مخصص خاص به لعملية REST. بالنسبة لكائن BlobClient ، هذه العملية هي Put Block. تدير مكتبة عميل التخزين عمليات REST هذه بالتوازي (اعتمادا على خيارات النقل) لإكمال التحميل الكامل.

يمكنك معرفة كيفية معالجة مكتبة العميل للتخزين المؤقت في الأقسام التالية.

إشعار

تحتوي الكائنات الثنائية كبيرة الحجم للكتلة على حد أقصى لعدد الكتل يبلغ 50,000 كتلة. الحد الأقصى لحجم الكائن الثنائي كبير الحجم للكتلة، ثم، هو 50000 مرة max_block_size.

التخزين المؤقت أثناء التحميلات

لا تدعم طبقة Storage REST التقاط عملية تحميل REST من حيث توقفت؛ يتم إكمال عمليات النقل الفردية أو فقدها. لضمان مرونة عمليات تحميل الدفق، تقوم مكتبات عميل التخزين بالتخزين المؤقت للبيانات لكل استدعاء REST فردي قبل بدء التحميل. بالإضافة إلى قيود سرعة الشبكة، يعد سلوك التخزين المؤقت هذا سببا للنظر في قيمة أصغر ل max_block_size، حتى عند التحميل بالتسلسل. يؤدي تقليل قيمة max_block_size إلى تقليل الحد الأقصى لمقدار البيانات المخزن مؤقتا على كل طلب وكل إعادة محاولة لطلب فاشل. إذا كنت تواجه مهلات متكررة أثناء عمليات نقل البيانات بحجم معين، فإن تقليل قيمة يقلل من max_block_size وقت التخزين المؤقت، وقد يؤدي إلى أداء أفضل.

بشكل افتراضي، يخزن SDK بيانات max_block_size وحدات البايت لكل طلب تحميل فرعي متزامن، ولكن يمكن أن يقتصر استخدام الذاكرة على 4 ميبي بايت لكل طلب إذا تم استيفاء الشروط التالية:

  • يجب أن تكون الوسيطة max_block_size أكبر من min_large_block_upload_threshold. min_large_block_upload_threshold يمكن تعريف الوسيطة أثناء إنشاء مثيل العميل، وهي الحد الأدنى لحجم المجموعة بالبايت المطلوب لاستخدام خوارزمية الذاكرة الفعالة. min_large_block_upload_threshold يتم تعيين الوسيطة افتراضيا إلى 4*1024*1024 + 1.
  • يجب أن يكون الدفق المتوفر قابلا للبحث. الدفق القابل للبحث هو دفق يدعم الاستعلام عن الموضع الحالي وتعديله داخل الدفق.
  • يجب أن يكون الكائن الثنائي كبير الحجم كائن ثنائي كبير الحجم للكتلة.

بينما تنطبق هذه الاستراتيجية على معظم المواقف، لا يزال من الممكن حدوث المزيد من التخزين المؤقت إذا كانت التعليمات البرمجية الخاصة بك تستخدم ميزات مكتبة العميل الأخرى التي تتطلب التخزين المؤقت.

ضبط الأداء للتنزيلات

ضبط خيارات نقل البيانات بشكل صحيح هو مفتاح الأداء الموثوق به للتنزيلات. يتم تقسيم عمليات نقل التخزين إلى عدة تحويلات فرعية استنادا إلى قيم هذه الوسيطات.

تعيين خيارات النقل للتنزيلات

يمكن ضبط الوسيطات التالية استنادا إلى احتياجات تطبيقك:

  • max_chunk_get_size: الحد الأقصى لحجم المجموعة المستخدمة لتنزيل كائن ثنائي كبير الحجم. الافتراضيات إلى 4 ميبي بايت.
  • max_concurrency: الحد الأقصى لعدد التحويلات الفرعية التي يمكن استخدامها بالتوازي.
  • max_single_get_size: الحد الأقصى لحجم الكائن الثنائي كبير الحجم الذي سيتم تنزيله في مكالمة واحدة. إذا تجاوز الحجم الإجمالي للكائن الثنائي max_single_get_sizeكبير الحجم ، يتم تنزيل باقي بيانات الكائن الثنائي كبير الحجم في مجموعات. الإعدادات الافتراضية إلى 32 ميبي بايت.

مثال على الرمز

def download_blob_transfer_options(self, account_url: str, container_name: str, blob_name: str):
    # Create a BlobClient object with data transfer options for download
    blob_client = BlobClient(
        account_url=account_url, 
        container_name=container_name, 
        blob_name=blob_name,
        credential=DefaultAzureCredential(),
        max_single_get_size=1024*1024*32, # 32 MiB
        max_chunk_get_size=1024*1024*4 # 4 MiB
    )

    with open(file=os.path.join(r'file_path', 'file_name'), mode="wb") as sample_blob:
        download_stream = blob_client.download_blob(max_concurrency=2)
        sample_blob.write(download_stream.readall())

اعتبارات الأداء للتنزيلات

أثناء التنزيل، تقسم مكتبات عميل التخزين طلب تنزيل معين إلى تحميلات فرعية متعددة استنادا إلى خيارات التكوين المحددة أثناء إنشاء العميل. كل تحميل فرعي له استدعاء مخصص خاص به لعملية REST. اعتمادا على خيارات النقل، تدير مكتبات العميل عمليات REST هذه بالتوازي لإكمال التنزيل الكامل.

max_single_get_size للتنزيلات

أثناء التنزيل، تقوم مكتبات عميل التخزين بإجراء طلب نطاق تنزيل واحد باستخدام max_single_get_size قبل القيام بأي شيء آخر. أثناء طلب التنزيل الأولي هذا، تعرف مكتبات العميل الحجم الإجمالي للمورد. إذا قام الطلب الأولي بتنزيل كل المحتوى بنجاح، تكتمل العملية. وإلا، تستمر مكتبات العميل في تقديم طلبات النطاق حتى max_chunk_get_size اكتمال التنزيل الكامل.

الخطوات التالية