"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > أداء AWS Lambda مع ذراع Java xvs - القياسات الأولية الجزئية

أداء AWS Lambda مع ذراع Java xvs - القياسات الأولية الجزئية

تم النشر بتاريخ 2024-08-02
تصفح:281

AWS Lambda performance with Java  xvs arm- Part nitial measurements

مقدمة

حتى الآن لم أقم بقياس الأداء (أوقات البدء الدافئة والباردة) لوظائف Lambda باستخدام وقت تشغيل Java 21 لبعض حالات الاستخدام (مثل تقديم طلب DynamoDB) لبنية Arm64 لأنها لا تدعم SnapStart. سوف يتفوق أداء Lambda مع وقت تشغيل Java 21 مع بنية x86_64 مع تمكين SnapStart (وأكثر من ذلك مع تحسين الإعداد الإضافي) على Lambda مع بنية Arm64. ولكن في 18 يوليو 2024، أعلنت AWS أن AWS Lambda تدعم الآن وظائف SnapStart لـ Java التي تستخدم بنية ARM64. لذا، كان من المنطقي الآن بالنسبة لي أن أبدأ في قياس أوقات البدء الباردة والدافئة مع الأخذ في الاعتبار أيضًا اختيار بنية وظيفة Lambda. من المعروف أنه مع إعداد ذاكرة تسعير AWS Lambda الحالي ومدة التنفيذ، سيكون Lambda مع بنية Arm64 تقريبًا. أرخص بنسبة 25% من Lambda مع بنية x86_64.

قررت إنشاء سلسلة مقالات منفصلة لها وعدم إضافة هذا الموضوع إلى سلسلة AWS Lambda SnapStart المتنامية باستمرار.

يبدأ قياس درجات الحرارة الباردة والدافئة لتطبيق المثال

في تجربتنا، سنعيد استخدام التطبيق المقدم في المقالة AWS Lambda SnapStart - قياس عمليات التشغيل الباردة لـ Java 21 Lambda. هنا هو رمز التطبيق عينة. توجد في الأساس وظيفتان رئيسيتان من وظائف Lambda تستجيب كل منهما لطلبات API Gateway لإنشاء المنتج بالمعرف المحدد (راجع وظيفة PutProductFunction Lambda) واسترداد المنتج بواسطة المعرف المحدد (راجع وظيفة GetProductByIdFunction Lambda). يمكنك استخدام وظيفتي Lambda مع تمكين SnapStart وبدونه. هناك وظيفة Lambda إضافية GetProductByIdWithPrimingFunction والتي كتبتها لقياس تأثير إعداد طلب DynamoDB بشكل مستقل لوظيفة Lambda التي تم تمكين SnapStart. يمكنك قراءة المزيد حول تأثير الإعداد في مقالتي AWS Lambda SnapStart - قياس الإعداد ووقت الاستجابة من البداية إلى النهاية ووقت النشر.

لتمكين SnapStart على جميع وظائف Lambda، يرجى إلغاء التعليق التالي في قالب SAM:

Globals:
  Function:
    CodeUri: target/aws-pure-lambda-snap-start-21-1.0.0-SNAPSHOT.jar
    ...
    SnapStart:
     ApplyOn: PublishedVersions  
   ...

إذا كنت أرغب في استخدام SnapStart فقط للفرد، ولكن ليس لجميع وظائف Lambda، فيجب عليك تطبيق تعريف SnapStart هذا على مستوى وظيفة Lambda بدلاً من مستوى الوظيفة العامة.

تحتوي جميع وظائف Lambda على الإعدادات التالية كنقطة بداية:

  • إعداد الذاكرة 1024 ميجابايت
  • عميل HTTP Apache الافتراضي المستخدم للتحدث مع قاعدة بيانات DynamoDB
  • خيار تجميع Java "-XX: TieredCompilation -XX:TieredStopAtLevel=1" والذي أثبت أنه يوفر مقايضة جيدة جدًا بين أوقات البدء الباردة والدافئة

في قالب SAM أضفت إمكانية تحديد بنية Lambda في قسم وظائف Lambda العالمية مثل:

Globals:
  Function:
    CodeUri: target/aws-pure-lambda-snap-start-21-1.0.0-SNAPSHOT.jar
    ...
    Architectures:
      #- arm64
      - x86_64   

فقط قم بإلغاء التعليق على البنية التي ترغب في استخدامها لوظائف Lambda الخاصة بك.

حتى لو كانت لغة Java هي "الكتابة مرة واحدة، والتشغيل في كل مكان"، فقد قمت على أي حال بتجميع وإنشاء ملف jar التطبيق لقياسات الذراع 64 الخاصة بي على مثيل t4g AWS EC2 مع معالج Graviton (الذي يعتمد على بنية الذراع 64/aarch64) عن طريق التثبيت مسبقًا أمازون كوريتو 21 لنظام التشغيل Linux aarch64. يمكنك العثور على هذه الجرة هنا.

