Commit dabe4189 authored by Evgeni Golov's avatar Evgeni Golov

Merge tag 'v2.10.0' into debian/unstable

parents 871e7b32 323acf2c
......@@ -4,3 +4,7 @@ Installation instructions
The tuned daemon is written in pure Python. Nothing requires to be built.
For installation use 'make install'. Optionally DESTDIR can be appended.
By default, the tuned modules are installed to the Python3 destination
(e.g. /usr/lib/python3.6/site-packages/) and shebangs in executable
Python files are modified to use Python3. If you want tuned to use Python2
instead, use 'make PYTHON=python2 install'.
......@@ -27,13 +27,30 @@ TMPFILESDIR_DETECT = $(shell pkg-config systemd --variable tmpfilesdir || rpm --
TMPFILESDIR = $(TMPFILESDIR_DETECT:%{_tmpfilesdir}=$(TMPFILESDIR_FALLBACK))
VERSIONED_NAME = $(NAME)-$(VERSION)$(GIT_PSUFFIX)
SYSCONFDIR = /etc
DATADIR = /usr/share
DOCDIR = $(DATADIR)/doc/$(NAME)
PYTHON_SITELIB = $(shell python -c 'from distutils.sysconfig import get_python_lib; print get_python_lib();' || echo /usr/lib/python2.7/site-packages)
PYTHON = python3
PYLINT = pylint-3
ifeq ($(PYTHON),python2)
PYLINT = pylint-2
endif
SHEBANG_REWRITE_REGEX= '1s/^(\#!\/usr\/bin\/)\<python\>/\1$(PYTHON)/'
PYTHON_SITELIB = $(shell $(PYTHON) -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib());')
ifeq ($(PYTHON_SITELIB),)
$(error Failed to determine python library directory)
endif
TUNED_PROFILESDIR = /usr/lib/tuned
TUNED_RECOMMEND_DIR = $(TUNED_PROFILESDIR)/recommend.d
TUNED_USER_RECOMMEND_DIR = $(SYSCONFDIR)/tuned/recommend.d
BASH_COMPLETIONS = $(DATADIR)/bash-completion/completions
copy_executable = install -Dm 0755 $(1) $(2)
rewrite_shebang = sed -i -r -e $(SHEBANG_REWRITE_REGEX) $(1)
restore_timestamp = touch -r $(1) $(2)
install_python_script = $(call copy_executable,$(1),$(2)) \
&& $(call rewrite_shebang,$(2)) && $(call restore_timestamp,$(1),$(2));
release-dir:
mkdir -p $(VERSIONED_NAME)
......@@ -101,45 +118,51 @@ install-dirs:
mkdir -p $(DESTDIR)/var/log/tuned
mkdir -p $(DESTDIR)/run/tuned
mkdir -p $(DESTDIR)$(DOCDIR)
mkdir -p $(DESTDIR)$(SYSCONFDIR)
mkdir -p $(DESTDIR)$(TUNED_RECOMMEND_DIR)
mkdir -p $(DESTDIR)$(TUNED_USER_RECOMMEND_DIR)
install: install-dirs
# library
cp -a tuned $(DESTDIR)$(PYTHON_SITELIB)
# binaries
install -Dpm 0755 tuned.py $(DESTDIR)/usr/sbin/tuned
install -Dpm 0755 tuned-adm.py $(DESTDIR)/usr/sbin/tuned-adm
install -Dpm 0755 tuned-gui.py $(DESTDIR)/usr/sbin/tuned-gui
$(foreach file, $(wildcard systemtap/*), \
install -Dpm 0755 $(file) $(DESTDIR)/usr/sbin/$(notdir $(file));)
$(call install_python_script,tuned.py,$(DESTDIR)/usr/sbin/tuned)
$(call install_python_script,tuned-adm.py,$(DESTDIR)/usr/sbin/tuned-adm)
$(call install_python_script,tuned-gui.py,$(DESTDIR)/usr/sbin/tuned-gui)
$(foreach file, diskdevstat netdevstat scomes, \
install -Dpm 0755 systemtap/$(file) $(DESTDIR)/usr/sbin/$(notdir $(file));)
$(call install_python_script, \
systemtap/varnetload, $(DESTDIR)/usr/sbin/varnetload)
# glade
install -Dpm 0644 tuned-gui.glade $(DESTDIR)$(DATADIR)/tuned/ui/tuned-gui.glade
# tools
install -Dpm 0755 experiments/powertop2tuned.py $(DESTDIR)/usr/bin/powertop2tuned
$(call install_python_script, \
experiments/powertop2tuned.py, $(DESTDIR)/usr/bin/powertop2tuned)
# configuration files
install -Dpm 0644 tuned-main.conf $(DESTDIR)/etc/tuned/tuned-main.conf
install -Dpm 0644 tuned-main.conf $(DESTDIR)$(SYSCONFDIR)/tuned/tuned-main.conf
# None profile in the moment, autodetection will be used
echo -n > $(DESTDIR)/etc/tuned/active_profile
echo -n > $(DESTDIR)/etc/tuned/profile_mode
install -Dpm 0644 bootcmdline $(DESTDIR)/etc/tuned/bootcmdline
install -Dpm 0644 modules.conf $(DESTDIR)/etc/modprobe.d/tuned.conf
echo -n > $(DESTDIR)$(SYSCONFDIR)/tuned/active_profile
echo -n > $(DESTDIR)$(SYSCONFDIR)/tuned/profile_mode
install -Dpm 0644 bootcmdline $(DESTDIR)$(SYSCONFDIR)/tuned/bootcmdline
install -Dpm 0644 modules.conf $(DESTDIR)$(SYSCONFDIR)/modprobe.d/tuned.conf
# profiles & system config
cp -a profiles/* $(DESTDIR)$(TUNED_PROFILESDIR)/
mv $(DESTDIR)$(TUNED_PROFILESDIR)/realtime/realtime-variables.conf \
$(DESTDIR)/etc/tuned/realtime-variables.conf
$(DESTDIR)$(SYSCONFDIR)/tuned/realtime-variables.conf
mv $(DESTDIR)$(TUNED_PROFILESDIR)/realtime-virtual-guest/realtime-virtual-guest-variables.conf \
$(DESTDIR)/etc/tuned/realtime-virtual-guest-variables.conf
$(DESTDIR)$(SYSCONFDIR)/tuned/realtime-virtual-guest-variables.conf
mv $(DESTDIR)$(TUNED_PROFILESDIR)/realtime-virtual-host/realtime-virtual-host-variables.conf \
$(DESTDIR)/etc/tuned/realtime-virtual-host-variables.conf
$(DESTDIR)$(SYSCONFDIR)/tuned/realtime-virtual-host-variables.conf
mv $(DESTDIR)$(TUNED_PROFILESDIR)/cpu-partitioning/cpu-partitioning-variables.conf \
$(DESTDIR)/etc/tuned/cpu-partitioning-variables.conf
$(DESTDIR)$(SYSCONFDIR)/tuned/cpu-partitioning-variables.conf
mv $(DESTDIR)$(TUNED_PROFILESDIR)/sap-hana-vmware/sap-hana-vmware-variables.conf \
$(DESTDIR)/etc/tuned/sap-hana-vmware-variables.conf
$(DESTDIR)$(SYSCONFDIR)/tuned/sap-hana-vmware-variables.conf
install -pm 0644 recommend.conf $(DESTDIR)$(TUNED_RECOMMEND_DIR)/50-tuned.conf
# bash completion
......@@ -152,10 +175,10 @@ install: install-dirs
install -Dpm 0644 tuned.service $(DESTDIR)$(UNITDIR)/tuned.service
# dbus configuration
install -Dpm 0644 dbus.conf $(DESTDIR)/etc/dbus-1/system.d/com.redhat.tuned.conf
install -Dpm 0644 dbus.conf $(DESTDIR)$(SYSCONFDIR)/dbus-1/system.d/com.redhat.tuned.conf
# grub template
install -Dpm 0755 00_tuned $(DESTDIR)/etc/grub.d/00_tuned
install -Dpm 0755 00_tuned $(DESTDIR)$(SYSCONFDIR)/grub.d/00_tuned
# polkit configuration
install -Dpm 0644 com.redhat.tuned.policy $(DESTDIR)$(DATADIR)/polkit-1/actions/com.redhat.tuned.policy
......@@ -171,7 +194,8 @@ install: install-dirs
# libexec scripts
$(foreach file, $(wildcard libexec/*), \
install -Dpm 0755 $(file) $(DESTDIR)/usr/libexec/tuned/$(notdir $(file));)
$(call install_python_script, \
$(file), $(DESTDIR)/usr/libexec/tuned/$(notdir $(file))))
# icon
install -Dpm 0644 icons/tuned.svg $(DESTDIR)$(DATADIR)/icons/hicolor/scalable/apps/tuned.svg
......@@ -185,9 +209,9 @@ clean:
rm -rf $(VERSIONED_NAME) rpm-build-dir
test:
python -m unittest discover tests
$(PYTHON) -m unittest discover tests
lint:
pylint -E -f parseable tuned *.py
$(PYLINT) -E -f parseable tuned *.py
.PHONY: clean archive srpm tag test lint
* Implement a configurable policy which determines how many (and how big)
log buffers can a user with a given UID create using the log_capture_start
DBus call.
* Destroy the log handler created by log_capture_start() when the caller
disconnects from DBus.
* Use only one timer for destroying log handlers at a time. Create a new
timer as necessary when the old timer fires.
* Handle signals in tuned-adm so that the log_capture_finish() DBus call
is called even if we receive a signal. This may require some rewriting
of tuned-adm.
......@@ -127,6 +127,26 @@
</defaults>
</action>
<action id="com.redhat.tuned.log_capture_start">
<description>Start log capture</description>
<message>Authentication is required to start log capture</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
</action>
<action id="com.redhat.tuned.log_capture_finish">
<description>Stop log capture and return captured log</description>
<message>Authentication is required to stop log capture</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
</action>
<action id="com.redhat.tuned.auto_profile">
<description>Enable automatic profile selection mode</description>
<message>Authentication is required to change profile selection mode</message>
......
#!/usr/bin/python -Es
from __future__ import print_function
import os
import Xlib
......@@ -38,8 +40,8 @@ def loop():
else:
if not win in showed:
showed.append(win)
print "Showed:", showed
print "Minimized:", hidden
print("Showed:", showed)
print("Minimized:", hidden)
if __name__ == '__main__':
loop()
......@@ -19,6 +19,12 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
from __future__ import print_function
# exception handler for python 2/3 compatibility
try:
from builtins import chr
except ImportError:
pass
import os
import sys
import tempfile
......@@ -26,8 +32,14 @@ import shutil
import argparse
import codecs
from subprocess import *
from HTMLParser import HTMLParser
from htmlentitydefs import name2codepoint
# exception handler for python 2/3 compatibility
try:
from html.parser import HTMLParser
from html.entities import name2codepoint
except ImportError:
from HTMLParser import HTMLParser
from htmlentitydefs import name2codepoint
SCRIPT_SH = """#!/bin/sh
......@@ -141,7 +153,7 @@ class PowertopHTMLParser(HTMLParser):
def handle_entityref(self, name):
if self.inScript:
self.currentScript += unichr(name2codepoint[name])
self.currentScript += chr(name2codepoint[name])
def handle_data(self, data):
prefix = self.prefix
......@@ -170,7 +182,8 @@ class PowertopProfile:
self.output = output
def currentActiveProfile(self):
proc = Popen(["tuned-adm", "active"], stdout=PIPE)
proc = Popen(["tuned-adm", "active"], stdout=PIPE, \
universal_newlines = True)
output = proc.communicate()[0]
if output and output.find("Current active profile: ") == 0:
return output[len("Current active profile: "):output.find("\n")]
......@@ -179,23 +192,27 @@ class PowertopProfile:
def checkPrivs(self):
myuid = os.geteuid()
if myuid != 0:
print >> sys.stderr, 'Run this program as root'
print('Run this program as root', file=sys.stderr)
return False
return True
def generateHTML(self):
print "Running PowerTOP, please wait..."
print("Running PowerTOP, please wait...")
environment = os.environ.copy()
environment["LC_ALL"] = "C"
try:
proc = Popen(["/usr/sbin/powertop", "--html=/tmp/powertop", "--time=1"], stdout=PIPE, stderr=PIPE, env=environment)
proc = Popen(["/usr/sbin/powertop", \
"--html=/tmp/powertop", "--time=1"], \
stdout=PIPE, stderr=PIPE, \
env=environment, \
universal_newlines = True)
output = proc.communicate()[1]
except (OSError, IOError):
print >> sys.stderr, 'Unable to execute PowerTOP, is PowerTOP installed?'
print('Unable to execute PowerTOP, is PowerTOP installed?', file=sys.stderr)
return -2
if proc.returncode != 0:
print >> sys.stderr, 'PowerTOP returned error code: %d' % proc.returncode
print('PowerTOP returned error code: %d' % proc.returncode, file=sys.stderr)
return -2
prefix = "PowerTOP outputing using base filename "
......@@ -226,31 +243,31 @@ class PowertopProfile:
return parser.getParsedData(), parser.getPlugins()
def generateShellScript(self, data):
print "Generating shell script", os.path.join(self.output, "script.sh")
print("Generating shell script", os.path.join(self.output, "script.sh"))
f = None
try:
f = codecs.open(os.path.join(self.output, "script.sh"), "w", "utf-8")
f.write(SCRIPT_SH % (data, ""))
os.fchmod(f.fileno(), 0755)
os.fchmod(f.fileno(), 0o755)
f.close()
except (OSError, IOError) as e:
print >> sys.stderr, "Error writing shell script: %s" % e
print("Error writing shell script: %s" % e, file=sys.stderr)
if f is not None:
f.close()
return False
return True
def generateTunedConf(self, profile, plugins):
print "Generating Tuned config file", os.path.join(self.output, "tuned.conf")
print("Generating Tuned config file", os.path.join(self.output, "tuned.conf"))
f = codecs.open(os.path.join(self.output, "tuned.conf"), "w", "utf-8")
f.write(TUNED_CONF_PROLOG)
if profile is not None:
if self.profile_name == profile:
print >> sys.stderr, 'New profile has same name as active profile, not including active profile (avoiding circular deps).'
print('New profile has same name as active profile, not including active profile (avoiding circular deps).', file=sys.stderr)
else:
f.write(TUNED_CONF_INCLUDE % ("include=" + profile))
for plugin in plugins.values():
for plugin in list(plugins.values()):
f.write(plugin + "\n")
f.write(TUNED_CONF_EPILOG)
......@@ -274,7 +291,7 @@ class PowertopProfile:
os.unlink(self.name)
if len(data) == 0 and len(plugins) == 0:
print >> sys.stderr, 'Your Powertop version is incompatible (maybe too old) or the generated HTML output is malformed'
print('Your Powertop version is incompatible (maybe too old) or the generated HTML output is malformed', file=sys.stderr)
return self.PARSING_ERROR
if new_profile is False:
......@@ -297,9 +314,9 @@ class PowertopProfile:
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Creates Tuned profile from Powertop HTML output.')
parser.add_argument('profile', metavar='profile_name', type=unicode, nargs='?', help='Name for the profile to be written.')
parser.add_argument('-i', '--input', metavar='input_html', type=unicode, help='Path to Powertop HTML report. If not given, it is generated automatically.')
parser.add_argument('-o', '--output', metavar='output_directory', type=unicode, help='Directory where the profile will be written, default is /etc/tuned/profile_name directory.')
parser.add_argument('profile', metavar='profile_name', type=str, nargs='?', help='Name for the profile to be written.')
parser.add_argument('-i', '--input', metavar='input_html', type=str, help='Path to Powertop HTML report. If not given, it is generated automatically.')
parser.add_argument('-o', '--output', metavar='output_directory', type=str, help='Directory where the profile will be written, default is /etc/tuned/profile_name directory.')
parser.add_argument('-n', '--new-profile', action='store_true', help='Creates new profile, otherwise it merges (include) your current profile.')
parser.add_argument('-m', '--merge-profile', action = 'store', help = 'Merges (includes) the specified profile (can be suppressed by -n option).')
parser.add_argument('-f', '--force', action='store_true', help='Overwrites the output directory if it already exists.')
......@@ -308,7 +325,7 @@ if __name__ == "__main__":
args = vars(args)
if not args['profile'] and not args['output']:
print >> sys.stderr, 'You have to specify the profile_name or output directory using the --output argument.'
print('You have to specify the profile_name or output directory using the --output argument.', file=sys.stderr)
parser.print_help()
sys.exit(-1)
......@@ -322,7 +339,7 @@ if __name__ == "__main__":
args['input'] = ''
if os.path.exists(args['output']) and not args['force']:
print >> sys.stderr, 'Output directory already exists, use --force to overwrite it.'
print('Output directory already exists, use --force to overwrite it.', file=sys.stderr)
sys.exit(-1)
p = PowertopProfile(args['output'], args['profile'], args['input'])
......
......@@ -41,9 +41,8 @@ def parse_def_affinity(fname):
if os.getuid() != 0:
return
try:
f = file(fname)
line = f.readline()
f.close()
with open(fname, 'r') as f:
line = f.readline()
return bitmasklist(line)
except IOError:
return [ 0 ]
......
......@@ -21,6 +21,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
from __future__ import print_function
import os
import signal
import struct
......@@ -39,17 +40,14 @@ def do_fork():
sys.exit(0)
def close_fds():
s_in = file('/dev/null', 'r')
s_out = file('/dev/null', 'a+')
s_err = file('/dev/null', 'a+', 0)
os.dup2(s_in.fileno(), sys.stdin.fileno())
os.dup2(s_out.fileno(), sys.stdout.fileno())
os.dup2(s_err.fileno(), sys.stderr.fileno())
f = open('/dev/null', 'w+')
os.dup2(f.fileno(), sys.stdin.fileno())
os.dup2(f.fileno(), sys.stdout.fileno())
os.dup2(f.fileno(), sys.stderr.fileno())
def write_pidfile():
f = os.open(PIDFILE, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0644)
os.write(f, "%d" % os.getpid())
os.close(f)
with os.fdopen(os.open(PIDFILE, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o644), "w") as f:
f.write("%d" % os.getpid())
def daemonize():
do_fork()
......@@ -65,7 +63,7 @@ def set_pmqos(name, value):
try:
fd = os.open(filename, os.O_WRONLY)
except OSError:
print >>sys.stderr, "Cannot open (%s)." % filename
print("Cannot open (%s)." % filename, file=sys.stderr)
return None
os.write(fd, bin_value)
return fd
......@@ -86,14 +84,14 @@ def run_daemon(options):
daemonize()
write_pidfile()
signal.signal(signal.SIGTERM, sigterm_handler)
except Exception, e:
print >>sys.stderr, "Cannot daemonize (%s)." % e
except Exception as e:
print("Cannot daemonize (%s)." % e, file=sys.stderr)
return False
global pmqos_fds
pmqos_fds = []
for (name, value) in options.items():
for (name, value) in list(options.items()):
try:
new_fd = set_pmqos(name, value)
if new_fd is not None:
......@@ -111,20 +109,20 @@ def kill_daemon(force = False):
try:
with open(PIDFILE, "r") as pidfile:
daemon_pid = int(pidfile.read())
except IOError, e:
if not force: print >>sys.stderr, "Cannot open PID file (%s)." % e
except IOError as e:
if not force: print("Cannot open PID file (%s)." % e, file=sys.stderr)
return False
try:
os.kill(daemon_pid, signal.SIGTERM)
except OSError, e:
if not force: print >>sys.stderr, "Cannot terminate the daemon (%s)." % e
except OSError as e:
if not force: print("Cannot terminate the daemon (%s)." % e, file=sys.stderr)
return False
try:
os.unlink(PIDFILE)
except OSError, e:
if not force: print >>sys.stderr, "Cannot delete the PID file (%s)." % e
except OSError as e:
if not force: print("Cannot delete the PID file (%s)." % e, file=sys.stderr)
return False
return True
......@@ -148,14 +146,14 @@ if __name__ == "__main__":
if name in ALLOWED_INTERFACES and len(value) > 0:
options[name] = value
else:
print >>sys.stderr, "Invalid option (%s)." % option
print("Invalid option (%s)." % option, file=sys.stderr)
if disable:
sys.exit(0 if kill_daemon() else 1)
if len(options) == 0:
print >>sys.stderr, "No options set. Not starting."
print("No options set. Not starting.", file=sys.stderr)
sys.exit(1)
kill_daemon(True)
......
......@@ -52,6 +52,7 @@ netfilter connections tracking.
.BR tuned\-profiles (7)
.BR tuned\-profiles\-sap (7)
.BR tuned\-profiles\-sap\-hana (7)
.BR tuned\-profiles\-mssql (7)
.BR tuned\-profiles\-oracle (7)
.BR tuned\-profiles\-realtime (7)
.BR tuned\-profiles\-nfv\-host (7)
......
......@@ -85,6 +85,7 @@ CPU governor is set to performance.
.BR tuned\-profiles\-atomic (7)
.BR tuned\-profiles\-sap (7)
.BR tuned\-profiles\-sap\-hana (7)
.BR tuned\-profiles\-mssql (7)
.BR tuned\-profiles\-oracle (7)
.BR tuned\-profiles\-realtime (7)
.BR tuned\-profiles\-nfv\-host (7)
......
.\"/*
.\" * All rights reserved
.\" * Copyright (C) 2015-2017 Red Hat, Inc.
.\" * Authors: Jaroslav Škarvada
.\" * Authors: Jaroslav Škarvada, Luiz Capitulino
.\" *
.\" * This program is free software; you can redistribute it and/or
.\" * modify it under the terms of the GNU General Public License
......@@ -18,37 +18,89 @@
.\" * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
.\" */
.\"
.TH TUNED_PROFILES_CPU_PARTITIONING "7" "30 Mar 2017" "tuned"
.TH TUNED_PROFILES_CPU_PARTITIONING "7" "22 Feb 2018" "tuned"
.SH NAME
tuned\-profiles\-cpu\-partitioning - description of profile provided for for CPU partitioning
tuned\-profiles\-cpu\-partitioning - Partition CPUs into isolated and housekeeping.
.SH DESCRIPTION
The profile is provided for CPU partitioning.
The cpu\-partitioning profile partitions the system CPUs into isolated and
housekeeping CPUs. This profile is intended to be used for latency\-sensitive
workloads.
.SH PROFILES
The following profiles is provided:
An isolated CPU incurs reduced jitter and reduced interruptions by the
kernel. This is achived by clearing the CPU from user\-space processes, movable
kernel threads, interruption handlers, kernel timers, etc. The only fixed
source of interruptions is the 1Hz tick maintained by the kernel to keep
CPU usage statistics. Otherwise, the incurred jitter and interruptions, if
any, depend on the kernel services used by the thread running on the isolated
CPU. Threads that run a busy loop without doing system calls, such as
user\-space drivers that access the hardware directly, are only expected to
be interrupted once a second by the 1Hz tick.
A housekeeping CPU is the opposite of an isolated CPU. Housekeeping CPUs
run all daemons, shell processes, kernel threads, interruption handlers
and work that can be dispatched from isolated CPUs such as disk I/O,
RCU work, timers, etc.
.SH CONFIGURATION
The cpu-partitioning profile is configured by editing the
.I /etc/tuned/cpu-partitioning-variables.conf
file. There are two configuration options:
.TP
.B isolated_cores=<CPU\-LIST>
List of CPUs to isolate. This option is mandatory. Any CPUs not in this list
is automatically considered a housekeeping CPU.
.TP
.BI "cpu\-partitioning"
Profile optimized for CPU partitioning.
.B no_balance_cores=<CPU\-LIST>
List of CPUs not be considered by the kernel when doing system wide
process load\-balancing. Usually, this list should be the same as
isolated_cores=. This option is optional.
.SH IMPORTANT NOTES
.IP * 2
The system should be rebooted after applying the cpu\-partitioning profile
for the first time or changing its configuration
.IP *
The cpu\-partitioning profile can be used in bare\-metal and virtual machines
.IP *
The cpu\-partitioning profile does not use the kernel's isolcpus= feature
.IP *
On a NUMA system, it is recommended to have at least one housekeeping CPU
per NUMA node
.IP *
The cpu\-partitioning profile does not support isolating the L3 cache. This
means that a housekeeping CPU can still thrash cache entries pertaining to
isolated CPUs. It is recommended to use cache isolation technologies to remedy
this problem, such as Intel's Cache Allocation Technology
.IP *
Whether or not the kernel is going to be able to deactivate the tick on
isolated CPUs depend on a few factors concerning the running thread behavior.
Please, consult the nohz_full documentation in the kernel to learn more
.IP *
The Linux real\-time project has put together a document on the best
practices for writting real\-time applications. Even though the
cpu\-partitioning profile does not guarantee real\-time response time, much
of the techniques for writting real\-time applications also apply for
applications intended to run under the cpu\-partitioning profile. Please,
refer to this document at
.I https://rt.wiki.kernel.org
.SH "FILES"
.nf
.I /etc/tuned/*
.I /usr/lib/tuned/*
.I /etc/tuned/cpu\-partitioning\-variables.conf
.I /etc/tuned/tuned\-main.conf
.SH "SEE ALSO"
.BR tuned (8)
.BR tuned\-adm (8)
.BR tuned\-profiles (7)
.BR tuned\-profiles\-atomic (7)
.BR tuned\-profiles\-sap (7)
.BR tuned\-profiles\-sap\-hana (7)
.BR tuned\-profiles\-oracle (7)
.BR tuned\-profiles\-realtime (7)
.BR tuned\-profiles\-nfv\-host (7)
.BR tuned\-profiles\-nfv\-guest (7)
.BR tuned\-profiles\-compat (7)
.SH AUTHOR
.nf
Jaroslav Škarvada <jskarvad@redhat.com>
Luiz Capitulino <lcapitulino@redhat.com>
Andrew Theurer <atheurer@redhat.com>
.\"/*
.\" * All rights reserved
.\" * Copyright (C) 2018 Red Hat, Inc.
.\" * Authors: Jaroslav Škarvada
.\" *
.\" * This program is free software; you can redistribute it and/or
.\" * modify it under the terms of the GNU General Public License
.\" * as published by the Free Software Foundation; either version 2
.\" * of the License, or (at your option) any later version.
.\" *
.\" * This program is distributed in the hope that it will be useful,
.\" * but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" * GNU General Public License for more details.
.\" *
.\" * You should have received a copy of the GNU General Public License
.\" * along with this program; if not, write to the Free Software
.\" * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
.\" */
.\"
.TH TUNED_PROFILES_MSSQL "7" "05 Jun 2018" "Red Hat, Inc." "tuned"
.SH NAME
tuned\-profiles\-mssql - description of profile provided for the MS SQL Server
.SH DESCRIPTION
This profile is provided for the MS SQL Server. It's based on the
throughput-performance profile.
.SH "FILES"
.nf
.I /etc/tuned/*
.I /usr/lib/tuned/*
.SH "SEE ALSO"
.BR tuned (8)
.BR tuned\-adm (8)
.BR tuned\-profiles (7)
.BR tuned\-profiles\-sap (7)
.BR tuned\-profiles\-sap\-hana (7)
.BR tuned\-profiles\-oracle (7)
.BR tuned\-profiles\-atomic (7)
.BR tuned\-profiles\-realtime (7)
.BR tuned\-profiles\-nfv\-host (7)
.BR tuned\-profiles\-nfv\-guest (7)
.BR tuned\-profiles\-cpu\-partitioning (7)
.BR tuned\-profiles\-compat (7)
.SH AUTHOR
.nf
Jaroslav Škarvada <jskarvad@redhat.com>
......@@ -44,6 +44,7 @@ Profile optimized for virtual guests based on realtime profile.
.BR tuned\-profiles\-atomic (7)
.BR tuned\-profiles\-sap (7)
.BR tuned\-profiles\-sap\-hana (7)
.BR tuned\-profiles\-mssql (7)
.BR tuned\-profiles\-oracle (7)
.BR tuned\-profiles\-realtime (7)
.BR tuned\-profiles\-nfv\-host (7)
......
......@@ -44,6 +44,7 @@ Profile optimized for virtual hosts based on realtime profile.
.BR tuned\-profiles\-atomic (7)
.BR tuned\-profiles\-sap (7)
.BR tuned\-profiles\-sap\-hana (7)
.BR tuned\-profiles\-mssql (7)
.BR tuned\-profiles\-oracle (7)
.BR tuned\-profiles\-realtime (7)
.BR tuned\-profiles\-nfv\-guest (7)
......
......@@ -45,6 +45,7 @@ performance related kernel parameters.
.BR tuned\-profiles (7)
.BR tuned\-profiles\-sap (7)
.BR tuned\-profiles\-sap\-hana (7)
.BR tuned\-profiles\-mssql (7)
.BR tuned\-profiles\-atomic (7)
.BR tuned\-profiles\-realtime (7)
.BR tuned\-profiles\-nfv\-host (7)
......
......@@ -44,6 +44,7 @@ Profile optimized for realtime.
.BR tuned\-profiles\-atomic (7)
.BR tuned\-profiles\-sap (7)
.BR tuned\-profiles\-sap\-hana (7)
.BR tuned\-profiles\-mssql (7)
.BR tuned\-profiles\-oracle (7)
.BR tuned\-profiles\-nfv\-host (7)
.BR tuned\-profiles\-nfv\-guest (7)
......
......@@ -54,6 +54,7 @@ receive offload for the network adapter.
.BR tuned\-profiles (7)
.BR tuned\-profiles\-atomic (7)
.BR tuned\-profiles\-sap (7)