NVIDIA (Português)/Tips and tricks (Português)
Consertando a resolução do terminal
Como o NVIDIA (Português)#fbdev é ativado por padrão, o console Linux deve usar a resolução nativa do monitor sem configurações adicionais.
Se você desativou o fbdev ou usa uma versão mais antiga do driver, a resolução pode ser menor do que a esperada. Como alternativa, você pode escolher a resolução na configuração do seu gerenciador de boot.
Para o GRUB, veja GRUB/Tips and tricks#Setting the framebuffer resolution para detalhes. [1] [2]
Para o systemd-boot, ponha console-mode em esp/loader/loader.conf. Veja systemd-boot#Configuração do carregador para detalhes.
Para o rEFInd, ponha use_graphics_for +,linux em esp/EFI/refind/refind.conf.[3] Um pequeno porém é que isso fará com que os parâmetros do kernel não sejam mostrados durante o boot.
Usando o TV-out
Veja Wikibooks:NVIDIA/TV-OUT.
X with a TV (DFP) as the only display
The X server falls back to some "default" screen resolution (usually 640x480) if no monitor is automatically detected. This can be a problem when using a DVI/HDMI/DisplayPort connected TV as the main display, and X is started while the TV is turned off or otherwise disconnected.
To force NVIDIA to use the correct resolution, store a copy of the EDID somewhere in the file system so that X can parse the file instead of reading EDID from the display.
To acquire the EDID, start nvidia-settings. It will show some information in tree format, ignore the rest of the settings for now and select the GPU (the corresponding entry should be titled GPU-0 or similar), click the DFP section (again, DFP-0 or similar), click on the Acquire EDID... button and store it somewhere, for example, /etc/X11/dfp0.edid.
If in the front-end mouse and keyboard are not attached, the EDID can be acquired using only the command line. Run an X server with enough verbosity to print out the EDID block:
$ startx -- -logverbose 6
After the X server has finished initializing, close it and extract the EDID block from the Xorg log file using nvidia-xconfig:
$ nvidia-xconfig --extract-edids-from-file ~/.local/share/xorg/Xorg.0.log --extract-edids-output-file ./dfp0.bin
Edit the Xorg configuration by adding to the Device section:
/etc/X11/xorg.conf.d/20-nvidia.conf
Option "ConnectedMonitor" "DFP" Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin"
The ConnectedMonitor option forces the driver to recognize the DFP as if it were connected. The CustomEDID provides EDID data for the device, meaning that it will start up just as if the TV/DFP was connected during the X process.
This way, one can automatically start a display manager at boot time and still have a working and properly configured X screen by the time the TV gets powered on.
Resolução headless (sem monitor)
No modo headless, a resolução recai em 640x480, que é usada pelo VNC ou Steam Link. Para iniciar em uma resolução mais alta, e.g. 1920x1080, especifique no xorg.conf uma entrada Virtual na subseção Display da seção Screen:
Section "Screen"
[...]
SubSection "Display"
Depth 24
Virtual 1920 1080
EndSubSection
EndSection
Checar a fonte de energia
O driver X.org da NVIDIA pode tamém ser usado para detectar a fonte de energia atual da GPU. Para ver a fonte de energia atual, cheque o parâmetro somente para leitura (read-only) 'GPUPowerSource' (0 - AC, 1 - bateria):
$ nvidia-settings -q GPUPowerSource -t
1
Escutando por eventos ACPI
Os drivers NVIDIA tentam conectar ao daemon acpid automaticamente e escutar por eventos ACPI como nível da bateria, docking, algumas hotkeys, etc. Se a conexão falha, X.org vai ter como saída a seguinte advertência:
~/.local/share/xorg/Xorg.0.log
NVIDIA(0): ACPI: failed to connect to the ACPI event daemon; the daemon NVIDIA(0): may not be running or the "AcpidSocketPath" X NVIDIA(0): configuration option may not be set correctly. When the NVIDIA(0): ACPI event daemon is available, the NVIDIA X driver will NVIDIA(0): try to use it to receive ACPI event notifications. For NVIDIA(0): details, please see the "ConnectToAcpid" and NVIDIA(0): "AcpidSocketPath" X configuration options in Appendix B: X NVIDIA(0): Config Options in the README.
Embora seja completamente inofensiva, você pode se livrar da mensagem desativando a opção ConnectToAcpid no seu /etc/X11/xorg.conf.d/20-nvidia.conf:
Section "Device" ... Driver "nvidia" Option "ConnectToAcpid" "0" ... EndSection
Se você estiver em um laptop, ao invés disso pode ser uma boa ideia instalar e ativar o daemon acpid.
Mostrando a temperatura da GPU no shell
Existem três métodos para obter a temperatura da GPU. nvidia-settings requer que você esteja usando o X, nvidia-smi ou nvclock não. Tenha em mente também que nvclock atualmente não funciona com placas NVIDIA mais recentes como a série GeForce 200 assim como GPUs embutidas como a 8800GS da Zotac IONITX.
nvidia-settings
Para mostrar a temperatura da GPU no shell, use o nvidia-settings da seguinte forma:
$ nvidia-settings -q gpucoretemp
Attribute 'GPUCoreTemp' (hostname:0[gpu:0]): 49.
'GPUCoreTemp' is an integer attribute.
'GPUCoreTemp' is a read-only attribute.
'GPUCoreTemp' can use the following target types: GPU.
A temperatura desta GPU é 49 °C.
Para obter apenas o valor da temperatura, e.g. para uso em utilitários como rrdtool ou conky, execute:
$ nvidia-settings -q gpucoretemp -t
49
nvidia-smi
Use nvidia-smi, que pode ler as temperaturas diretamente da GPU sem a necessidade do X, e.g. quando rodando sob o Wayland ou em um servidor headless.
Para mostrar a temperatura da GPU no shell, execute nvidia-smi:
$ nvidia-smi
Wed Feb 28 14:27:35 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 550.54.14 Driver Version: 550.54.14 CUDA Version: 12.4 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce GTX 1660 Ti Off | 00000000:01:00.0 On | N/A | | 0% 49C P8 9W / 120W | 138MiB / 6144MiB | 2% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | 0 N/A N/A 223179 G weston 120MiB | +-----------------------------------------------------------------------------------------+
Para uma saída relacionada apenas à temperatura:
$ nvidia-smi -q -d TEMPERATURE
==============NVSMI LOG==============
Timestamp : Wed Feb 28 14:27:35 2024
Driver Version : 550.54.14
CUDA Version : 12.4
Attached GPUs : 1
GPU 00000000:01:00.0
Temperature
GPU Current Temp : 49 C
GPU T.Limit Temp : N/A
GPU Shutdown Temp : 95 C
GPU Slowdown Temp : 92 C
GPU Max Operating Temp : 90 C
GPU Target Temperature : 83 C
Memory Current Temp : N/A
Memory Max Operating Temp : N/A
Para obter apenas o valor da temperatura, e.g. para uso em utilitários como rrdtool or conky, execute:
$ nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits
49
nvclock
Pode haver uma diferença significativa entre as temperaturas reportadas pelo nvclock e nvidia-settings/nv-control. De acordo com este post pelo autor (thunderbird) do nvclock, os valores do nvclock devem ser mais precisos.
Overclocking e resfriamento
Ativando o overclock no nvidia-settings
- Algumas configurações de overclocking não podem ser aplicadas se o servidor Xorg estiver rodando no modo rootless. Considere rodar o Xorg como raiz.
- Pode ser que você também precise executar o nvidia-settings como raiz.
- Ativar o DRM kernel mode setting pode fazer com que o overclocking fique indisponível, independentemente do valor de Coolbits.
Dependendo da versão do driver, alguns recursos de overclocking são ativados por padrão. Alguns outros recursos não suportados de overclocking devem ser ativados pela opção Coolbits na seção Device:
Option "Coolbits" "value"
# nvidia-xconfig --cool-bits=value
O valor de Coolbits é a soma de seus bits componentes no sistema numérico binário. Os bits componentes são:
-
8(bit 3) - Ativa configurações adicionais de overclocking na página do PowerMizer no nvidia-settings. Disponível desde a versão 337.12 para a arquitetura Fermi e mais recentes. [4] -
16(bit 4) - Ativa a sobrevoltagem usando as opções CLI do nvidia-settings. Disponível desde a versão 346.16 para a arquitetura Fermi e mais recentes. [5]
Caso você use uma versão não suportada do driver, você pode ter que também usar estes bits:
-
1(bit 0) - Ativa as opções de overclocking de núcleos mais antigos (pré-Fermi) na página Clock Frequencies no nvidia-settings. Removido na versão 343.13. -
2(bit 1) - Quando esse bit está posto, o driver "tentará inicializar SLI ao utilizar GPUs com quantidades diferentes de memória de vídeo". Removido na versão 470.42.01. -
4(bit 2) - Ativa a opção de configuração manual da velocidade dos ventiladores da GPU na página Thermal Monitor no nvidia-settings. Removido na versão 470.42.01.
Para ativar múltiplos recursos, some os valores de Coolbits juntos. Por exemplo, para ativar o overclocking e a sobrevoltagem de núcleos Fermi, ponha Option "Coolbits" "24".
A documentação do Coolbits pode ser encontrada em /usr/share/doc/nvidia/html/xconfigoptions.html e aqui.
Pondo clocks 2D/3D estáticos
Use o seguinte parâmetro de módulo para ativar o PowerMizer em seu nível máximo de performance (VSync não irá funcionar sem isso):
/etc/modprobe.d/nvidia.conf
options nvidia NVreg_RegistryDwords="PerfLevelSrc=0x2222"
Abaixando os clocks de boost da GPU
Com GPUs Volta (NV140/GVXXX) e mais novas, o boost no clock funciona de uma forma diferente, e os clocks máximos são postos no maior limite suportado na inicialização. Se isso é o que você quer, então não é necessária nenhuma configuração adicional.
A contrapartida é a menor eficiência energética. Conforme os clocks vão aumentando, uma voltagem maior é necessária para se ter estabilidade, resultando em um aumento não-linear no consumo energético, aquecimento, e ruído dos ventiladores. Diminuindo o limite do boost no clock aumentará portanto a eficiência.
Os limites para o boost no clock podem ser alterados usando o nvidia-smi, executado como root:
- Listar frequências de clock suportadas:
$ nvidia-smi -q -d SUPPORTED_CLOCKS
- Pôr o limite de boost do clock em 1695 MHz:
# nvidia-smi --lock-gpu-clocks=0,1695 --mode=1
- Pôr o limite de boost do clock da memória em 5001 MHz:
# nvidia-smi --lock-memory-clocks=0,5001
Para otimizar para eficiência, use nvidia-smi para verificar a utilização da GPU enquanto roda seu jogo favorito. VSync deve estar ativado. Abaixar o limite do boost do clock causará um aumento na utilização da GPU, pois uma GPU mais lenta usará mais tempo para renderizar cada frame. A melhor eficiência é alcançada com os clocks mais baixos que não causem pequenos travamentos (stutters) resultantes de 100% de utilização. Dessa forma, cada frame pode ser renderizado rápido o suficiente apenas para acompanhar a taxa de atualização da tela.
Como um exemplo, usar as configurações acima ao invés das padrão em uma RTX 3090 Ti, jogando Hitman 3 em 4K@60, reduz o consumo energético por 30%, temperatura de 75°C para 63°C, e velocidade dos ventiladores de 73% para 57%.
Salvando configurações de overclocking
Tipicamente, offsets do clock e da voltagem inseridos na interface do nvidia-settings não são salvos, sendo perdidos após um reboot. Felizmente, existem ferramentas que oferecem uma interface para fazer overclocking sob o driver proprietário, com a capacidade de salvar as preferências de overclocking do usuário e aplicá-las automaticamente na inicialização. Algumas delas são:
- gwe — Gráfica, aplica as configurações no início da sessão do desktop.
- nvclock / systemd-nvclock-unit — Gráfica, ambas aplicam as configurações no boot do sistema.
-
nvoc — Baseada em texto; perfis são arquivos de configuração em
/etc/nvoc.d/; aplica as configurações no início da sessão do desktop.
Caso contrário, os atributors GPUGraphicsClockOffset e GPUMemoryTransferRateOffset podem ser postos na interface de linha de comando do nvidia-settings durante a inicialização. Por exemplo:
$ nvidia-settings -a "GPUGraphicsClockOffset[performance_level]=offset" $ nvidia-settings -a "GPUMemoryTransferRateOffset[performance_level]=offset"
Onde performance_level é o número do nível de performance mais alto. Se houver múltiplas GPUs na máquina, o ID da GPU deve ser especificado:
[gpu:gpu_id]GPUGraphicsClockOffset[performance_level]=offset
Script simples de overclocking usando NVML
A NVIDIA Management Library (biblioteca de gerenciamento NVIDIA), ou NVML, providencia uma API que pode gerenciar os offsets do clock e o limite de energia para os núcleos e a memória da GPU. Para utilizar isso, você pode instalar python-nvidia-ml-py e então usar o seguinte script em Python com suas configurações desejadas. Este script precisa ser executado como root após cada reinício do sistema para reaplicar o overclock.
#!/usr/bin/env python from pynvml import * nvmlInit() # This sets the GPU to adjust - if this gives you errors or you have multiple GPUs, set to 1 or try other values myGPU = nvmlDeviceGetHandleByIndex(0) # The GPU clock offset value should replace "000" in the line below. nvmlDeviceSetGpcClkVfOffset(myGPU, 000) # The memory clock offset should be **multiplied by 2** to replace the "000" below # For example, an offset of 500 means inserting a value of 1000 in the next line nvmlDeviceSetMemClkVfOffset(myGPU, 000) # The power limit can be set below in mW - 216W becomes 216000, etc. Remove the below line if you don't want to adjust power limits. nvmlDeviceSetPowerManagementLimit(myGPU, 000000)
Subvoltagem com NVML
A API NVML também permite realizar a "subvoltagem" da GPU, i.e., reduzir a voltagem de operação comparada à padrão. Isto reduz o consumo energético e as temperaturas com uma perda mínima de performance ou até mesmo com um pequeno ganho. Isso pode ser desejável em particular para usuários de laptop.
Instale python-nvidia-ml-py, crie o seguinte script e faça-o executável:
/usr/local/bin/nvidia-undervolt.py
#!/bin/env python
from pynvml import *
from ctypes import byref
nvmlInit()
# Isto seleciona a GPU - Se isto lhe causar erros ou caso você tenha múltiplas GPUs, ponha o valor em 1 ou outros.
myGPU = nvmlDeviceGetHandleByIndex(0)
##print(f"myGPU value: {myGPU}")
# Obter os valores mínimos e máximos de potência permitidos.
##min_power, max_power = nvmlDeviceGetPowerManagementLimitConstraints(myGPU)
##print(f"Allowed range: {min_power} mW to {max_power} mW")
# O limite de potência pode ser posto abaixo em mW - 216W vira 216000, etc.
# Este valor deve estar dentro do intervalo de potências definido acima.
# Remova ou comente a linha abaixo se você não quer ajustar os limites de potência.
nvmlDeviceSetPowerManagementLimit(myGPU, 000000)
# Define os clocks mínimo e máximo permitidos.
# Os clocks suportados pela sua GPU podem ser verificados com:
# nvidia-smi -q -d SUPPORTED_CLOCKS
nvmlDeviceSetGpuLockedClocks(myGPU,210,2340)
####################################
# ============ P0 State ============
####################################
# ============ Memory ============
# Descomente ou edite esta seção se desejar.
# Nota: O offset do clock da memória deve ser **multiplicado por 2**.
# E.g. um offset desejado de 500 significa inserir
# um valor de 1000 na linha clockOffsetMHz.
##infoMemP0 = c_nvmlClockOffset_t()
##infoMemP0.version = nvmlClockOffset_v1
##infoMemP0.type = NVML_CLOCK_MEM
##infoMemP0.pstate = NVML_PSTATE_0
##infoMemP0.clockOffsetMHz = 2000
### Este offset é simplesmente o quão mais rápida a sua memória irá rodar.
### E.g. ao invés de rodar a 8000 MHz,
### a memória irá rodar a 8000 + (2000 / 2) = 9000 MHz.
##nvmlDeviceSetClockOffsets(myGPU, byref(infoMemP0))
# ============ Graphics =============
infoGraphicsP0 = c_nvmlClockOffset_t()
infoGraphicsP0.version = nvmlClockOffset_v1
infoGraphicsP0.type = NVML_CLOCK_GRAPHICS
infoGraphicsP0.pstate = NVML_PSTATE_0
infoGraphicsP0.clockOffsetMHz = 270
## O que este offset significa é: A curva de frequência-voltagem
## é levantada por 270 MHz.
## E.g. o valor da voltagem originalmente designado a 2070 MHz
## agora será usado a 2070 + 270 = 2340 MHz.
nvmlDeviceSetClockOffsets(myGPU, byref(infoGraphicsP0))
nvmlShutdown()
Os detalhes das funções utilizadas podem ser lidos na Seção 5.18 da documentação da API NVML. Este post no Reddit explica o porquê da subvoltagem ser feita desta forma, com um offset no clock.
Esse script só aplica a subvoltagem para a P-state mais alta da GPU. Se você quer configurar outras P-states além de P0, veja este post no Reddit para conselhos.
nvidia-smi -pl 000 como root.
Se este for o seu caso, remova ou comente a seção no script relacionada ao limite de potência, e como último recurso, você pode configurar o Dynamic Boost.
Execute o script manualmente como root para aplicar as preferências à sua GPU e testar sua configuração. Não aplique suas configurações permanentemente a menos que você as tenha testado extensivamente e confirmado que nenhum problema ocorre, i.e. a sua configuração é estável.
Após encontrar um bom setup, você precisa reaplicá-lo a cada boot. Uma maneira de fazer isso é com um serviço systemd:
/etc/systemd/system/nvidia-undervolt.service
[Unit] Description=Undervolt the NVIDIA GPU [Service] Type=oneshot ExecStart=/usr/local/bin/nvidia-undervolt.py StandardOutput=journal StandardError=journal [Install] WantedBy=graphical.target
Finalmente, ative o serviço para que suas configurações sejam aplicadas toda vez que o sistema inicializar.
Preservar memória de vídeo após a suspensão
Por padrão os drivers NVIDIA no Linux salvam e restauram apenas as alocações essenciais de memória de vídeo durante a suspensão e resumo do sistema. Citando a NVIDIA:
- A perda resultante do conteúdo da memória de vídeo é parcialmente compensada pelos drivers NVIDIA no espaço do usuário, e por alguns aplicativos, mas pode levar a falhas como corrupções na renderização e crashes na saída dos ciclos de gerenciamento de energia.
Introduzida como uma interface "experimental" (originalmente chamada NVreg_PreserveVideoMemoryAllocations nos drivers das séries 430-590), ela permite salvar toda a memória de vídeo (dado espaço suficiente em disco ou RAM). Com os drivers 595+, ela foi sucedida pelo parâmetro de módulo NVreg_UseKernelSuspendNotifiers=1 que precisa estar posta para salvar e restaurar todo o conteúdo da memória de vídeo.
O Arch Linux por padrão ativa essas opções para os drivers suportados, fazendo com que a preservação funcione sem qualquer configuração adicional. A NVIDIA em si só passou a ativar automaticamente os notificadores de suspensão do kernel da versão 615.78.08 em diante.
Para verificar que NVreg_UseKernelSuspendNotifiers está ativada, execute:
# sort /proc/driver/nvidia/params
Que deve ter uma linha UseKernelSuspendNotifiers: 1, e também TemporaryFilePath: "/var/tmp", que você pode ler sobre abaixo. Drivers anteriores ao 595 devem ter uma linha PreserveVideoMemoryAllocations: 1 para o mesmo.
Nos drivers das séries mais antigas 430-590, os serviços nvidia-suspend.service, nvidia-hibernate.service, e nvidia-resume.service são necessários e estão ativados por padrão, conforme os requerimentos da fonte.
Os serviços mencionados acima estão desativados por padrão em drivers 595+, conforme os requerimentos da fonte, já que a preservação da memória de vídeo é agora feita pelos notificadores de suspensão do kernel, fazendo com que os serviços de suspensão/hibernação sejam desnecessários.
Veja a documentação da NVIDIA para mais detalhes.
- Se estiver usando o carregamento antecipado, i.e. quando o carregamento do módulo
nvidiaocorre no initramfs, ele não tem acesso aoNVreg_TemporaryFilePathque guarda a memória de vídeo anterior: o carregamento antecipado não deve ser usado se a hibernação é desejada. - De acordo com Kernel module (Português)#Usando arquivos em /etc/modprobe.d/, você precisará recriar a initramfs se estiver usando o carregamento antecipado.
- Os conteúdos da memória de vídeo são por padrão da fonte salvos em
/tmp, que é um tmpfs. A NVIDIA recomenda usando um outro sistema de arquivos para se ter a melhor performance. Isto também é necessário se o tamanho não for suficiente para a quantidade de memória. O Arch Linux portanto põenvidia.NVreg_TemporaryFilePath=/var/tmppor padrão nos drivers suportados. - O sistema de arquivos escolhido contendo o arquivo precisa ter suporte a arquivos temporários sem nome (como o ext4 or XFS) e ter capacidade suficiente para guardar as alocações de memória de vídeo (i.e. pelo menos 5% a mais do que a soma das memórias de todas as GPUs NVIDIA). Use o comando
nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounitspara listar as capacidades de memória de todas as GPUs no sistema. - Ao usar os drivers das séries 430-590, o
nvidia-resume.serviceé marcado como requerido pela NVIDIA, mas ele pode ser opcional, já que sua funcionalidade também é providenciada por um hook do systemd-sleep(8) (/usr/lib/systemd/system-sleep/nvidia) e é invocado automaticamente. Note que o GDM com Wayland entretanto requer explicitamente quenvidia-resume.serviceesteja ativado.
Dynamic Boost
O Dynamic Boost é um controlador de potência ao nível do sistema que controla a potência da GPU e da CPU, de acordo com a carga de trabalho do sistema. Ele pode, em particular, melhorar a performance em aplicativos mais dependentes da GPU aumentando o limite de potência conformemente.
O requisito principal é laptops com GPUs Ampere (ou mais recentes).
Veja CPU frequency scaling#nvidia-powerd para instruções detalhadas.
Persistência do driver
O driver NVIDIA tem um daemon que pode ser opcionalmente executado na inicialização. Em um ambiente desktop padrão X de GPU única, o daemon de persistência não é necessário e pode na verdade causar problemas [6]. Veja a seção Driver Persistence da documentação da NVIDIA para mais detalhes.
Para iniciar o daemon de persistência durante a inicialização, ative o nvidia-persistenced.service. Para uso manual veja a documentação da fonte.
Forçar YCbCr com subamostragem 4:2:0
Se você está perante limitações de padrões de saída antigos que podem ainda ser resolvidos usando YUV 4:2:0, o driver NVIDIA tem uma opção X11 não documentada para forçar isso:
Option "ForceYUV420" "True"
Isto permitirá maiores resoluções ou taxas de atualização, mas terá um impacto negativo na qualidade da imagem.