Tổng quan
Trong quá trình vận hành hệ thống Kubernetes, đôi khi bạn cần xác định process nào đang gây ra tình trạng sử dụng tài nguyên bất thường. Bài viết này sẽ hướng dẫn cách xác định Pod tương ứng khi biết PID của một process cụ thể.
Các bước thực hiện
Bước 1: Xác định PID của process
Giả sử chúng ta cần kiểm tra các process đang sử dụng GPU:
[root@centos ~]# nvidia-smi
Thu Jun 15 11:34:39 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 4xx.xx.xx Driver Version: 4xx.xx.xx CUDA Version: xx.x |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 A100-SXM4-40GB On | 00000000:26:00.0 Off | 0 |
| N/A 30C P0 65W / 400W | 6474MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
| 1 A100-SXM4-40GB On | 00000000:2C:00.0 Off | 0 |
| N/A 30C P0 55W / 400W | 0MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
| 2 A100-SXM4-40GB On | 00000000:65:00.0 Off | 0 |
| N/A 29C P0 53W / 400W | 0MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
| 3 A100-SXM4-40GB On | 00000000:6A:00.0 Off | 0 |
| N/A 29C P0 52W / 400W | 0MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
| 4 A100-SXM4-40GB On | 00000000:A2:00.0 Off | 0 |
| N/A 28C P0 55W / 400W | 0MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
| 5 A100-SXM4-40GB On | 00000000:A7:00.0 Off | 0 |
| N/A 29C P0 52W / 400W | 0MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
| 6 A100-SXM4-40GB On | 00000000:E1:00.0 Off | 0 |
| N/A 30C P0 53W / 400W | 0MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
| 7 A100-SXM4-40GB On | 00000000:E7:00.0 Off | 0 |
| N/A 28C P0 55W / 400W | 3MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 9573 C python 6471MiB |
+-----------------------------------------------------------------------------+
Từ kết quả trên, ta thấy process Python đang sử dụng GPU có PID là 9573.
Bước 2: Truy xuất container ID từ PID
Kubernetes sử dụng cgroup để quản lý các container. Ta có thể đọc thông tin cgroup của process để lấy container ID:
[root@centos ~]# cat /proc/9573/cgroup
11:hugetlb:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
10:memory:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
9:blkio:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
8:freezer:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
7:perf_event:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
6:net_prio,net_cls:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
5:pids:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
4:cpuset:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
3:devices:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
2:cpuacct,cpu:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
1:name=systemd:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
Trong đường dẫn cgroup, ta có thể thấy container ID nằm ở phần cuối. Để trích xuất container ID, ta sử dụng awk:
[root@centos ~]# cat /proc/9573/cgroup | awk -F '/' '{print $5}' | head -n 1 | cut -b 1-8
9f7e6d5c
Bước 3: Truy xuất tên Pod từ container ID
Sử dụng crictl để lấy thông tin chi tiết của container và trích xuất nhãn Kubernetes:
[root@centos ~]# crictl inspect -o go-template --template='{{index .status.labels "io.kubernetes.pod.name"}}' 9f7e6d5c
ml-training-job-7f8d9e0c5-ab12-34cd-56ef-7890abcdef12
Kết quả trả về là tên Pod đang chạy process với PID 9573.
Tóm tắt
Quy trình gồm 3 bước chính:
- Xác định PID của process cần kiểm tra (sử dụng nvidia-smi, top, hoặc ps)
- Đọc /proc/<PID>/cgroup để lấy container ID
- Sử dụng crictl để truy vấn thông tin Pod từ container ID