Parca Agent - Continuous Profiling دائم على أساس eBPF
Parca Agent هو محلل ملف تعريفي مستمر قائم على eBPF. بدلاً من إرفاق محلل ملف تعريفي عندما تشك في وجود مشكلة يأخذ عينات من مكدسات الاستدعاء من كل عملية على عقدة وطوال الوقت بحوالي 1٪ النفقات العامة ومع عدم الحاجة إلى تعديل التطبيق. يعكس هذا سير العمل المعتاد: بدلاً من إعادة إنتاج حادثة تحت محلل ملف تعريفي تبحث عما كان يعمل بالفعل خلال نافذة الحادث. يُسند CPU (والذاكرة لأوقات التشغيل المدعومة) إلى رقم السطر وينقل ملفات التعريف إلى خادم Parca أو أي متجر ملف تعريفي متوافق مع Prometheus.
المتطلبات
- Linux kernel مع eBPF/BTF (5.4+ أفضل الأحدث)
- Root / حاوية مميزة
- خادم Parca (أو متجر متوافق) لاستقبال ملفات التعريف
التثبيت
| الطريقة | الأمر |
|---|
| Binary | download from GitHub Releases |
| Docker | docker run --privileged ghcr.io/parca-dev/parca-agent:latest |
| Kubernetes | Deploy as a DaemonSet (manifests provided) |
| Server | run parca separately to store/query profiles |
| Verify | parca-agent --version |
التشغيل
sudo parca-agent \
--node=my-node-1 \
--remote-store-address=parca.internal:7070 \
--remote-store-insecure
| العلم | الغرض |
|---|
--node | ملصق العقدة المرفق بملفات التعريف |
--remote-store-address | حيث لنقل ملفات التعريف |
--http-address | نقطة نهاية المحلي UI/metrics (:7071) |
--profiling-duration | نافذة أخذ العينات (افتراضي 10s) |
--log-level | المستوى الفعال |
Kubernetes DaemonSet
| الجانب | ملاحظة |
|---|
| النشر | عامل واحد لكل عقدة |
| الامتيازات | privileged: true وhostPID |
| الاكتشاف | علامات تلقائياً حسب pod/container/namespace |
| النفقات العامة | ~1٪ CPU نموذجي |
| التخزين | ملفات التعريف تذهب إلى خادم Parca وليس العقدة |
دعم اللغة
| وقت التشغيل | فك الترميز المكدس |
|---|
| C/C++/Rust/Go | أصلي (DWARF أو مؤشرات الإطار) |
| Java | دقة رمز JIT |
| Python / Ruby | فك ترميز يدرك المترجم |
| Node.js | تدعم فك ترميز وقت التشغيل |
| أي ثنائي بالرموز | أفضل النتائج عند عدم التجرد |
تحل المكدسات المختلطة اللغة في ملف تعريفي واحد وهذا بالضبط ما تحتاجه لخدمة متعددة اللغات.
الاستعلام عن ملفات التعريف
واجهة Parca (و API) تسمح لك بتقسيم ملفات التعريف مثل المقاييس:
| بُعد الاستعلام | مثال |
|---|
| نطاق زمني | 5 دقائق حول حادث |
| الملصقات | namespace="prod", pod=~"api-.*" |
| المقارنة | فرق نطاقي زمنيين (قبل/بعد نشر) |
| الدالة | تصفية إلى رمز |
# مفهومي: ملف تعريفي CPU لخدمة واحدة أثناء الارتفاع
cpu_samples{namespace="prod", container="api"} [14:05 → 14:10]
ميزة القاتل: المقارنة
| الاستخدام | كيف |
|---|
| البحث الانحدار | Diff ملفات التعريف قبل وبعد الإصدار |
| تحليل الحادث | Diff نافذة الحادث مقابل خط الأساس |
| إثبات التحسين | إظهار انكماش الدالة الساخنة |
يجعل تحديد ملف التعريف المستمر هذا ممكناً لأن ملف التعريف “قبل” موجود بالفعل — لم تكن بحاجة إلى التنبؤ برغبتك فيه.
Parca Agent مقابل محللي ملفات التعريف ذات الصلة
| الجانب | Parca Agent | perf | Pyroscope | async-profiler |
|---|
| النموذج | دائم الوصول على مستوى الأسطول | عند الطلب لكل تشغيل | دائم الوصول | عند الطلب JVM |
| التجهيز | لا شيء (eBPF) | لا شيء | خيارات Agent/SDK | عامل JVM |
| متعدد اللغات | نعم | نعم (أصلي) | نعم | JVM فقط |
| الأفضل للـ | تحديد الملف التعريفي المستمر للإنتاج | التحليل المحلي العميق | تحديد ملف تعريفي مستمر | دقة JVM |
نفس الفئة مثل Pyroscope; استخدم perf أو async-profiler عندما تحتاج إلى تحليل عميق لمرة واحدة.
الموارد