لقد قمت أيضًا بإعادة قياس كل شيء لبنية x86_64 مرة أخرى للحصول على نتائج قابلة للمقارنة باستخدام نفس إصدار وقت التشغيل Corretto Java 21 والذي كان في وقت قياساتي Java 21.v17 .

اعتمدت نتائج التجربة أدناه على إعادة إنتاج أكثر من 100 بداية باردة وحوالي 100.000 بداية دافئة. من أجل ذلك (والتجارب من مقالتي السابقة) استخدمت أداة اختبار التحميل، ولكن يمكنك استخدام أي أداة تريدها، مثل Serverless-artillery أو Postman. من المهم أيضًا أن تدرك أنني بدأت القياسات مباشرة بعد نشر (إعادة) كود المصدر الجديد للتطبيق. يرجى ملاحظة أن هناك أيضًا تأثير لذاكرة التخزين المؤقت المتدرجة على البداية الباردة، حيث تكون الاستدعاءات الأولى أبطأ بشكل عام، وتصبح الاستدعاءات اللاحقة أسرع حتى يتم الوصول إلى عدد معين من الاستدعاءات.

الآن دعونا نضع جميع القياسات لـ "الحصول على المنتج حسب المعرف الموجود" (وظائف Lambda GetProductByIdFunction وGetProductByIdWithPrimingFunction لتمكين SnapStart والقياسات التمهيدية) معًا.

وقت البدء البارد (ج) والدافئ (م) بالمللي ثانية:

يقترب ج ص50 ج ص 75 ج ص90 ج ص99 ج ص99.9 ج ماكس ث ص50 ث ص 75 ث ص90 ث ص99 ث ص99.9 ث ماكس
x86_64، لم يتم تمكين SnapStart 3554.30 3615.21 3666.15 3800.47 4108.61 4111.78 5.42 6.01 6.88 14.09 40.98 1654.59
arm64، لم يتم تمكين SnapStart 3834.81 3904.42 3983.26 4047.47 4332.13 4335.74 5.96 6.66 7.69 16.01 43.68 1844.54
x86_64، تم تمكين SnapStart بدون تمهيد 1794.09 1846.86 2090.54 2204.27 2239.80 2240.08 5.37 5.96 6.93 15.88 51.64 1578.34
arm64، تم تمكين SnapStart بدون تحضير 1845.01 1953.18 2591.70 2762.91 2793.45 2795.8 5.91 6.56 7.63 16.75 63.52 1779.14
x86_64، تم تمكين SnapStart مع إعداد طلب DynamoDB 803.18 870.18 1103.78 1258.19 1439.95 1440.67 5.55 6.25 7.45 15.50 63.52 448.85
arm64، تم تمكين SnapStart مع إعداد طلب DynamoDB 910.14 1001.79 1376.62 1623.44 1684.60 1686.19 6.05 6.72 7.81 16.66 74.68 550.59

خاتمة

في هذه المقالة قمنا بمقارنة قياسات أوقات البدء الباردة والدافئة لوظيفة Lambda المتصلة بقاعدة بيانات DynamoDB لثلاث حالات استخدام:

  • بدون تمكين SnapStart في وظيفة Lambda
  • مع تمكين SnapStart في وظيفة Lambda ولكن بدون التحسين الأولي
  • مع تمكين SnapStart في وظيفة Lambda ومع إعداد طلب DynamoDB

لقد رأينا أنه باستخدام بنية x86_64، كانت جميع أوقات البدء الباردة والدافئة أقل مقارنةً ببنية Arm64. ولكن نظرًا لأن تسعير Lambda لبنية أرخص بنسبة 25% من بنية x86_64، فإنه يقدم مقايضة مثيرة للاهتمام بين أداء التكلفة.

بالنسبة لقياساتنا، لجميع حالات الاستخدام الثلاثة:

  • كانت أوقات بدء Lambda الباردة مع بنية Arm64 بالنسبة للعديد من النسب المئوية 10-20% فقط (وفقط في حالات نادرة جدًا 25-27%) أبطأ مقارنة ببنية x86_64.
  • كانت أوقات بدء Lambda الدافئة مع بنية Arm64 أبطأ بالنسبة للعديد من النسب المئوية بنسبة 5-10٪ فقط مقارنة ببنية x86_64.

لذا، يعد اختيار بنية Arm64 معقولًا جدًا لهذا التطبيق النموذجي. وبما أن دعم SnapStart لبنية Arm64 قد تم تقديمه مؤخرًا فقط، فإنني أتوقع أيضًا بعض التحسينات في الأداء في المستقبل. يرجى إجراء القياسات الخاصة بك لحالة الاستخدام الخاصة بك!

في الجزء التالي من المقالة سنقوم بنفس قياسات الأداء ولكن مع ضبط ذاكرة Lambda على قيم مختلفة بين 256 و2048 ميجابايت ومقارنة النتائج.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/aws-builders/aws-lambda-performance-with-java-21-x86-vs-arm64-part-1-initial-measurements-506?1إذا كان هناك أي التعدي، يرجى الاتصال بـ [email protected] للحذف
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3