PVE 概览增加 GPU 状态显示

效果图

修改

**
API 增加代码:/usr/share/perl5/PVE/API2/Nodes.pm**
增加代码:

$res->{gpu_info} = `nvidia-smi --query-gpu=index,name,memory.total,memory.used,memory.free,temperature.gpu,utilization.gpu,power.draw`;

页面JS 增加代码:/usr/share/pve-manager/js/pvemanagerlib.js

 {
    itemId: 'gpu-info',
    colspan: 2,
    printBar: false,
    title: gettext('GPU'),
    textField: 'gpu_info',
    renderer: function(value) {
        if (!value) return 'No GPU detected';
        
        var lines = value.split('\n');
        var html = '<div style="font-family: monospace; font-size: 12px;">';
        var gpuCount = 0;
        
        lines.forEach(function(line, index) {
            if (line.trim() === '' || index === 0) return; // 跳过空行和第一行标题
            
            var parts = line.split(', ');
            if (parts.length >= 8) {
                gpuCount++;
                html += '<div style="margin-bottom: 10px; padding: 5px;  border-radius: 3px;">';
                html += '<strong>GPU ' + parts[0] + ':</strong> ' + parts[1] + '<br/>';
                
                // 显存使用进度条
                var memTotal = parseInt(parts[2]);
                var memUsed = parseInt(parts[3]);
                var memPercent = memTotal > 0 ? Math.round((memUsed / memTotal) * 100) : 0;
                html += '<div style="margin: 3px 0;">';
                html += '<span>Memory: ' + parts[3] + ' / ' + parts[2] + '</span>';
                html += '<div style="width: 100%; height: 10px; background: #ddd; border-radius: 5px; margin: 2px 0;">';
                html += '<div style="width: ' + memPercent + '%; height: 100%; background: ' + 
                        (memPercent > 80 ? '#e53935' : memPercent > 60 ? '#ff9800' : '#4caf50') + 
                        '; border-radius: 5px;"></div>';
                html += '</div>';
                html += '</div>';
                
                // 其他信息
                html += '<div style="display: flex; justify-content: space-between; font-size: 11px;">';
                html += '<span>Usage: ' + parts[6] + '</span>';
                html += '<span> Temp: ' + parts[5] + '°C</span>';
                html += '<span> Power: ' + parts[7] + '</span>';
                html += '</div>';
                
                html += '</div>';
            }
        });
        
        if (gpuCount === 0) {
            html = 'No GPU data available';
        }
        
        html += '</div>';
        return html;
    }
}

PS:修改后记得调整显示高度:
参考:https://blog.mstg.top/archives/945#toc-head-9

重启PVE相关:

systemctl restart pveproxy
systemctl restart pvedaemon

TAG:Linux, PVE

发表新评论