HomeLinuxHow to Tune Linux Kernel without Reboot

How to Tune Linux Kernel without Reboot

Tuning the Linux kernel without rebooting is very useful. It keeps computers running without a break. This means no waiting for restarts. Making changes on the go helps computers run better or fix issues quickly. This way, work doesn’t stop, and performance gets better without delay. It’s like fixing a car while it’s moving, without needing to stop. 🏎️💨

General Precaution: Always ensure you have a full backup of your data before making any changes to your system's configuration.

Understanding Linux Kernel Parameters

The Linux kernel is like your computer’s brain, controlling how it works. Sometimes, you need to adjust its settings. Two tools help us do this without restarting the computer: the /proc/sys/ directory and the sysctl command.

The /proc/sys/ directory is a special place on your computer. It lets you see and change the kernel’s settings while the computer is running. It’s like a control panel for the computer’s brain.

The sysctl command is an easier way to change these settings. You can use one command instead of looking through folders. This command talks to the /proc/sys/ directory for you.

To keep changes after restarting, you can edit a file named /etc/sysctl.conf. This file remembers your settings. When you turn on your computer, it uses these settings.

Using /proc/sys/ and sysctl, you can make your computer work better without stopping it. These tools are great for fine-tuning your computer’s brain.

Kernel Tuning Tools

sysctl Command

sysctl is a command that changes the kernel’s settings quickly at runtime.

syntax:

sysctl [options] [variable[=value] ...]

[options]: These are modifiers that alter how the sysctl command operates. Options can control the output format, whether changes are applied temporarily or saved for future sessions, and other behaviors of the command. Here’s a look at some of the key [options] you can use with sysctl.

OptionsDescription
-n, --valuesShow only the values, not the names, of the kernel parameters.
-e, --ignoreIgnore errors about unknown keys when setting or getting parameters.
-N, --namesDisplay only the names of the kernel parameters
-q, --quietDo not display the set values on the standard output.
-w, --writeTreat all arguments as parameters to set, showing an error for non-parsable inputs.
-p[FILE], --load[=FILE]Load settings from the specified file or from /etc/sysctl.conf if no file is given. - reads from standard input.
-a, --allDisplay all kernel parameters and their current values.
--deprecatedInclude deprecated parameters in the listings with --all.
-b, --binaryOutput the value without a trailing newline.
--systemLoad settings from all system configuration files.
-r, --pattern patternApply settings only to parameters matching the specified pattern.
-h, --helpDisplay help text and exit.
-V, --versionDisplay version information and exit.

[variable]: This represents the name of the kernel parameter you want to interact with. Kernel parameters control various aspects of the operating system’s behavior.

[=value]: When a variable is followed by =value, it means you are assigning a new value to the kernel parameter specified by [variable]. If this part is omitted, sysctl will simply display the current value of the variable.

[…]: The ellipsis (...) indicates that the command can accept multiple [variable[=value]] pairs at once. This allows you to query or set multiple parameters in a single command line.

To list all kernel parameters:
sysctl -a
To list any specific kernel parameter:
sysctl -a | grep '[parameter]'

Here, replace [parameter] with the actual kernel parameter you need to list. For example, if you’re searching for parameters related to the TCP congestion control algorithm, you might use tcp_congestion_control as your search keyword.

To show the value of a kernel parameter:
sysctl [parameter]

Replace [parameter name] with the name of the kernel parameter whose value you want to view. For example, if you want to see the current value of the IP forwarding setting, you would use: sysctl net.ipv4.ip_forward.

To modify/change kernel parameters:
sysctl -w [parameter]=[value]

Replace [parameter] with the name of the kernel parameter you want to modify and [value] with the new value you wish to assign to it. For example, to enable IP forwarding temporarily, you would use: sysctl -w net.ipv4.ip_forward=1

This change will be effective immediately but will not persist after a system reboot.

To keep the change even after you reboot, you add the needed configuration to a file called /etc/sysctl.conf or through a custom new file in the /etc/sysctl.d/ folder with another command: sysctl -p /etc/sysctl.d/<filename>

For example, to make the net.ipv4.ip_forward change permanent, add the following line to /etc/sysctl.conf:

net.ipv4.ip_forward=1

Execute the following command to apply the changes.

sysctl -p

OR

Make a custom file for the kernel configuration by executing the command:

sysctl -p /etc/sysctl.d/<filename>

Replace <filename> with the actual file name you need!

/proc/sys/ Directory

The /proc/sys/ directory on a Linux system contains a set of files and directories that directly map to the kernel’s parameters. Each file in this directory represents a specific parameter, and the contents of the file are the current value of that parameter. By writing a new value into one of these files, you’re directly changing the parameter’s setting.

Determine the Path to the Parameter:

To change kernel settings by editing their files in the /proc/sys directory, finding the right file is important. Since there are so many files, this can be hard. We use a mix of commands to help find the exact file we need.

To determine the path to a kernel parameter, start with sysctl -a | grep <keyword> to find the parameter.

sysctl -a | grep <keyword>

For example, if you’re looking for parameters related to TCP settings but aren’t sure of the exact parameter name or path, you can search like this:

sysctl -a | grep tcp

Choose the parameter you’re interested in, for example, net.ipv4.tcp_fin_timeout was the parameter you need to change!

Replace dots (.) in the parameter name with slashes (/) and prepend /proc/sys/ to the beginning.

Then the file responsible for it will be /proc/sys/net/ipv4/tcp_fin_timeout

By this way you can identify the file responsible for the kernel parameter.

Modifying the parameter via file:

To modify a parameter, you use the echo command followed by the value you want to set, and then redirect (>) that value into the corresponding file in the /proc/sys/ directory.

For example, to set the parameter of net.ipv4.tcp_fin_timeout to, for example, 30 seconds, you would use the following command:

echo 30 | sudo tee /proc/sys/net/ipv4/tcp_fin_timeout

This command uses echo to output the value 30, then sudo tee to write this value to the file corresponding to the tcp_fin_timeout parameter, located at /proc/sys/net/ipv4/tcp_fin_timeout.

An another example, where you are setting the net.ipv4.ip_forward value to 1:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

To wrap up, by tailoring the steps mentioned to your specific requirements, you can fine-tune your Linux kernel to meet your expectations flawlessly, all without having to face any downtime. Remember, it’s always a good practice to back up your Linux system before making any modifications. 💻🛠

Scroll to Top