المحتويات

المقدمة

1. تنبيه المشاكل عالي CPU/الذاكرة على POD

1.1. تنبيه لوحدة المعالجة المركزية

1.2. تنبيه الذاكرة

2 - تصنيف كل عملية من العمليات

2.1- تحديد مواصفات وحدة المعالجة المركزية (CPU) (/debug/pprof/profile)

2.2. توصيف الذاكرة (/debug/pprof/heap)

2-3- تنميط الغوروتين (Debug/pprof/goroutine)

2.4. العثور على منفذ PPROF على Kubernetes Pod

3 - البيانات المطلوب جمعها من النظام

4 - فهم النواتج المجمعة لسجل الأداء

4.1. قراءة المخرجات من تنميط الذاكرة (/debug/pprof/heap)

5 - غرافانا

5.1. استعلام وحدة المعالجة المركزية (CPU)

5.2. استعلام الذاكرة

المقدمة

يوضح هذا المستند كيفية أستكشاف أخطاء وحدة المعالجة المركزية (CPU) أو الذاكرة وإصلاحها على النظام الأساسي للنشر الأصلي للسحابة (CNDP) الذي يتم إستخدامه كوظيفة إدارة جلسة عمل (SMF) أو وظيفة التحكم في السياسة (PCF).

1. تنبيه المشاكل عالي CPU/الذاكرة على POD

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

1.1. تنبيه لوحدة المعالجة المركزية

هنا، هناك تنبيه افتراضي نشط يتم تشغيله باسم  k8s-pod-cpu-usage-high .

شايفين انو بالنسبه لبود اسمو: smf-udp-proxy-0 وهي حاوية: k8s_smf-udp-proxy_smf-udp-proxy-0_smf

ترى أن هذه الحاوية في مساحة الاسم: smf

alerts active detail k8s-pod-cpu-usage-high 36fbd5e0bbce

severity major

type "Processing Error Alarm"

startsAt 2024-02-23T12:45:44.558Z

source smf-udp-proxy-0

summary "Container: k8s_smf-udp-proxy_smf-udp-proxy-0_smf of pod: smf-udp-proxy-0 in namespace: smf has CPU usage more than 80% for 5min -- VALUE = 131.79654468989753"

labels [ "name: k8s_smf-udp-proxy_smf-udp-proxy-0_smf" "namespace: smf" "pod: smf-udp-proxy-0" ]

على مدير Kubernetes، ابحث عن نقطة الوصول المتأثرة بإدخال هذا الأمر:

master $ kubectl get pods smf-udp-proxy-0 -n smf

1.2. تنبيه الذاكرة

هنا، هناك تنبيه افتراضي نشط يتم تشغيله باسم  container-memory-usage-high .

يعني فيك تشوف أنو متعلق ببود اسمو: grafana-dashboard-sgw-765664b864-zwxct وهي حاوية: k8s_istio-proxy_grafana-dashboard-sgw-765664b864-zwxct_smf_389290ee-77d1-4ff3-981d-58ea1c8eabdb_0

هذه الحاوية موجودة في مساحة الاسم:smf

alerts active detail container-memory-usage-high 9065cb8256ba

severity critical

type "Processing Error Alarm"

startsAt 2024-04-25T10:17:38.196Z

source grafana-dashboard-sgw-765664b864-zwxct

summary "Pod grafana-dashboard-sgw-765664b864-zwxct/k8s_istio-proxy_grafana-dashboard-sgw-765664b864-zwxct_smf_389290ee-77d1-4ff3-981d-58ea1c8eabdb_0 uses high memory 94.53%."

