How to Tune Linux Kernel Parameters with sysctl on RHEL 7
The Linux kernel exposes hundreds of tunable parameters through the sysctl interface, allowing system administrators to adjust network behavior, memory management, file descriptor limits, and security policies without recompiling the kernel or rebooting. On Red Hat Enterprise Linux 7, these parameters are managed through the /etc/sysctl.conf file and the drop-in directory /etc/sysctl.d/. Understanding how to read, apply, and persist kernel parameters is an essential skill for any RHEL 7 administrator tuning servers for high-traffic web applications, databases, or general-purpose workloads. This guide walks through the complete sysctl workflow, explains the most impactful parameters, and covers how to verify and revert changes safely.
Prerequisites
- A running RHEL 7 system with root or
sudoaccess - Basic familiarity with the Linux command line
- An understanding of the workload type you are tuning for (web server, database, general compute)
- The
util-linuxpackage installed (providessysctl, available by default)
Step 1: Understanding sysctl and the /proc/sys Hierarchy
The sysctl command reads and writes kernel parameters exposed under the /proc/sys/ virtual filesystem. Each file in that tree corresponds to a tunable parameter. For example, /proc/sys/net/core/somaxconn maps to the sysctl key net.core.somaxconn — forward slashes become dots in sysctl notation.
To view all current kernel parameters at once:
sysctl -a
To filter for a specific subsystem:
sysctl -a | grep net.ipv4.tcp
sysctl -a | grep vm.swap
To read a single parameter:
sysctl net.core.somaxconn
Parameters are organized into namespaces. The main namespaces are:
- kernel. — core kernel behavior (hostname, panic timeouts, PID limits)
- net. — network stack tuning (TCP, UDP, socket buffers)
- vm. — virtual memory and swap behavior
- fs. — filesystem and file descriptor limits
Step 2: Making Temporary Changes with sysctl -w
Before committing a change permanently, test it at runtime using sysctl -w. Changes made this way take effect immediately but do not survive a reboot.
# Increase the maximum socket listen backlog
sysctl -w net.core.somaxconn=65535
# Reduce TCP FIN-WAIT-2 timeout from 60s to 30s
sysctl -w net.ipv4.tcp_fin_timeout=30
# Allow TIME_WAIT sockets to be reused for new connections
sysctl -w net.ipv4.tcp_tw_reuse=1
# Reduce swappiness — prefer RAM over swap
sysctl -w vm.swappiness=10
# Increase the network device receive queue length
sysctl -w net.core.netdev_max_backlog=5000
# Raise the system-wide open file descriptor limit
sysctl -w fs.file-max=2097152
Verify immediately after each change:
sysctl net.core.somaxconn
# Output: net.core.somaxconn = 65535
Step 3: Persisting Parameters in /etc/sysctl.conf
The traditional location for persistent sysctl parameters on RHEL 7 is /etc/sysctl.conf. Open the file with a text editor and add your parameters:
vi /etc/sysctl.conf
Add or modify the following block for a tuned web server configuration:
# --- Network Performance Tuning ---
# Maximum socket listen backlog
net.core.somaxconn = 65535
# Increase the maximum number of remembered connection requests
net.ipv4.tcp_max_syn_backlog = 8192
# Reduce FIN_WAIT2 timeout
net.ipv4.tcp_fin_timeout = 30
# Allow reuse of TIME_WAIT sockets (safe for non-NAT outbound connections)
net.ipv4.tcp_tw_reuse = 1
# Increase receive/send socket buffer sizes
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Network device backlog queue
net.core.netdev_max_backlog = 5000
# --- Memory Management ---
# Prefer RAM over swap (0 = never swap, 100 = aggressive swap)
vm.swappiness = 10
# Percentage of dirty memory before kernel flushes to disk
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
# --- Filesystem ---
# System-wide file descriptor limit
fs.file-max = 2097152
Apply the configuration without rebooting:
sysctl -p
The -p flag reads from /etc/sysctl.conf by default. It will print each parameter as it is applied and report errors on lines with invalid keys or values.
Step 4: Using Drop-In Files in /etc/sysctl.d/
RHEL 7 supports the /etc/sysctl.d/ directory for modular configuration — each file in this directory is applied at boot in lexicographic order, after /etc/sysctl.conf. This is the preferred approach when managing multiple roles or when deploying via configuration management tools like Ansible or Puppet.
vi /etc/sysctl.d/99-network-tuning.conf
# Network tuning for high-traffic web servers
net.core.somaxconn = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.core.netdev_max_backlog = 5000
vi /etc/sysctl.d/99-security-hardening.conf
# Security parameters
# Disable IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Ignore ICMP broadcast requests (Smurf attack mitigation)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Disable ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# Enable SYN flood protection
net.ipv4.tcp_syncookies = 1
# Log suspicious martian packets
net.ipv4.conf.all.log_martians = 1
Apply a specific drop-in file:
sysctl -p /etc/sysctl.d/99-network-tuning.conf
Apply all sysctl configuration files (simulating what happens at boot):
sysctl --system
Step 5: Key Performance vs Security Parameters
Not all sysctl parameters serve the same purpose. Distinguishing between performance-oriented and security-oriented parameters helps you make intentional trade-offs.
Performance parameters increase throughput, reduce latency, or raise resource ceilings:
net.core.somaxconn— maximum backlog for accept() queues; raise for high-concurrency web serversnet.ipv4.tcp_fin_timeout— how long to keep FIN_WAIT-2 sockets; lower values free ports fasternet.ipv4.tcp_tw_reuse— reuse TIME_WAIT sockets for outbound connections; useful on servers making many outbound requestsvm.swappiness— lower values keep more data in RAM; set to 10 for databases, 1 for in-memory workloadsnet.core.netdev_max_backlog— receive queue length before packets are dropped; increase for high-bandwidth interfacesfs.file-max— maximum open file descriptors system-wide; raise for applications that open many sockets or files
Security parameters harden the kernel against attacks:
net.ipv4.tcp_syncookies— enables SYN cookies to resist SYN flood attacks (should always be 1)kernel.randomize_va_space— enables ASLR (set to 2 for full randomization)net.ipv4.conf.all.rp_filter— reverse path filtering to prevent IP spoofingkernel.dmesg_restrict— restrictdmesgoutput to root-only (set to 1)
Step 6: Verifying Parameters are Applied
After applying changes, verify each parameter:
# Check a specific parameter
sysctl net.core.somaxconn
# Verify multiple parameters with grep
sysctl -a | grep -E 'somaxconn|tcp_fin_timeout|tcp_tw_reuse|swappiness'
# Confirm via /proc/sys directly
cat /proc/sys/net/core/somaxconn
cat /proc/sys/vm/swappiness
Step 7: Reverting Changes
If a parameter causes instability, revert immediately at runtime:
# Revert somaxconn to RHEL 7 default
sysctl -w net.core.somaxconn=128
# Revert swappiness to default
sysctl -w vm.swappiness=60
To revert all parameters to kernel defaults (not recommended on a live system — use with caution), remove or comment out entries in /etc/sysctl.conf and /etc/sysctl.d/, then reboot. Alternatively, use the tuned profile system to manage kernel parameters declaratively:
yum install -y tuned
systemctl enable tuned --now
tuned-adm profile throughput-performance
Conclusion
Kernel parameter tuning with sysctl is one of the most impactful and reversible forms of system optimization available on RHEL 7. By separating performance parameters from security parameters, using /etc/sysctl.d/ drop-in files for modular management, and always testing changes at runtime before persisting them, you can safely push your server’s performance envelope without introducing systemic risk. Start with a conservative set of network and memory parameters, measure the impact under realistic load, and iterate — the kernel’s tunability is a feature, not a footgun, when approached methodically.