概要
このドキュメントでは、セッション管理機能(SMF)またはポリシー制御機能(PCF)として使用されるCloud Native Deployment Platform(CNDP)プラットフォームのCPUまたはメモリの問題をトラブルシューティングする方法について説明します。
1.ポッドのCPU/メモリの高使用率に関する問題アラート
この問題のトラブルシューティングを適切に開始するには、アラートを理解することが重要です。事前に設定されているすべてのデフォルトアラートの説明は、このリンクにあります。
1.1. CPUに関するアラート
ここでは、アクティブなデフォルトのアラートがトリガーされて、 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で、次のコマンドを入力して影響を受けるポッドを見つけます。
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で、次のコマンドを入力して影響を受けるポッドを見つけます。
master $ kubectl get pods grafana-dashboard-sgw-765664b864-zwxct -n smf
2. Kubernetesのプロセス単位のプロファイリング
2.1. CPUプロファイリング(/debug/pprof/profile)
CPUプロファイリングは、実行中のGoプログラムのCPU使用率をキャプチャして分析するための手法です。
コールスタックを定期的にサンプリングして情報を記録するため、プログラムの時間の大半を費やす場所を分析できます。
2.2.メモリプロファイリング(/debug/pprof/heap)
メモリプロファイリングは、Goアプリケーションのメモリ割り当てと使用パターンに関する洞察を提供します。
メモリリークの特定とメモリ使用率の最適化に役立ちます。
2.3. Goroutineプロファイリング(/debug/pprof/goroutine)
Goroutineプロファイリングは、スタックトレースを表示することで、現在のすべてのGoroutineの動作に関する洞察を提供します。この分析は、プログラムのパフォーマンスに影響を与える可能性がある、スタックまたはリークしているGoroutineを特定するのに役立ちます。
2.4. Kubernetesポッドでのpprofポートの検索
コマンド:
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.システムから収集すべきデータ
問題発生時およびCommon Execution Environment(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.収集されたpprofログ出力の理解
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のスタックトレースを表します。
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.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)
以下に例を挙げます。