prometheus及gpu,k8s
原文地址:https://www.cnblogs.com/g2thend/p/11515560.html
##一,物理节点安装配置(简单配置,未涉及报警及grafana图形展示)
1,prometheus 官网下载安装
下载安装
# pwd
/usr/local/src
https://github.com/prometheus/prometheus/releases/download/v2.12.0/prometheus-2.12.0.linux-amd64.tar.gz
# tar xvf prometheus-2.11.1.linux-amd64.tar.gz
# ln -sv /usr/local/src/prometheus-2.11.1.linux-amd64 /usr/local/prometheus
# cd /usr/local/prometheus
服务启动脚本
# vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/usr/local/prometheus/
ExecStart=/usr/local/prometheus/prometheus --
config.file=/usr/local/prometheus/prometheus.yml
[Install]
WantedBy=multi-user.target
配置所监控的node
cd /usr/local/prometheus
# grep -v "#" prometheus.yml | grep -v "^$"
global:
alerting:
alertmanagers:
- static_configs:
- targets:
rule_files:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'promethues-node'
static_configs:
- targets: ['192.168.7.110:9100','192.168.7.111:9100']
修改配置文件后需要重启服务
启动
# systemctl daemon-reload
# systemctl restart prometheus
# systemctl enable prometheus
查看端口是否监听正常
2,节点安装
# pwd
/usr/local/src
https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
# tar xvf node_exporter-0.18.1.linux-amd64.tar.gz
# ln -sv /usr/local/src/node_exporter-0.18.1.linux-amd64 /usr/local/node_exporter
# cd /usr/local/node_exporter
启动脚本
# vim /etc/systemd/system/node-exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
启动
# systemctl daemon-reload
# systemctl restart node-exporter
# systemctl enable node-exporter
查看端口是否监听正常,关闭防火墙和selinxu
3,监控k8s
参考https://github.com/NVIDIA/gpu-monitoring-tools/tree/master/exporters/prometheus-dcgm
起gpu特定容器做监控
#######################################################
docker 使用GPU
查看docker 使用的runtime
docker info | grep Runtime
更改默认的runtime
配置daemon的默认运行时
是否已安装
ls /usr/bin/nvidia-container-runtime
nvidia-docker 命令是否出现
指定默认的runtime "default-runtime": "nvidia" 添加加速代理镜像源
vim /etc/docker/daemon.json
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": [],
"registry-mirrors": ["https://gemfield.mirror.aliyuncs.com"]
}
}
}
重启服务
sudo systemctl restart docker
ldconfig -p
dpkg -S /usr/lib/x86_64-linux-gnu/libcuda.so.1 dpkg -S命令来检查下它属于哪个package
https://gitlab.com/nvidia/cuda/blob/master/dist/ubuntu16.04/10.1/base/Dockerfile
apt-get install pciutils
apt-get install kmod 安装lspci
apt install dirmngr
https://github.com/NVIDIA/nvidia-docker
Docker中使用GPU
https://cloud.tencent.com/developer/article/1142345
export DEVICES=$(ls /dev/nvidia* | xargs -I{} echo '--device {}:{}')
docker run -it --rm $DEVICES -v /usr/lib64/nvidia/:/usr/local/nvidia/lib64 tensorflow/tensorflow:latest-gpu bash
#nvidia-docker run -it -p 8888:8888 --name ten tensorflow/tensorflow:0.11.0rc0-gpu /bin/sh
jupyter_jianhang_v5.1_gpu
进入容器输入nvidia-smi,输入显卡信息,说明安装是正确的。
制作docker 镜像 Anaconda3 + tensorflow-gpu part2 Dockerfile nvidia docker
https://blog.csdn.net/weixin_41270857/article/details/83449964
指定显存大小使用gpu
https://yq.aliyun.com/articles/690623?utm_content=g_1000041607
在k8s上调度GPU
http://longlongloves.life/2018-05-23/%E5%9C%A8k8s%E4%B8%8A%E8%B0%83%E5%BA%A6GPU.html
Kubernetes 多container组成的Pod
https://blog.csdn.net/liumiaocn/article/details/52490444
kubernetes单个pod运行两个容器yaml文件实践
https://blog.csdn.net/zhangxiangui40542/article/details/63273746
Docker 及 nvidia-docker 使用
https://www.cnblogs.com/makefile/p/docker-usage.html
sudo -u nvidia-docker sh -c 'echo $PATH' /sbin:/bin:/usr/sbin:/usr/bin
安装 CUDA
安装步骤官网
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#verify-you-have-cuda-enabled-system
博客
https://blog.csdn.net/weixin_42652125/article/details/81178943
https://www.cnblogs.com/luofeel/p/8654964.html
https://blog.csdn.net/QLULIBIN/article/details/78714596
ubuntu安装cuda驱动实现nvidia-smi命令
https://blog.csdn.net/weixin_42652125/article/details/81178943
显卡监控
显卡信息
lspci | grep -i vga
使用nvidia GPU可以:
lspci | grep -i nvidia
[GeForce GTX 960M] (rev a2)
命令行中输入cat /proc/driver/nvidia/version查看显卡信息
https://us.download.nvidia.cn/XFree86/Linux-x86_64/384.130/NVIDIA-Linux-x86_64-384.130.run
前边的序号 "00:0f.0"是显卡的代号(这里是用的虚拟机);
查看指定显卡的详细信息用以下指令:
lspci -v -s 00:0f.0
nvidia-smi
表头释义:
Fan:显示风扇转速,数值在0到100%之间,是计算机的期望转速,如果计算机不是通过风扇冷却或者风扇坏了,显示出来就是N/A;
Temp:显卡内部的温度,单位是摄氏度;
Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能;
Pwr:GPU能耗表示;
Bus-Id:涉及GPU总线的相关信息;
Disp.A:是Display Active的意思,表示GPU的显示是否初始化;
Memory Usage:显存的使用率;
Volatile GPU-Util:浮动的GPU利用率;
Compute M:计算模式;
下边的Processes显示每块GPU上每个进程所使用的显存情况。
如果要周期性的输出显卡的使用情况,可以用watch指令实现:
watch -n 10 nvidia-smi
#nvidia-smi
nvidia-smi -L #列出gpu 及id
GPU 0: GeForce GTX 960M (UUID: GPU-4d52e430-b8c7-a0b9-7fda-4aa825af5c97)
nvidia-smi –i gpuid # 指定gpuid 0,1,2,
nvidia-smi –l xxx
动态刷新信息(默认5s刷新一次),按Ctrl+C停止,可指定刷新频率,以秒为单位
nvidia-smi –f xxx
将查询的信息输出到具体的文件中,不在终端显示
nvidia-smi -q 查询所有GPU的当前详细信息
nvidia-smi –q –i xxx
指定具体的GPU或unit信息
nvidia-smi –q –f xxx
将查询的信息输出到具体的文件中,不在终端显示
nvidia-smi –q –x
将查询的信息以xml的形式输出
nvidia-smi -q –d xxx
指定显示GPU卡某些信息,xxx参数可以为MEMORY, UTILIZATION, ECC, TEMPERATURE, POWER,CLOCK, COMPUTE, PIDS, PERFORMANCE, SUPPORTED_CLOCKS, PAGE_RETIREMENT,ACCOUNTING
nvidia-smi –q –l xxx
动态刷新信息,按Ctrl+C停止,可指定刷新频率,以秒为单位
nvidia-smi --query-gpu=gpu_name,gpu_bus_id,vbios_version--format=csv
选择性查询选项,可以指定显示的属性选项
可查看的属性有:timestamp,driver_version,pci.bus,pcie.link.width.current等。(可查看nvidia-smi--help-query–gpu来查看有哪些属性)
2.3 设备修改选项
可以手动设置GPU卡设备的状态选项
nvidia-smi –pm 0/1
设置持久模式:0/DISABLED,1/ENABLED
nvidia-smi –e 0/1
切换ECC支持:0/DISABLED, 1/ENABLED
nvidia-smi –p 0/1
重置ECC错误计数:0/VOLATILE, 1/AGGREGATE
nvidia-smi –c
设置计算应用模式:0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED
nvidia-smi –r
GPU复位
nvidia-smi –vm
设置GPU虚拟化模式
nvidia-smi –ac xxx,xxx
设置GPU运行的工作频率。e.g. nvidia-smi –ac2000,800
nvidia-smi –rac
将时钟频率重置为默认值
nvidia-smi –acp 0/1
切换-ac和-rac的权限要求,0/UNRESTRICTED, 1/RESTRICTED
nvidia-smi –pl
指定最大电源管理限制(瓦特)
nvidia-smi –am 0/1
启用或禁用计数模式,0/DISABLED,1/ENABLED
nvidia-smi –caa
清除缓冲区中的所有已记录PID,0/DISABLED,1/ENABLED
nvidia-smi pmon
nvidia-smi pmon –i xxx
用逗号分隔GPU索引,PCI总线ID或UUID
nvidia-smi pmon –d xxx
指定刷新时间(默认为1秒,最大为10秒)
nvidia-smi pmon –c xxx
显示指定数目的统计信息并退出
nvidia-smi pmon –s xxx
指定显示哪些监控指标(默认为u),其中:
u:GPU使用率
m:FB内存使用情况
nvidia-smi pmon –o D/T
指定显示的时间格式D:YYYYMMDD,THH:MM:SS
nvidia-smi pmon –f xxx
将查询的信息输出到具体的文件中,不在终端显示
阿里云GPU监控指标
MetricName | 单位 | 名称 |
---|---|---|
gpu_memory_freespace | Byte | GPU维度显存空闲量 |
gpu_memory_totalspace | Byte | GPU维度显存总量 |
gpu_memory_usedspace | Byte | GPU维度显存使用量 |
gpu_gpu_usedutilization | % | GPU维度GPU使用率 |
gpu_encoder_utilization | % | GPU维度编码器使用率 |
gpu_decoder_utilization | % | GPU维度解码器使用率 |
gpu_gpu_temperature | ℃ | GPU维度GPU温度 |
gpu_power_readings_power_draw | W | GPU维度GPU功率 |
gpu_memory_freeutilization | % | GPU维度显存空闲率 |
gpu_memory_useutilization | % | GPU维度显存使用率 |
基于阿里云容器服务监控 Kubernetes集群GPU指标 https://www.jianshu.com/p/1c7ddf18e8b2
检测脚本 #未测试
monitor.sh
GPU跨平台通用监控脚本
功能: Useage: monitor.sh fast|mem|gpu|temp|all|[pathToLog sleepTimeNum]
注意: ./monitor.sh fast速度最快
#nvidia-smi pmon -h#!/bin/bash
#. /etc/profile
#. ~/.bash_profile
#. ~/.bashrc
# 判断nvidia-smi命令是否存在
#/usr/bin/nvidia-smi > /dev/nullif
# if [ $? -eq 0 ];then
# echo 'nvidia-smi check pass' `date`
# else
# echo 'nvidia-smi not exists'
# exit 1
# fi
# 获取GPU Count
get_gpu_list()
{
count=`nvidia-smi -L|wc -l`
echo $count
}
#获取GPU id对应uuid
get_uuid()
{
uuid=`nvidia-smi -q -i $1|grep 'UUID'|awk '{print $4}'` echo $uuid
}
#获取显存使用率
get_memory_usage()
{
usage=`nvidia-smi -q -d MEMORY -i $1|grep -E 'Total|Used'|head -2|awk '{print $3}'|xargs echo|awk '{print $2/$1}'`
echo $usage
}
#获取内存详细信息
get_memory_detail()
{
detail=`nvidia-smi -q -d MEMORY -i $1|grep -E 'Total|Used|Free'|head -3|awk '{print $3}'|xargs echo`
echo $detail
}
#获取GPU使用率
get_volatile_gpu(){
vol=`nvidia-smi -q -d UTILIZATION -i $1 |grep -A 5 "GPU Utilization"|tail -1|awk '{print $3}'`
echo $vol
}
#获取GPU Current 温度
get_temperature()
{
temp=`nvidia-smi -q -d Temperature -i $1|grep 'GPU Current'|awk '{print $5}'`
echo $temp
}
#获取Pod_id
get_pod_id()
{
echo `hostname`
}
#数据output
#output $1 $2 $3 $4 $5
#$1 字段名 $2 pod_id $3 gpu编号 $4 uuid $5 监控值
output(){
echo $1"{podid=""$2"",gpu=""$3"",uuid=""$4""}" $5
}
#输出mem prometheus格式数据
#dcgm_mem_usage{pod_id="localhost"}
mem_prm()
{
for((i=0;i<`get_gpu_list`;i++))
do
name="dcgm_mem_usage"
pod_id=`get_pod_id`
uuid=`get_uuid $i`
value=`get_memory_usage $i`
output $name $pod_id $i $uuid $value
done
}
#输出mem detail prometheus格式数据#dcgm_mem_detail{pod_id="localhost"}
mem_detail_prm()
{
for((i=0;i<`get_gpu_list`;i++))
do
pod_id=`get_pod_id`
uuid=`get_uuid $i`
value=`get_memory_detail $i`
output "dcgm_fb_total" $pod_id $i $uuid `echo $value|awk '{print $1}'`
output "dcgm_fb_used" $pod_id $i $uuid `echo $value|awk '{print $2}'`
output "dcgm_fb_free" $pod_id $i $uuid `echo $value|awk '{print $3}'`
done
}
#输出gpu prometheus格式数据
#dcgm_gpu_utilization{...}
gpu_prm()
{
for((i=0;i<`get_gpu_list`;i++))
do
name="dcgm_gpu_utilization"
pod_id=`get_pod_id`
uuid=`get_uuid $i`
value=`get_volatile_gpu $i`
output $name $pod_id $i $uuid $value
done
}
#输出温度 prometheus格式数据
#dcgm_temp{...}
temp_prm()
{
for((i=0;i<`get_gpu_list`;i++))
do
name="dcgm_temp"
pod_id=`get_pod_id`
uuid=`get_uuid $i`
value=`get_temperature $i`
output $name $pod_id $i $uuid $value
done
}
allinone()
{
mem_prm
mem_detail_prm
gpu_prm
temp_prm
}
#快速获取
fast()
{
nvidia-smi -q > /tmp/1
num=0
count=0
uuid=''
first=0
for i in `cat /tmp/1|grep -E 'Minor Number|UUID|GPU Current Temp|Gpu|Total|Used|Free'|cut -d ':' -f2|awk '{print $1}'`
do
if [ $num -eq 0 ];then
uuid=$i
elif [ $num -eq 1 ];then
count=$i
elif [ $num -eq 2 ];then
if [ $first -lt 13 ];then
echo '# HELP dcgm_fb_total Framebuffer memory total (in MiB).'
echo '# TYPE dcgm_fb_total gauge'
fi
output 'dcgm_fb_total' ${HOSTNAME} $count $uuid $i
elif [ $num -eq 3 ];then
if [ $first -lt 13 ];then
echo '# HELP dcgm_fb_used Framebuffer memory used (in MiB).'
echo '# TYPE dcgm_fb_used gauge'
fi
output 'dcgm_fb_used' ${HOSTNAME} $count $uuid $i
elif [ $num -eq 4 ];then
if [ $first -lt 13 ];then
echo '# HELP dcgm_fb_free Framebuffer memory free (in MiB).'
echo '# TYPE dcgm_fb_free gauge'
fi
output 'dcgm_fb_free' ${HOSTNAME} $count $uuid $i
elif [ $num -eq 8 ];then
if [ $first -lt 13 ];then
echo '# HELP dcgm_gpu_utilization GPU utilization (in %).'
echo '# TYPE dcgm_gpu_utilization gauge'
fi
output 'dcgm_gpu_utilization' ${HOSTNAME} $count $uuid $i
elif [ $num -eq 13 ];then
if [ $first -le 13 ];then
echo '# HELP dcgm_gpu_temp GPU temperature (in C).'
echo '# TYPE dcgm_gpu_temp gauge'
fi
output 'dcgm_gpu_temp' ${HOSTNAME} $count $uuid $i
fi
if [ $num -eq 13 ];then
num=0
else
((num++))