labels [ "alertname: container-memory-usage-high" "beta_kubernetes_io_arch: amd64" "beta_kubernetes_io_os: linux" "cluster: smf" "container: istio-proxy" "id: /kubepods/burstable/pod389290ee-77d1-4ff3-981d-58ea1c8eabdb/e127400d9925e841ebfb731ba3b2e13b5ed903caef001448f93489fc6f697ce1" "image: sha256:716ac2efc7d3e3c811564170c48c51fbe97ab4e50824109c11132dc053276ff8" "instance: alcp0200-smf-ims-master-3" "job: kubernetes-cadvisor" "kubernetes_io_arch: amd64" "kubernetes_io_hostname: alcp0200-smf-ims-master-3" "kubernetes_io_os: linux" "monitor: prometheus" "name: k8s_istio-proxy_grafana-dashboard-sgw-765664b864-zwxct_smf_389290ee-77d1-4ff3-981d-58ea1c8eabdb_0" "namespace: smf" "pod: grafana-dashboard-sgw-765664b864-zwxct" "replica: smf" "severity: critical" "smi_cisco_com_node_type: oam" "smi_cisco_com_node_type_2: service" "smi_cisco_com_node_type_3: session" ]

annotations [ "summary: Pod grafana-dashboard-sgw-765664b864-zwxct/k8s_istio-proxy_grafana-dashboard-sgw-765664b864-zwxct_smf_389290ee-77d1-4ff3-981d-58ea1c8eabdb_0 uses high memory 94.53%." "type: Processing Error Alarm" ]

على مدير Kubernetes، ابحث عن نقطة الوصول المتأثرة بإدخال هذا الأمر:

master $ kubectl get pods grafana-dashboard-sgw-765664b864-zwxct -n smf

2 - تصنيف كل عملية على حدة

2.1- تحديد مواصفات وحدة المعالجة المركزية (CPU) (/debug/pprof/profile)

تعمل ميزة تحديد مواصفات وحدة المعالجة المركزية (CPU) كتقنية لالتقاط إستخدام وحدة المعالجة المركزية (CPU) لبرنامج Go الجاري وتحليله.

وهو يقوم بأخذ عينات من مكدس المكالمات بشكل دوري وتسجيل المعلومات، مما يتيح لك تحليل المكان الذي يقضي فيه البرنامج معظم وقته.

2.2. توصيف الذاكرة (/debug/pprof/heap)

توفر ميزة "تخصيص الذاكرة" رؤى حول أنماط تخصيص الذاكرة واستخدامها في تطبيق Go.

ويمكن أن تساعدك على التعرف على تسريبات الذاكرة وتحسين الاستفادة من الذاكرة.

2-3- تنميط الغوروتين (Debug/pprof/goroutine)

يوفر ملف تعريف Goroutine رؤى حول سلوك جميع المنافذ الحالية من خلال عرض آثار المكدس الخاصة بها. يساعد هذا التحليل في التعرف على غوروتينات عالقة أو مسربة يمكن أن تؤثر على أداء البرنامج.

2.4. العثور على منفذ PPROF على Kubernetes Pod

:

master:~$ kubectl describe pod <POD NAME> -n <NAMESPACE> | grep -i pprof

مثال الإخراج:

master:~$ kubectl describe pod udp-proxy-0 -n smf-rcdn | grep -i pprof

PPROF_EP_PORT: 8851

master:~$

3 - البيانات المطلوب جمعها من النظام

أثناء وقت الإصدار والتنبيه النشط لبيئة التنفيذ المشترك (CEE)، يرجى جمع البيانات التي تغطي الوقت قبل المشكلة وأثناءها/بعدها:

تقنية CEE:

cee# show alerts active detail

cee# show alerts history detail

cee# tac-debug-pkg create from yyyy-mm-dd_hh:mm:ss to yyyy-mm-dd_hh:mm:ss

العقدة الرئيسية CNDP:

General information:

master-1:~$ kubectl get pods <POD> -n <NAMESPACE>

master-1:~$ kubectl pods describe <POD> -n <NAMESPACE>

master-1:~$ kubectl logs <POD> -n <NAMESPACE> -c <CONTAINER>

