はじめに
このドキュメントでは、セッション管理機能(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の動作に関する洞察を提供します。この分析は、プログラムのパフォーマンスに影響を与える可能性のある、スタックされたGoroutinesまたはリークされたGoroutinesを特定するのに役立ちます。
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)
例: