GLXOSD: monitorando a temperatura da CPU e uso e temperatura da GPU em tempo real no Fedora

O GLXOSD é uma ferramenta que pode ser muito útil para quem quer saber o desempenho dos games no computador durante a execução de jogos. O que o aplicativo faz, basicamente:

  • Exibir os Frame per Seconds (FPS), dos ultimos segundos.

Com a ajuda do lm-sensors (libsensors):

  • Temperatura da CPU (cores e o CPU fisico).

Com os drivers proprietários da NVIDIA (onde é o fabricante que o software possui suporte), o GLXOSD também pode exibir:

  • Modelo da GPU e temperaturas;
  • Utilização da GPU
  • Memória utilizada
  • Clocks

Entretando, o software pode ser expandido para exibir outras informações.

Obs: Entenda que os comandos precedidos por “$” são feitos com o usuário normal e com “#” com root.

Para instalar no Fedora, segue o roteiro abaixo:

1 – Baixando as dependências:

a) Instale o lm_sensors com:

$ sudo dnf install lm_sensors

b) Configure-o com:

$ sudo sensors-detect

Utilize as respostas padrão quando questionado.

2 – Instalando o GLXOSD via COPR:

a) Ativando o repositório:

$ sudo dnf copr enable kparal/glxosd

b) Apagando o conteúdo do arquivo de repositório:

# echo > /etc/yum.repos.d/_copr_kparal-glxosd.repo

c) Adicionando o conteúdo correto:

# vim /etc/yum.repos.d/_copr_kparal-glxosd.repo

Insira o conteúdo abaixo no arquivo:

[kparal-glxosd-x86_64]
name=Copr repo for glxosd owned by kparal (x86_64)
baseurl=https://copr-be.cloud.fedoraproject.org/results/kparal/glxosd/fedora-$releasever-x86_64/
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/kparal/glxosd/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1

[kparal-glxosd-i386]
name=Copr repo for glxosd owned by kparal (i386)
baseurl=https://copr-be.cloud.fedoraproject.org/results/kparal/glxosd/fedora-$releasever-i386/
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/kparal/glxosd/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1

c) Instalando os pacotes:

$ sudo dnf install glxosd.x86_64 glxosd.i686

3 – Corrigindo os arquivos de configuração necessários:

3.1 – Para corrigir a exibição das informações da GPU NVIDIA

a) Apague o conteúdo do arquivo /etc/glxosd/paths.lua:

# echo > /etc/glxosd/paths.lua

b) Insira o seguinte conteúdo: (use o editor de sua preferência. Eu estou usando o vim)

$ sudo vim /etc/glxosd/paths.lua
local io = require("io")
local ffi = require("ffi")
local arch = ConfigurationManager.config_file("arch.lua")

local function get_nvidia_driver_version()
local f = io.open("/proc/driver/nvidia/version", "r")
if not f then return nil end
local res = f:read("*line"):match("Kernel Module%s+([0-9]+)%.")
f:close()
return res
end

local NVIDIA_DRIVER_VERSION = get_nvidia_driver_version() or "unknown"

PATH_CONFIG = {
x64 = {
x64 = {
libGL = "libGL.so.1",
libX11 = "libX11.so.6",
libfreetype_gl = "libglxosd-freetype-gl.so.3",
libfontconfig = "libfontconfig.so.1",
libsensors = "libsensors.so.4",
libnvidia_ml = "/usr/lib64/libnvidia-ml.so.1"
},
x86 = {
libGL = "libGL.so.1",
libX11 = "libX11.so.6",
libfreetype_gl = "libglxosd-freetype-gl.so.3",
libfontconfig = "libfontconfig.so.1",
libsensors = "libsensors.so.4",
libnvidia_ml = "/usr/lib/libnvidia-ml.so.1"
}
},
x86 = {
x86 = {
libGL = "libGL.so.1",
libX11 = "libX11.so.6",
libfreetype_gl = "libglxosd-freetype-gl.so.3",
libfontconfig = "libfontconfig.so.1",
libsensors = "libsensors.so.4",
libnvidia_ml = "/usr/lib/libnvidia-ml.so.1"
}
}
}

CURRENT_PATH_CONFIG = PATH_CONFIG[arch.kernel_architecture][ffi.arch]

3.2 – Para corrigir a exibição das informações da CPU:

a) Apague o conteúdo do arquivo /usr/share/glxosd/glxosd/plugins/OSD/dataproviders/LibsensorsDataProvider.lua

# echo > /usr/share/glxosd/glxosd/plugins/OSD/dataproviders/LibsensorsDataProvider.lua

