{"id":6864,"date":"2026-08-06T10:32:46","date_gmt":"2026-08-06T02:32:46","guid":{"rendered":"https:\/\/www.alfredivy.sg\/blogger\/?p=6864"},"modified":"2026-08-06T10:45:29","modified_gmt":"2026-08-06T02:45:29","slug":"getting-intel-uhd-630-gpu-monitoring-working-in-beszel-on-proxmox-debian-docker","status":"publish","type":"post","link":"https:\/\/www.alfredivy.sg\/blogger\/2026\/08\/getting-intel-uhd-630-gpu-monitoring-working-in-beszel-on-proxmox-debian-docker\/","title":{"rendered":"Getting Intel UHD 630 GPU Monitoring Working in Beszel on Proxmox\/Debian Docker"},"content":{"rendered":"\n<p class=\"has-drop-cap wp-block-paragraph\">Beszel monitoring does not chart GPU performance even though Jellyfin was successfully using Intel GPU<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Beszel GPU charts are not displayed during Jellyfin hardware transcoding, manually change from default 1.5Mbps to 420kbps.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Caution: Jellyfin usage of GPU is not consistent.  It possible for the jobs for the GPU to be fully completed while the video is still in the midst of playing.  This can easily be mistaken as Beszel not reading the counters properly or no counters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jellyfin use of GPU is verified by running in Bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>intel_gpu_top<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verification of what GPU stats Beszel can read via running intel_gpu_top inside the Docker container.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker exec beszel-agent intel_gpu_top -L<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">As there are 2 GPUs in the container, care is required to specify the correct unit.  Proxmox provided the card0, virtual GPU.  card1 was created to provide hardware GPU support<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>card0 = QEMU virtual GPU\ncard1 = Intel UHD 630<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following to the Beszel-agent section in compose.yml<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>image: henrygd\/beszel-agent-intel\n\ncap_add:\n  - CAP_PERFMON\n  - SYS_ADMIN\n\ndevices:\n  - \/dev\/dri:\/dev\/dri\n\nenvironment:\n  INTEL_GPU_DEVICE: drm:\/dev\/dri\/renderD128\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Change the <strong>image <\/strong>to intel for GPU support. <strong>cap_add<\/strong> key pair is monitoring and admin access.  Both values are required. <strong>devices<\/strong> is required to declare the GPU usage.  The <strong>environment <\/strong>is point the desired GPU, in our case RenderD128.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Useful verification commands<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls -l \/dev\/dri\nlspci -k -s 00:10.0\ndocker inspect beszel-agent --format '{{json .HostConfig.Devices}}'\ndocker inspect beszel-agent --format '{{json .HostConfig.CapAdd}}'\ndocker exec beszel-agent intel_gpu_top -L\ndocker exec beszel-agent intel_gpu_top -d drm:\/dev\/dri\/renderD128\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The final output should look something like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name: beszel\nservices:\n  beszel:\n    image: henrygd\/beszel\n    container_name: beszel\n    restart: unless-stopped\n    environment:\n      - APP_URL=http:\/\/10.10.10:8090\n    ports:\n      - 8090:8090\n    volumes:\n      - .\/beszel_data:\/beszel_data\n\n\n  beszel-agent:\n    image: henrygd\/beszel-agent-intel\n    container_name: beszel-agent\n    restart: unless-stopped\n    network_mode: host\n    cap_add:\n      - CAP_PERFMON\n      - SYS_ADMIN\n    devices:\n      - \/dev\/dri:\/dev\/dri\n    volumes:\n      - \/var\/run\/docker.sock:\/var\/run\/docker.sock:ro\n      - .\/beszel_agent_data:\/var\/lib\/beszel-agent\n      # monitor other disks \/ partitions by mounting a folder in \/extra-filesystems\n      # - \/mnt\/disk\/.beszel:\/extra-filesystems\/sda1:ro\n    environment:\n      LISTEN: 45876\n      KEY: 'ssh-ed25519 keyKeykeyKeykeyKeykeyKeykeyKeykeyKeykeyKeykeyKeykeyKeykeyKey'\n      TOKEN: token-tokenTokentoken-aad-tokenTokentoken\n      HUB_URL: http:\/\/10.10.10:8090\n      INTEL_GPU_DEVICE: drm:\/dev\/dri\/renderD128\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Beszel monitoring does not chart GPU performance even though Jellyfin was successfully using Intel GPU<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[636],"tags":[644,611,634,632],"class_list":["post-6864","post","type-post","status-publish","format-standard","hentry","category-homelab","tag-beszel","tag-docker","tag-gpu","tag-proxmox"],"_links":{"self":[{"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/posts\/6864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/comments?post=6864"}],"version-history":[{"count":6,"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/posts\/6864\/revisions"}],"predecessor-version":[{"id":6871,"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/posts\/6864\/revisions\/6871"}],"wp:attachment":[{"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/media?parent=6864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/categories?post=6864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.alfredivy.sg\/blogger\/wp-json\/wp\/v2\/tags?post=6864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}