Login to impacted pod and check top tool:

master-1:~$ kubectl exec -it <POD> -n <NAMESPACE> bash

root@protocol-n0-0:/opt/workspace# top

If pprof socket is enabeled on pod:

master-1:~$ kubectl describe pod <POD NAME> -n <NAMESPACE> | grep -i pprof

master-1:~$ curl http://<POD IP>:<PPROF PORT>/debug/pprof/goroutine?debug=1

master-1:~$ curl http://<POD IP>:<PPROF PORT>/debug/pprof/heap

master-1:~$ curl http://<POD IP>:<PPROF PORT>/debug/pprof/profile?seconds=30

4 - فهم النواتج المجمعة لسجل الأداء

4.1. قراءة المخرجات من تنميط الذاكرة (/debug/pprof/heap)

This line indicates that a total of  1549 goroutines were captured in the profile. The top frame (0x9207a9) shows that the function google.golang.org/grpc.(*addrConn).resetTransport  is being executed, and the line number in the source code is clientconn.go:1164 .

يمثل كل قسم يبدأ برقم (على سبيل المثال، 200) تتبع مكدس لغوروتين.

goroutine profile: total 1549

200 @ 0x4416c0 0x415d68 0x415d3e 0x415a2b 0x9207aa 0x46f5e1

# 0x9207a9 google.golang.org/grpc.(*addrConn).resetTransport+0x6e9 /opt/workspace/gtpc-ep/pkg/mod/google.golang.org/grpc@v1.26.0/clientconn.go:1164

The first line in each section shows the number of goroutines with the same stack trace. For example, there are  200 goroutines with the same stack trace represented by memory addresses (0x4416c0 , 0x415d68, and more.). The lines that start with  # represent the individual frames of the stack trace. Each frame shows the memory address, function name, and the source code location (file path and line number) where the function is defined.

200 @ 0x4416c0 0x45121b 0x873ee2 0x874803 0x89674b 0x46f5e1

# 0x873ee1 google.golang.org/grpc/internal/transport.(*controlBuffer).get+0x121 /opt/workspace/gtpc-ep/pkg/mod/google.golang.org/grpc@v1.26.0/internal/transport/controlbuf.go:395

# 0x874802 google.golang.org/grpc/internal/transport.(*loopyWriter).run+0x1e2 /opt/workspace/gtpc-ep/pkg/mod/google.golang.org/grpc@v1.26.0/internal/transport/controlbuf.go:513

# 0x89674a google.golang.org/grpc/internal/transport.newHTTP2Client.func3+0x7a /opt/workspace/gtpc-ep/pkg/mod/google.golang.org/grpc@v1.26.0/internal/transport/http2_client.go:346

92 @ 0x4416c0 0x45121b 0x873ee2 0x874803 0x897b2b 0x46f5e1

# 0x873ee1 google.golang.org/grpc/internal/transport.(*controlBuffer).get+0x121 /opt/workspace/gtpc-ep/pkg/mod/google.golang.org/grpc@v1.26.0/internal/transport/controlbuf.go:395

# 0x874802 google.golang.org/grpc/internal/transport.(*loopyWriter).run+0x1e2 /opt/workspace/gtpc-ep/pkg/mod/google.golang.org/grpc@v1.26.0/internal/transport/controlbuf.go:513

# 0x897b2a google.golang.org/grpc/internal/transport.newHTTP2Server.func2+0xca /opt/workspace/gtpc-ep/pkg/mod/google.golang.org/grpc@v1.26.0/internal/transport/http2_server.go:296

5 - غرافانا

5.1. استعلام وحدة المعالجة المركزية (CPU)

sum(cpu_percent{service_name=~"[[microservice]]"}) by (service_name,instance_id)

مثال:

5.2. استعلام الذاكرة

sum(increase(mem_usage_kb{service_name=~"[[microservice]]"}[15m])) by (service_name,instance_id)

مثال: