لو عندك API على Lambda وأول مستخدم بعد 15 دقيقة سكون بياخد 3 ثواني لحد ما يرد، المشكلة مش في شبكتك ولا في الكود. دي Cold Start، وبتتحل من غير ما تحوّل الـ stack كله لـ containers.
Cold Start في AWS Lambda: ليه بيحصل وإزاي تقيسه وتحسّنه بالأرقام
المشكلة باختصار
الـ Cold Start هو التأخير اللي بيحصل لمّا Lambda محتاجة تجهّز execution environment جديد علشان تشغّل دالتك. التأخير ده مش ثابت. ممكن يكون 200ms في دالة Node.js صغيرة، وممكن يوصل 6 ثواني في Java فيها SDKs كتير. اللي بيحصل فعلاً إن المستخدم الأول بعد فترة خمول بيدفع ثمن التجهيز ده لوحده، وبيشوف تأخير غير متوقع.
مثال للمبتدئين: محل الشاورما اللي بيفتح لكل زبون
تخيّل محل شاورما مش فاتح طول الوقت. كل ما يجي زبون، صاحب المحل لازم يشغّل الفرن، يجهّز اللحمة، ويولّع الغاز. الزبون الأول بياخد 5 دقايق استنّى، واللي بعده بدقيقة بس لأن المحل لسه مفتوح. لو فضل ساعة من غير زباين، المحل بيقفل تاني، وأول زبون جديد هيدفع ثمن التجهيز.
ده بالظبط اللي بيحصل في Lambda. AWS مش شغّالة container بتاعك طول الوقت. بتفتحه لمّا بيجي request، وبتقفله بعد فترة خمول. التجهيز ده = Cold Start. بعد ما يخلّص، أي request تاني خلال فترة قصيرة بيروح على نفس الـ container ساخن = Warm Start.
التعريف الدقيق: إيه اللي بيحصل جوه Lambda
لمّا بتيجي invocation ومفيش execution environment جاهز، Lambda بتعمل 3 خطوات متتالية:
- Download: بتحمّل الـ deployment package (ZIP أو container image) من S3 أو ECR.
- Init: بتشغّل الـ runtime (Node.js/Python/Java…) وبعدها بتنفّذ الكود اللي برّه الـ handler — يعني الـ imports والـ global initializations زي فتح اتصال بقاعدة البيانات.
- Invoke: بتنفّذ الـ handler نفسه على الـ event اللي جاي.
الخطوتين الأولانيتين هما الـ Cold Start. الـ invocations اللي بعدها بتستخدم نفس الـ environment = Warm Start، وده بيتكلّف ميلي ثواني بس. Lambda بتحتفظ بالـ environment ساخن لفترة بتختلف حسب الـ load، غالبًا بين 5 و 45 دقيقة.
القياس قبل التخمين
بدل ما تعدّل بشكل عشوائي، اقيس الأول. CloudWatch Logs بيحط في كل Cold Start سطر اسمه REPORT، وفيه حقل Init Duration. ده الوقت اللي الـ container أخده في الخطوتين الأولانيتين بالظبط.
# جيب آخر Cold Starts من دالة معيّنة
aws logs filter-log-events \
--log-group-name /aws/lambda/my-api \
--filter-pattern '{ $.initDuration > 0 }' \
--max-items 100 \
--query 'events[].message'الطريقة الأوضح في CloudWatch Insights: