Fixing terminal resolution
Transitioning from nouveau may cause your startup terminal to display at a lower resolution.
For GRUB, see GRUB/Tips and tricks#Setting the framebuffer resolution for details.  
A small caveat is that this will hide the kernel parameters from being shown during boot.
X with a TV (DFP) as the only display
The X server falls back to CRT-0 if no monitor is automatically detected. This can be a problem when using a DVI connected TV as the main display, and X is started while the TV is turned off or otherwise disconnected.
To force NVIDIA to use DFP, store a copy of the EDID somewhere in the filesystem so that X can parse the file instead of reading EDID from the TV/DFP.
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,
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 your log file will probably be in
/var/log/Xorg.0.log. Extract the EDID block using nvidia-xconfig:
$ nvidia-xconfig --extract-edids-from-file=/var/log/Xorg.0.log --extract-edids-output-file=/etc/X11/dfp0.bin
xorg.conf by adding to the
Option "ConnectedMonitor" "DFP" Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin"
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 X the 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.
If the above changes did not work, in the
Device section you can try to remove the
Option "ConnectedMonitor" "DFP" and add the following lines:
Option "ModeValidation" "NoDFPNativeResolutionCheck" Option "ConnectedMonitor" "DFP-0"
NoDFPNativeResolutionCheck prevents NVIDIA driver from disabling all the modes that do not fit in the native resolution.
Headless (no monitor) resolution
In headless mode, resolution falls back to 640x480, which is used by VNC or Steam Link. To start in a higher resolution e.g. 1920x1080, specify a
Virtual entry under the
Screen subsection in
Section "Screen" [...] SubSection "Display" Depth 24 Virtual 1920 1080 EndSubSection EndSection
Check the power source
The NVIDIA X.org driver can also be used to detect the GPU's current source of power. To see the current power source, check the 'GPUPowerSource' read-only parameter (0 - AC, 1 - battery):
$ nvidia-settings -q GPUPowerSource -t
Listening to ACPI events
NVIDIA drivers automatically try to connect to the acpid daemon and listen to ACPI events such as battery power, docking, some hotkeys, etc. If connection fails, X.org will output the following warning:
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.
While completely harmless, you may get rid of this message by disabling the
ConnectToAcpid option in your
Section "Device" ... Driver "nvidia" Option "ConnectToAcpid" "0" ... EndSection
If you are on laptop, it might be a good idea to install and enable the acpid daemon instead.
Displaying GPU temperature in the shell
There are three methods to query the GPU temperature. nvidia-settings requires that you are using X, nvidia-smi or nvclock do not. Also note that nvclock currently does not work with newer NVIDIA cards such as GeForce 200 series cards as well as embedded GPUs such as the Zotac IONITX's 8800GS.
To display the GPU temp in the shell, use nvidia-settings as follows:
$ nvidia-settings -q gpucoretemp
This will output something similar to the following:
Attribute 'GPUCoreTemp' (hostname:0.0): 41. 'GPUCoreTemp' is an integer attribute. 'GPUCoreTemp' is a read-only attribute. 'GPUCoreTemp' can use the following target types: X Screen, GPU.
The GPU temps of this board is 41 C.
In order to get just the temperature for use in utilities such as rrdtool or conky:
$ nvidia-settings -q gpucoretemp -t
Use nvidia-smi which can read temps directly from the GPU without the need to use X at all, e.g. when running Wayland or on a headless server. To display the GPU temperature in the shell, use nvidia-smi as follows:
This should output something similar to the following:
Fri Jan 6 18:53:54 2012 +------------------------------------------------------+ | NVIDIA-SMI 2.290.10 Driver Version: 290.10 | |-------------------------------+----------------------+----------------------+ | Nb. Name | Bus Id Disp. | Volatile ECC SB / DB | | Fan Temp Power Usage /Cap | Memory Usage | GPU Util. Compute M. | |===============================+======================+======================| | 0. GeForce 8500 GT | 0000:01:00.0 N/A | N/A N/A | | 30% 62 C N/A N/A / N/A | 17% 42MB / 255MB | N/A Default | |-------------------------------+----------------------+----------------------| | Compute processes: GPU Memory | | GPU PID Process name Usage | |=============================================================================| | 0. ERROR: Not Supported | +-----------------------------------------------------------------------------+
Only for temperature:
$ nvidia-smi -q -d TEMPERATURE
====NVSMI LOG==== Timestamp : Sun Apr 12 08:49:10 2015 Driver Version : 346.59 Attached GPUs : 1 GPU 0000:01:00.0 Temperature GPU Current Temp : 52 C GPU Shutdown Temp : N/A GPU Slowdown Temp : N/A
In order to get just the temperature for use in utilities such as rrdtool or conky:
$ nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits
Install the AUR package.
There can be significant differences between the temperatures reported by nvclock and nvidia-settings/nv-control. According to this post by the author (thunderbird) of nvclock, the nvclock values should be more accurate.
Overclocking and cooling
- Overclocking settings cannot be applied if the Xorg server is running in rootless mode. Consider running Xorg as root.
- Enabling DRM kernel mode setting may cause overclocking to become unavailable, regardless of the Coolbits value.
Overclocking is controlled via Coolbits option in the
Device section, which enables various unsupported features:
Option "Coolbits" "value"
# nvidia-xconfig --cool-bits=value
The Coolbits value is the sum of its component bits in the binary numeral system. The component bits are:
1(bit 0) - Enables overclocking of older (pre-Fermi) cores on the Clock Frequencies page in nvidia-settings.
2(bit 1) - When this bit is set, the driver will "attempt to initialize SLI when using GPUs with different amounts of video memory".
4(bit 2) - Enables manual configuration of GPU fan speed on the Thermal Monitor page in nvidia-settings.
8(bit 3) - Enables overclocking on the PowerMizer page in nvidia-settings. Available since version 337.12 for the Fermi architecture and newer.
16(bit 4) - Enables overvoltage using nvidia-settings CLI options. Available since version 346.16 for the Fermi architecture and newer.
To enable multiple features, add the Coolbits values together. For example, to enable overclocking and overvoltage of Fermi cores, set
Option "Coolbits" "24".
The documentation of Coolbits can be found in
/usr/share/doc/nvidia/html/xconfigoptions.html and here.
Setting static 2D/3D clocks
Set the following string in the
Device section to enable PowerMizer at its maximum performance level (VSync will not work without this line):
Option "RegistryDwords" "PerfLevelSrc=0x2222"
Lowering GPU Boost Clocks
With Ampere (NV170/GAXXX) GPUs and later, clock boost works in a different way, and maximum clocks are set to the highest supported limit at boot. If that is what you want, then no further configuration is necessary.
The drawback is the lower power efficiency. As the clocks go up, increased voltage is needed for stability, resulting in a nonlinear increase in power consumption, heating, and fan noise. Lowering the boost clock limit will thus increase efficiency.
Boost clock limits can be changed using nvidia-smi, running as root:
- List supported clock rates:
$ nvidia-smi -q -d SUPPORTED_CLOCKS
- Set GPU boost clock limit to 1695 MHz:
# nvidia-smi --lock-gpu-clocks=0,1695 --mode=1
- Set Memory boost clock limit to 5001 MHz:
# nvidia-smi --lock-memory-clocks=0,5001
To optimize for efficiency, use nvidia-smi to check the GPU utilization while running your favorite game. VSync should be on. Lowering the boost clock limit will increase GPU utilization, because a slower GPU will use more time to render each frame. Best efficiency is achieved with the lowest clocks that do not cause the stutter that results when the utilization hits 100%. Then, each frame can be rendered just quickly enough to keep up with the refresh rate.
As an example, using the above settings instead of default on an RTX 3090 Ti, while playing Hitman 3 at 4K@60, reduces power consumption by 30%, temperature from 75 to 63 degrees, and fan speed from 73% to 57%.
Saving overclocking settings
Typically, clock and voltage offsets inserted in the nvidia-settings interface are not saved, being lost after a reboot. Fortunately, there are tools that offer an interface for overclocking under the proprietary driver, able to save the user's overclocking preferences and automatically applying them on boot. Some of them are:
- AUR - graphical, applies settings on desktop session start
- AUR and AUR - graphical, applies settings on system boot
/etc/nvoc.d/, applies settings on desktop session start AUR - text based, profiles are configuration files in
GPUMemoryTransferRateOffset attributes can be set in the command-line interface of nvidia-settings on startup. For example:
$ nvidia-settings -a "GPUGraphicsClockOffset[performance_level]=offset" $ nvidia-settings -a "GPUMemoryTransferRateOffset[performance_level]=offset"
performance_level is the number of the highest performance level. If there are multiple GPUs on the machine, the GPU ID should be specified:
Custom TDP Limit
Modern NVIDIA graphics cards throttle frequency to stay in their TDP and temperature limits. To increase performance it is possible to change the TDP limit, which will result in higher temperatures and higher power consumption.
For example, to set the power limit to 160.30W:
# nvidia-smi -pl 160.30
To set the power limit on boot (without driver persistence):
[Unit] Description=Set NVIDIA power limit on boot [Timer] OnBootSec=5 [Install] WantedBy=timers.target
[Unit] Description=Set NVIDIA power limit [Service] Type=oneshot ExecStart=/usr/bin/nvidia-smi -pl 160.30
Now enable the
Set fan speed at login
You can adjust the fan speed on your graphics card with nvidia-settings' console interface. First ensure that your Xorg configuration has enabled the bit 2 in the Coolbits option.
Place the following line in your xinitrc file to adjust the fan when you launch Xorg. Replace
n with the fan speed percentage you want to set.
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=n"
You can also configure a second GPU by incrementing the GPU and fan number.
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=n" \ -a "[gpu:1]/GPUFanControlState=1" -a [fan:1]/GPUTargetFanSpeed=n" &
If you use a login manager such as GDM or SDDM, you can create a desktop entry file to process this setting. Create
~/.config/autostart/nvidia-fan-speed.desktop and place this text inside it. Again, change
n to the speed percentage you want.
[Desktop Entry] Type=Application Exec=nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=n" X-GNOME-Autostart-enabled=true Name=nvidia-fan-speed
GPUCurrentFanSpeedwas used instead of
To make it possible to adjust the fanspeed of more than one graphics card, run:
$ nvidia-xconfig --enable-all-gpus $ nvidia-xconfig --cool-bits=4
Kernel module parameters
Some options can be set as kernel module parameters, a full list can be obtained by running
modinfo nvidia or looking at
nv-reg.h. See Gentoo:NVidia/nvidia-drivers#Kernel module parameters as well.
For example, enabling the following will enable the PAT feature , which affects how memory is allocated. PAT was first introduced in Pentium III  and is supported by most newer CPUs (see wikipedia:Page attribute table#Processors). If your system can support this feature, it should improve performance.
options nvidia NVreg_UsePageAttributeTable=1
On some notebooks, to enable any NVIDIA settings tweaking you must include this option, otherwise it responds with "Setting applications clocks is not supported" etc.
options nvidia NVreg_RegistryDwords="OverrideMaxPerf=0x1"
To enable modesetting and avoid conficts with the
simpledrm driver, the following option has to be added to the kernel command line in your boot files. Note that this specific parameter will have not have the correct effect if set in a file under
/etc/modprobe.d, even if it's included in the initramfs. See FS#73720.
Preserve video memory after suspend
By default the NVIDIA Linux drivers save and restore only essential video memory allocations on system suspend and resume. Quoting NVIDIA (, also available with the package in
- The resulting loss of video memory contents is partially compensated for by the user-space NVIDIA drivers, and by some applications, but can lead to failures such as rendering corruption and application crashes upon exit from power management cycles.
The still experimental system enables saving all video memory (given enough space on disk or main RAM). The interface is through the
/proc/driver/nvidia/suspend file as follows:
- write "suspend" (or "hibernate") to
/proc/driver/nvidia/suspendimmediately before writing to the usual Linux
- write "resume" to
/proc/driver/nvidia/suspendimmediately after waking up, or after an unsuccessful attempt to suspend or hibernate.
- The video memory contents are saved by default to
/tmp, which is a tmpfs. NVIDIA recommends using an other filesystem to achieve the best performance. This is also required if the size is not sufficient for the amount of memory: point to a different location with the
- The chosen file system containing the file needs to support unnamed temporary files (e.g. ext4 or XFS) and have sufficient capacity for storing the video memory allocations (i.e. at least 5 percent more than the sum of the memory capacities of all NVIDIA GPUs). Use the command
nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounitsto list the memory capacities of all GPUs in the system.
To make the changes permanent, create the following:
options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/path/to/tmp-nvidia
The interaction with
/proc/driver/nvidia/suspend is handled by the simple Unix shell script at
/usr/bin/nvidia-sleep.sh, which will itself be called by systemd or other tools. The package ships with the following services (which essentially just call
nvidia-resume.service(and it is in fact probably not a good idea to enable it), because the
/usr/lib/systemd/system-sleep/nvidiascript does the same thing as the service (but slightly earlier), and it is enabled by default (systemd calls it after waking up from a suspend). Only enable
nvidia-hibernate.service, unless you are using GDM with Wayland which requires
NVIDIA has a daemon that can be optionally run at boot. In a standard single-GPU X desktop environment the persistence daemon is not needed and can actually create issues . See the Driver Persistence section of the NVIDIA documentation for more details.