FeralInteractive / gamemode

Optimise Linux system performance on demand
BSD 3-Clause "New" or "Revised" License
4.75k stars 185 forks source link

GameMode fails to change most settings #335

Closed qfettes closed 3 years ago

qfettes commented 3 years ago

Describe the bug using gamemoderun %command% on steam leads to many errors in the systemctl service, and no values being changed.

To Reproduce Steps used to reproduce the behavior:

  1. Launch gamemod with gamemoderun %command% with the following .ini
[general]
; The reaper thread will check every 5 seconds for exited clients, for config file changes, and for the CPU/iGPU power balance
reaper_freq=5

; The desired governor is used when entering GameMode instead of "performance"
desiredgov=performance
; The default governor is used when leaving GameMode instead of restoring the original value
;defaultgov=powersave

; The iGPU desired governor is used when the integrated GPU is under heavy load
; igpu_desiredgov=powersave
; Threshold to use to decide when the integrated GPU is under heavy load.
; This is a ratio of iGPU Watts / CPU Watts which is used to determine when the
; integraged GPU is under heavy enough load to justify switching to
; igpu_desiredgov.  Set this to -1 to disable all iGPU checking and always
; use desiredgov for games.
; igpu_power_threshold=0.3

; GameMode can change the scheduler policy to SCHED_ISO on kernels which support it (currently
; not supported by upstream kernels). Can be set to "auto", "on" or "off". "auto" will enable
; with 4 or more CPU cores. "on" will always enable. Defaults to "off".
softrealtime=on

; GameMode can renice game processes. You can put any value between 0 and 20 here, the value
; will be negated and applied as a nice value (0 means no change). Defaults to 0.
renice=4

; By default, GameMode adjusts the iopriority of clients to BE/0, you can put any value
; between 0 and 7 here (with 0 being highest priority), or one of the special values
; "off" (to disable) or "reset" (to restore Linux default behavior based on CPU priority),
; currently, only the best-effort class is supported thus you cannot set it here
ioprio=0

; Sets whether gamemode will inhibit the screensaver when active
; Defaults to 1
inhibit_screensaver=1

[filter]
; If "whitelist" entry has a value(s)
; gamemode will reject anything not in the whitelist
;whitelist=RiseOfTheTombRaider

; Gamemode will always reject anything in the blacklist
;blacklist=HalfLife3
;    glxgears

[gpu]
; Here Be Dragons!
; Warning: Use these settings at your own risk
; Any damage to hardware incurred due to this feature is your responsibility and yours alone
; It is also highly recommended you try these settings out first manually to find the sweet spots

; Setting this to the keyphrase "accept-responsibility" will allow gamemode to apply GPU optimisations such as overclocks
; apply_gpu_optimisations="accept-responsibility"

; The DRM device number on the system (usually 0), ie. the number in /sys/class/drm/card0/
; gpu_device=0

; Nvidia specific settings
; Requires the coolbits extension activated in nvidia-xconfig
; This corresponds to the desired GPUPowerMizerMode
; "Adaptive"=0 "Prefer Maximum Performance"=1 and "Auto"=2
; See NV_CTRL_GPU_POWER_MIZER_MODE and friends in https://github.com/NVIDIA/nvidia-settings/blob/master/src/libXNVCtrl/NVCtrl.h
; nv_powermizer_mode=1

; These will modify the core and mem clocks of the highest perf state in the Nvidia PowerMizer
; They are measured as Mhz offsets from the baseline, 0 will reset values to default, -1 or unset will not modify values
;nv_core_clock_mhz_offset=0
;nv_mem_clock_mhz_offset=0

; AMD specific settings
; Requires a relatively up to date AMDGPU kernel module
; See: https://dri.freedesktop.org/docs/drm/gpu/amdgpu.html#gpu-power-thermal-controls-and-monitoring
; It is also highly recommended you use lm-sensors (or other available tools) to verify card temperatures
; This corresponds to power_dpm_force_performance_level, "manual" is not supported for now
;amd_performance_level=high

[supervisor]
; This section controls the new gamemode functions gamemode_request_start_for and gamemode_request_end_for
; The whilelist and blacklist control which supervisor programs are allowed to make the above requests
;supervisor_whitelist=
;supervisor_blacklist=

; In case you want to allow a supervisor to take full control of gamemode, this option can be set
; This will only allow gamemode clients to be registered by using the above functions by a supervisor client
;require_supervisor=0

[custom]
; Custom scripts (executed using the shell) when gamemode starts and ends
; start=notify-send "Quintin GameMode started"
;     /usr/local/bin/nvidia-gaming-ready.sh

; end=notify-send "Quintin GameMode ended"
;     /usr/local/bin/nvidia-mining-ready.sh

; Timeout for scripts (seconds). Scripts will be killed if they do not complete within this time.
;script_timeout=10
  1. Run game: Any game. I tested with persona 4: golden and Divinity: Original Sin 2
  2. View output of: systemctl --user status gamemoded and top
  3. See error:

systemctl --user status gamemoded

Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Addition requested for already known client 226459 [/usr/bin/env].
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Failed to renice client [226583,226583], ignoring error condition: Permission denied
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Skipping ioprio on client [226583,226583]: ioprio was (0) but we expected (4)
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Failed setting client [226583] into SCHED_ISO mode, ignoring error condition: Invalid argument
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Addition requested for already known client 226583 [/usr/bin/env].
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Failed to renice client [226584,226584], ignoring error condition: Permission denied
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Skipping ioprio on client [226584,226584]: ioprio was (0) but we expected (4)
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Failed setting client [226584] into SCHED_ISO mode, ignoring error condition: Invalid argument
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Refused to renice client [226584,226584]: prio was (0) but we expected (-4)
Aug 10 09:32:56 venus-arch gamemoded[1154]: ERROR: Removal requested for unknown process [226586].

top: No processes are reniced

Expected behavior Game mode should apply all optimizations without error

System Info (please complete the following information):

Additional context Not shown are the errors with GPU overclocks. They fail with no display session type errors too.

qfettes commented 3 years ago

Fixed by allowing users to renice

gudvinr commented 2 years ago

@qfettes can you elaborate how you "allowed users to renice"?

qfettes commented 2 years ago

Add myusername - nice -20 to /usr/security/limits.conf to allow user to renice processes

gardotd426 commented 2 years ago

Anyone that sees this, I believe @qfettes meant /etc/security/limits.conf rather than /usr.

itspngu commented 2 years ago

It's actually part of the default installation: https://github.com/FeralInteractive/gamemode/commit/5f91922506b7d98efffb786da49ae8bef9263777

However, the limit is -10, not -20, and scoped to the gamemode group. So after running usermod -aG gamemode <YOUR_USERNAME> everything will work without having to manually edit system files yourself (if you don't surpass -10 that is).