What are Kernel Parameters?
Kernel parameters are tunable settings of the operating system kernel (the core part of Linux/UNIX that manages CPU, memory, processes, I/O, and networking).
They control how the OS allocates resources and behaves under load.
Think of the kernel as the brain of the OS, and kernel parameters as knobs and switches you adjust to optimize behavior.
Simple analogy
Imagine the OS as a traffic controller:
- Kernel parameters decide:
- How many cars (processes) can enter
- How much fuel (memory) each car gets
- How wide the roads (network buffers) are
- How many lanes are reserved for emergency services (DBA privileges, file handles, shared memory)
Without tuning these:
- Traffic jams happen (performance issues)
- Cars may crash (out-of-memory, failures)
- Emergency services get blocked (database outages)
Why do we need to set kernel parameters?
1. Defaults are generic, not workload-aware
Linux ships with safe, general‑purpose defaults, suitable for:
- Desktops
- Light servers
- Small applications
Databases like Oracle, PostgreSQL, MySQL, DB2 require:
- Large shared memory
- Many semaphores
- High file descriptors
- Fast IPC (Inter‑Process Communication)
✅ Kernel tuning adapts Linux for database workloads.
2. Databases use OS resources directly
Databases are heavy OS consumers:
| Database Component | OS Resource Used |
|---|
| Buffer cache / SGA | Shared memory |
| Background processes | Process limits |
| User connections | Semaphores |
| Datafiles / redo | File descriptors |
| Network sessions | TCP buffers |
If kernel limits are too low:
- Database won’t start
- Or it will start and crash under load
3. Prevent runtime failures (very important in prod)
Without proper kernel settings, you may see errors like:
ORA-27102: out of memoryORA-27300: OS system dependent operation:semget failedORA-00020: maximum number of processes exceededToo many open files
✅ Kernel parameters prevent these before they happen.
4. Performance and stability
Correct kernel values:
- Reduce context switching
- Improve IPC speed
- Prevent memory starvation
- Stabilize high concurrency workloads
This directly impacts:
- TPS
- Query latency
- Batch job runtime
- Overall uptime
Common kernel parameters (database-focused)
Below are typical kernel areas you tune.
1. Shared memory (very critical for Oracle)
kernel.shmmni # Number of shared memory segments
kernel.shmmax # Max size of a single shared memory segment
kernel.shmall # Total shared memory (pages)
Used by:
- Oracle SGA
- Locking and caching mechanisms
2. Semaphores (process coordination)
kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI
Controls:
- How many DB sessions can run concurrently
- Coordination between background processes
Low semaphore values = database startup or connection failures.
3. File descriptors
fs.file-max
Databases open:
- Datafiles
- Redo logs
- Control files
- Archive logs
Each is a file handle.
4. Network tuning (for client-heavy systems)
net.core.rmem_max
net.core.wmem_max
net.ipv4.ip_local_port_range
Impacts:
- Connection scalability
- Latency
- Throughput
5. Process limits
kernel.pid_max
DBs spawn many:
- Background processes
- Server processes
- Parallel execution slaves
How kernel parameters are set
Temporary (lost after reboot)
sysctl -w kernel.shmmax=68719476736
Permanent (recommended)
Edit:
/etc/sysctl.conf
# or
/etc/sysctl.d/99-oracle.conf
Apply:
sysctl -p
✅ Always use persistent configuration in production.
Why Oracle insists on kernel tuning
Oracle performs prechecks during installation because:
- The database depends on these resources
- Incorrect settings cause data corruption risks
- Performance problems are often OS‑level, not SQL‑level
If prechecks fail and you “ignore all”: 👉 You are accepting production risk.
Relationship with SOX / audits (important for you)
From an audit perspective:
Kernel parameters support:
- Availability control (system stability)
- Capacity management
- Change management (controlled OS tuning)
- Risk mitigation
Best practice:
- Document tuned values
- Version control
/etc/sysctl.conf - Change ticket for OS tuning
Real‑world DBA best practice
✅ Tune kernel parameters before database installation
✅ Follow vendor recommendations (Oracle, Red Hat)
✅ Re‑evaluate after:
- HW upgrades
- Memory changes
- Major DB version upgrades
- Kernel parameters = OS behavior controls
- Why set them?
- Databases need more resources than defaults allow
- Prevent failures and performance issues
- Not tuning them = production risk
- Mandatory for enterprise DB workloads
1. Shared Memory Parameters (‼️ Critical for Oracle)
Oracle’s SGA is implemented using shared memory.
If these are wrong → DB won’t start or will crash under load.
kernel.shmmax
👉 Max size of one shared memory segment
kernel.shmmax = 68719476736 # example: 64 GB
Why needed
- Oracle usually creates one large segment for SGA
shmmax must be >= SGA size
❌ Too low → ORA-27102: out of memory
✅ Best practice
Set to ~50–75% of physical RAM
kernel.shmall
👉 Total shared memory available (in pages, not bytes)
kernel.shmall = 16777216
Formula:
(shmmax / PAGE_SIZE)
Typically PAGE_SIZE = 4096 bytes.
Why needed
- Controls overall shared memory capacity
- Prevents system-wide exhaustion
kernel.shmmni
👉 Number of shared memory segments system-wide
kernel.shmmni = 4096
Why needed
- Multiple DBs or IPC consumers
- Rarely a bottleneck, but must be sufficient
2. Semaphore Parameters (Concurrency Control)
Semaphores manage process coordination (sessions, background processes).
kernel.sem
kernel.sem = 250 64000 100 4096
Meaning (very important):
| Value | Meaning |
|---|
| SEMMSL | Max semaphores per set |
| SEMMNS | Total system semaphores |
| SEMOPM | Max ops per semop call |
| SEMMNI | Max semaphore sets |
Why Oracle needs this
- Each DB session consumes semaphores
- Parallel exec + background processes multiply usage
❌ Too low →
ORA-27300- Random login failures
- DB startup failures
✅ Rule of thumb
SEMMNS ≥ (processes × 2)
3. File Descriptor Limits (Very Common Failure)
Oracle opens a LOT of files:
- Datafiles
- Redo
- Control files
- Archive logs
- Trace files
fs.file-max
fs.file-max = 6815744
This is system‑wide.
Also check user limits:
ulimit -n
Why needed
- Prevent “too many open files”
- Critical during backup, RMAN, heavy I/O
✅ Typical prod value
1M – 10M (depends on server size)
4. Process & PID Limits
kernel.pid_max
kernel.pid_max = 4194304
Why needed
- Oracle uses:
- Dedicated server processes
- Background processes
- Parallel slaves
Low PID limit → OS refuses process creation.
5. Network Parameters (Client‑Heavy Systems)
Important for:
- OLTP apps
- Microservices
- JDBC-heavy loads
Port range
net.ipv4.ip_local_port_range = 9000 65500
Why needed
- Each client connection needs a port
- Prevents port exhaustion
Buffer sizes
net.core.rmem_max = 4194304
net.core.wmem_max = 1048576
Why needed
- Faster network IO
- Less packet loss
- Better throughput
6. HugePages (Highly Recommended for Oracle)
Not a kernel param per se, but kernel memory behavior.
Why HugePages
✅ Lock SGA in memory
✅ Prevent swapping
✅ Reduce page table overhead
✅ Improve performance & stability
Oracle strongly recommends this.
Example:
vm.nr_hugepages = 32768
❌ Without HugePages:
- SGA may swap
- Random latency spikes
- Performance degradation
How to Set Parameters (Production-Safe Way)
Create a dedicated config file
/etc/sysctl.d/99-oracle.conf
Example:
kernel.shmmax = 68719476736
kernel.shmall = 16777216
kernel.shmmni = 4096
kernel.sem = 250 64000 100 4096
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
Apply:
sysctl -p /etc/sysctl.d/99-oracle.conf
✅ Version‑controllable
✅ Audit‑friendly
✅ No conflict with OS defaults
Oracle 19c / 21c – Recommended Practical Minimums
| Area | Minimum Safe Value |
|---|
| Shared Memory | Enough for SGA |
| Semaphores | Processes × 2 |
| File handles | ≥ 1M |
| HugePages | Enabled |
| Port range | ≥ 50K ports |
SOX / Audit Mapping (Important for You)
Kernel tuning supports:
| Control Area | How |
|---|
| Availability | Prevents crashes / resource exhaustion |
| Change Mgmt | Controlled sysctl changes |
| Capacity Mgmt | Planned memory allocation |
| Incident Prevention | Avoids known Oracle failures |
✅ Best practice:
- Change ticket for
/etc/sysctl.d/99-oracle.conf - Baseline comparison during audits
- Kernel parameters define how OS supports Oracle
- Defaults ≠ database‑ready
- Incorrect values = startup failures, outages, performance issues
- Correct tuning = stable, predictable DB behavior
✅ Oracle 19c – Production Kernel Parameter Template (Linux)
Create one dedicated file (best practice):
/etc/sysctl.d/99-oracle.conf
🔹 Core Oracle Kernel Parameters
# ===============================
# Oracle 19c Kernel Parameters
# ===============================
# Shared Memory
kernel.shmmax = 68719476736
kernel.shmall = 16777216
kernel.shmmni = 4096
# Semaphores
kernel.sem = 250 64000 100 4096
# File descriptors
fs.file-max = 6815744
# Process IDs
kernel.pid_max = 4194304
# Network tuning
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# Memory management
vm.swappiness = 1
vm.dirty_background_ratio = 3
vm.dirty_ratio = 15
Apply:
sysctl -p /etc/sysctl.d/99-oracle.conf
✅ Persistent
✅ Upgrade‑safe
✅ Audit‑friendly
✅ Oracle‑recommended structure
✅ How to Adjust These Values (Correctly)
kernel.shmmax
- Set to 50–75% of physical RAM
- Example:
- 128 GB RAM →
shmmax ≈ 96GB
echo $((96 * 1024 * 1024 * 1024))
kernel.shmall
Formula:
shmmax / OS_PAGE_SIZE
Check page size:
getconf PAGE_SIZE
Semaphores (kernel.sem)
Rule of thumb:
SEMMNS ≥ processes × 2
If processes=2000:
SEMMNS ≥ 4000
Oracle safe defaults already exceed this.
✅ HugePages Configuration (Strongly Recommended)
Why HugePages matter for Oracle
✅ Prevents SGA swapping
✅ Better performance & stability
✅ Required for serious production systems
Check required HugePages
grep Huge /proc/meminfo
From Oracle:
$ORACLE_HOME/bin/oracle -X
Then set:
vm.nr_hugepages = <calculated value>
✅ Oracle OS User Limits (Mandatory)
Edit:
/etc/security/limits.d/oracle.conf
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft nofile 1024000
oracle hard nofile 1024000
oracle soft stack 10240
oracle hard stack 32768
Verify:
su - oracle
ulimit -a
✅ Pre‑Installation OS Checklist (DBA‑Grade)
1️⃣ OS validation
- ✅ Certified Linux version
- ✅ Correct kernel version
- ✅ Swap ≥ RAM (or HugePages enabled)
2️⃣ User & groups
oracle:oinstall,dba
Optional for 19c+:
3️⃣ Disable Transparent Huge Pages (THP)
cat /sys/kernel/mm/transparent_hugepage/enabled
Set permanently:
transparent_hugepage=never
4️⃣ SELinux & Firewall
- SELinux →
permissive or disabled - Firewall → allow DB listener ports
5️⃣ Filesystem mount options
For database files:
noatime,nodiratime
✅ SOX / Audit Mapping (Very Important)
| Control Area | Mapping |
|---|
| Availability | Prevents kernel resource exhaustion |
| Change Mgmt | Controlled /etc/sysctl.d change |
| Capacity Mgmt | Documented memory allocation |
| Incident Reduction | Avoids known Oracle outages |
✅ Keep:
- Change request
- Before/after sysctl snapshot
- Approval record