b) Insira o seguinte conteúdo: (use o editor de sua preferência. Eu estou usando o vim)

# vim /usr/share/glxosd/glxosd/plugins/OSD/dataproviders/LibsensorsDataProvider.lua
--[[
Copyright (C) 2016 Nick Guletskii

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]

local ffi = require("ffi")
local sens = require("ffi/libsensors")
local DummyStatistics = require("plugins/OSD/dataproviders/DummyDataProvider")
local MarkupElement = require("rendering/MarkupElement")
if not sens then
return DummyStatistics
end

sens.sensors_init(nil);
local LibsensorsDataProvider = {
}
LibsensorsDataProvider.__index = LibsensorsDataProvider;

function LibsensorsDataProvider:begin_frame ()

end

function LibsensorsDataProvider:end_frame ()

end

function LibsensorsDataProvider:begin_timespan ()

end

local function subfeatures(chip, feature)
local subfeature_number = ffi_types.int_ref();
local subfeatures = {}
while true do
local subfeature = sens.sensors_get_all_subfeatures(chip, feature, subfeature_number)
if subfeature == nil then
break
end

local name = ffi.string(subfeature[0].name)
local val = ffi_types.double_ref()
sens.sensors_get_value(chip, subfeature[0].number, val)
subfeatures[name] = {
type=LIBSENSORS_SUBFEATURE_TYPES[tonumber(subfeature[0].type)],
value = val[0]
}
end
return subfeatures
end
local function features(chip)
local feature_number = ffi_types.int_ref();
local features = {}
while true do
local feature = sens.sensors_get_features(chip, feature_number)
if feature == nil then
break
end
local name = ffi.string(feature[0].name)
local label_s = sens.sensors_get_label(chip,feature[0])
if label_s ~= nil then
local label = ffi.string(label_s);
ffi.C.free(label_s)
features[name] = {
label = label,
subfeatures = subfeatures(chip, feature)
}
end
end
return features
end

local function chips()
local chip_number = ffi_types.int_ref();
local chips = {}
while true do
local chip = sens.sensors_get_detected_chips(nil, chip_number)
if chip == nil then
break
end
local chipNameBuffer = ffi_types.char_arr(256);
local num = sens.sensors_snprintf_chip_name(chipNameBuffer, 256, chip);
local name = ffi.string(chipNameBuffer, num)
chips[chip_number[0]] = {
name=name,
features = features(chip)
}
end
return chips
end

function LibsensorsDataProvider:end_timespan ()
end

function LibsensorsDataProvider:get_text()
local status, res = pcall(function()
local tbl = self.config.formatter_function(self, chips(), MarkupElement)
assert(tbl and type(tbl) == "table", "The Libsensors data provider formatter function must return a table of elements!")
tbl = remove_nils_from_array(tbl);
for _,v in ipairs(tbl) do
check_class(v, "MarkupElement")
end
return tbl
end)
if not status then
log_error("Libsensors data provider plugin error: formatter function threw and error: " .. res)
return {
MarkupElement.new({
text ="Libsensors data provider plugin error.\nPlease check the log.\n"
})
}
end
return res
end

function LibsensorsDataProvider.new(config)
local self ={}
setmetatable(self, LibsensorsDataProvider)
self.config = config
return self
end

return LibsensorsDataProvider

4 – Teste:

$ glxosd glxgears

Deve ser exibido algo como isso:

5 – Configurando no steam:

a) Botão direito no game desejado e selecione “propriedades”:

b) Clique em “Definir opções de inicialização”:

c) insira o parâmetro glxosd --steam %command% na caixa que surgir e confirme 2 vezes clicando em ok.

Para mais informações, configurações e outros detalhes, confira os links na seção referências, neste post. Também postamos um vídeo em nosso canal oficial no YouTube, onde você pode acompanhar estes passos.

Referências:

https://glxosd.nickguletskii.com/
https://glxosd.nickguletskii.com/docs/use/
https://glxosd.nickguletskii.com/install/
https://glxosd.nickguletskii.com/docs/config/
https://glxosd.nickguletskii.com/docs/opts/
https://glxosd.nickguletskii.com/docs/faq/
https://copr.fedorainfracloud.org/coprs/kparal/glxosd/
https://github.com/nickguletskii/GLXOSD/issues/98

 

 

 

Greyson escreveu 107 artigos

Tecnólogo em Análise e desenvolvimento de sistemas, gosta muito de telecom, redes de computadores, jogos, entusiasta de tecnologias livres, mais precisamente do GNU/Linux.

Deixe um comentário

Seu endereço de email não será publicado. Os campos com * são obrigatórios

Você pode usar estes tags e atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>