如何知道docker谁占用的显卡的显存?

文章目录

python环境安装nvidia-htop

nvidia-htop是一个看详细的工具。

css 复制代码
pip3 install nvidia-htop

查看pid

指令是:

css 复制代码
nvidia-smi | nvidia-htop.py -l

比如0卡有进程PID是3311673,是root占用。凡是USER里不是普通用户名的,都是docker run起来的容器在使用显存。如何查看3311673是谁在占用?

我们需要找到进程的 cgroup 文件,然后从 cgroup 文件中提取容器 ID。

找到进程的 cgroup 文件:

css 复制代码
cat /proc/3311673/cgroup

容器id是923dc8979571a的这个容器,启动了进程3311673,占用了显存。容器的名字是daonan_sdxl。

这一步之后只有审计追溯了,或者可以从inspect里找一些信息确认一下。

css 复制代码
docker inspect daonan_sdxl

查了一下:https://cloud.tencent.com/developer/ask/sof/115145807,使用docker 就相当于是匿名用户,docker本身不会记忆谁执行了它。

加一个追踪

在Docker中,直接通过Docker命令来追踪启动容器的具体用户是不太可能的,因为Docker并不会默认记录启动容器的用户信息。不过,可以通过以下一些方法来间接地追踪和记录相关信息:

创建文件:

css 复制代码
touch /var/log/docker-commands.log
chmod 777 /var/log/docker-commands.log

进入这里:

css 复制代码
cd /usr/bin/
mv docker docker-original

创建一个脚本 docker

vim docker

sh 复制代码
#!/bin/bash

# 记录docker run命令
if [[ "$1" == "run" ]]; then
  echo "$(date) - $(whoami) - $@" >> /var/log/docker-commands.log
fi

# 执行docker命令
/usr/bin/docker-original "$@"

加权限:

sh 复制代码
sudo chmod +x /usr/bin/docker

ok!

总结一下【找到容器创建时间】

创建这个脚本:

sh 复制代码
#!/bin/bash

# 检查是否提供了PID参数
if [ -z "$1" ]; then
  echo "Usage: $0 <PID>"
  exit 1
fi

PID=$1

# 获取进程的cgroup文件内容
CGROUP_FILE="/proc/$PID/cgroup"

if [ ! -f "$CGROUP_FILE" ]; then
  echo "PID $PID does not exist or /proc/$PID/cgroup file not found."
  exit 1
fi

# 提取容器ID
CONTAINER_ID=$(cat $CGROUP_FILE | grep 'docker' | sed 's/.*\///' | grep -o -E '[0-9a-f]{64}' | tail -n 1)

if [ -z "$CONTAINER_ID" ]; then
  echo "No Docker container found for PID $PID."
  exit 1
fi

# 获取容器名称
CONTAINER_NAME=$(docker inspect --format '{{.Name}}' $CONTAINER_ID | sed 's/^\/\(.*\)/\1/')

if [ -z "$CONTAINER_NAME" ]; then
  echo "Failed to retrieve container name for container ID $CONTAINER_ID."
  exit 1
fi

# 获取容器创建时间
CONTAINER_CREATED=$(docker inspect --format '{{.Created}}' $CONTAINER_ID)

if [ -z "$CONTAINER_CREATED" ]; then
  echo "Failed to retrieve creation time for container ID $CONTAINER_ID."
  exit 1
fi

# 输出结果
echo "Container ID: $CONTAINER_ID"
echo "Container Name: $CONTAINER_NAME"
echo "Container Created: $CONTAINER_CREATED"

exit 0

使用说明

  1. 将上述脚本保存为 find_container_by_pid.sh

  2. 给脚本添加执行权限:

    sh 复制代码
    chmod +x find_container_by_pid.sh
  3. 运行脚本并传入一个PID:

    sh 复制代码
    ./find_container_by_pid.sh <PID>

示例

sh 复制代码
./find_container_by_pid.sh 3311673

该脚本将会输出指定PID对应的容器ID、容器名称和容器创建时间。

再总结一下【用PID找到容器创建时间,从而找到谁创建的】

可以通过编写一个新的Shell脚本来实现这个功能。这个脚本将会基于容器的创建时间,从日志文件 /var/log/docker-commands.log 中查找对应的记录。以下是这个新脚本的实现:

sh 复制代码
#!/bin/bash

# 检查是否提供了PID参数
if [ -z "$1" ]; then
  echo "Usage: $0 <PID>"
  exit 1
fi

PID=$1

# 调用之前的脚本来获取容器ID、名称和创建时间
container_info=$(./find_container_by_pid.sh $PID)
if [ $? -ne 0 ]; then
  echo "Failed to get container info for PID $PID."
  exit 1
fi

# 提取容器创建时间和容器ID
CONTAINER_CREATED=$(echo "$container_info" | grep "Container Created:" | awk '{print $3}')
CONTAINER_ID=$(echo "$container_info" | grep "Container ID:" | awk '{print $3}')

echo $CONTAINER_ID

# 将创建时间转换为前后1秒的时间范围
start_time=$(date -d "$(echo $CONTAINER_CREATED | sed 's/Z//') -1 second" +"%Y-%m-%dT%H:%M:%S")
end_time=$(date -d "$(echo $CONTAINER_CREATED | sed 's/Z//') +1 second" +"%Y-%m-%dT%H:%M:%S")

# 从日志文件中查找对应时间范围的记录
log_file="/var/log/docker-commands.log"
if [ ! -f "$log_file" ]; then
  echo "Log file $log_file not found."
  exit 1
fi

echo "Searching for logs between $start_time and $end_time"
log_entries=$(grep -E "$start_time|$end_time" $log_file)

# 打印结果
if [ -z "$log_entries" ]; then
  echo "No log entries found for the specified time range."
else
  echo "Log entries found:"
  echo "$log_entries"
  echo ""
  echo "Container Creator and ID:"
  echo "$log_entries" | while read -r line ; do
    creator=$(echo $line | awk '{print $4}')
    echo "Creator: $creator, Container ID: $CONTAINER_ID"
  done
fi

exit 0

使用说明

  1. 确保之前的脚本 find_container_by_pid.sh 是可执行的,并且路径正确。

  2. 将上述新脚本保存为 find_container_creator.sh

  3. 给新脚本添加执行权限:

    sh 复制代码
    chmod +x find_container_creator.sh
  4. 运行新脚本并传入一个PID:

    sh 复制代码
    ./find_container_creator.sh <PID>

示例

sh 复制代码
./find_container_creator.sh 3311673

该脚本将会基于容器的创建时间,从日志文件 /var/log/docker-commands.log 中查找对应时间范围的记录,并打印出来。希望这个新脚本能满足你的需求。

相关推荐
成都古河云21 分钟前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市
算法与编程之美23 分钟前
文件的写入与读取
linux·运维·服务器
Amelio_Ming1 小时前
Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决
linux·运维·ssh
心灵彼岸-诗和远方1 小时前
Devops业务价值流:软件研发最佳实践
运维·产品经理·devops
JuiceFS1 小时前
好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
运维·云原生
Ven%2 小时前
centos查看硬盘资源使用情况命令大全
linux·运维·centos
景天科技苑2 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
萨格拉斯救世主2 小时前
戴尔R930服务器增加 Intel X710-DA2双万兆光口含模块
运维·服务器
Jtti2 小时前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
yeyuningzi3 小时前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器