 Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Linux kernel — tuning wydajności

# Linux kernel — tuning wydajności systemu dla serwerów produkcyjnych

Opublikowano: 10 kwietnia 2026 · Kategoria: VPS

Domyślna konfiguracja kernela Linux jest celowo konserwatywna — działa na desktopach, laptopach, serwerach i urządzeniach embedded. Serwer produkcyjny ma zupełnie inne priorytety: maksymalna przepustowość sieciowa, niskie latencje I/O, brak paginacji, obsługa dziesiątek tysięcy jednoczesnych połączeń. Ten artykuł pokazuje jakie parametry zmienić i dlaczego — z uwzględnieniem różnicy między serwerami baz danych, webserwerami i VPS.

## sysctl.conf — parametry sieci i pamięci

\# Sprawdź obecne wartości
sysctl -a | grep net.core
sysctl net.ipv4.tcp\_fin\_timeout

# Zmień bez restartu (tymczasowo)
sysctl -w net.core.somaxconn=65535

# /etc/sysctl.d/99-server-tuning.conf — trwała konfiguracja
# =====================================================
# SIEC — Web server / API (Nginx, Node.js, PHP-FPM)
# =====================================================

# Kolejka połączeń przychodzących
net.core.somaxconn = 65535
net.ipv4.tcp\_max\_syn\_backlog = 65535
net.core.netdev\_max\_backlog = 250000

# Bufor sieciowy (dla duzej przepustowosci)
net.core.rmem\_max = 134217728
net.core.wmem\_max = 134217728
net.ipv4.tcp\_rmem = 4096 87380 134217728
net.ipv4.tcp\_wmem = 4096 65536 134217728

# Szybsze zamykanie polaczen (recykling portow)
net.ipv4.tcp\_fin\_timeout = 30
net.ipv4.tcp\_tw\_reuse = 1
net.ipv4.ip\_local\_port\_range = 1024 65535

# TIME\_WAIT — wazne dla serwerow z duza iloscia polaczen
net.ipv4.tcp\_max\_tw\_buckets = 1440000

# =====================================================
# PAMIEC — Serwery aplikacyjne
# =====================================================

# Unikaj swapu dla serwerow aplikacyjnych (0 = swap tylko przy krytycznym braku RAM)
vm.swappiness = 10

# Dirty pages — jak czesto zapisywac brudne strony na dysk
vm.dirty\_ratio = 60
vm.dirty\_background\_ratio = 5

# Inotify — dla Node.js/React dev i watcherow plikow
fs.inotify.max\_user\_watches = 524288
fs.inotify.max\_user\_instances = 8192

# Deskryptory plikow — globalne dla systemu
fs.file-max = 2097152

# Zaladuj konfiguracje bez restartu
sudo sysctl -p /etc/sysctl.d/99-server-tuning.conf

## ulimit i limits.conf — limity zasobów procesów

\# Sprawdź aktualne limity
ulimit -a         # limity biezacej sesji
ulimit -n         # open files limit
cat /proc/$$/limits  # limity biezacego procesu

# Sprawdz limity konkretnego procesu (np. Nginx worker)
cat /proc/$(pgrep -x nginx | head -1)/limits | grep "open files"

# /etc/security/limits.conf — limity dla uzytkownikow (PAM)
# ========================================================
# Nginx
www-data soft nofile 65535
www-data hard nofile 65535

# PostgreSQL
postgres soft nofile 65535
postgres hard nofile 65535
postgres soft nproc  65535
postgres hard nproc  65535

# Wszsycy uzytkownicy (nie zalecane, lepiej per-user)
\* soft nofile 65535
\* hard nofile 65535

# /etc/pam.d/common-session musi miec:
# session required pam\_limits.so
# (zwykle jest domyslnie)

# Dla systemd services — PREFEROWANE dla daemonow
# /etc/systemd/system/nginx.service.d/override.conf
# \[Service\]
# LimitNOFILE=65535
# LimitNPROC=65535

# Zastosuj bez restartu (dla systemd)
sudo systemctl daemon-reload
sudo systemctl restart nginx

# Weryfikacja po zmianie
cat /proc/$(pgrep -x nginx | head -1)/limits | grep "open files"
# Powinna pokazac limit=65535

## Transparent Hugepages — kiedy wyłączyć

\# Sprawdz aktualne ustawienie
cat /sys/kernel/mm/transparent\_hugepage/enabled
# \[always\] madvise never  <-- aktywne (always)

# Wyniki: \[always\] madvise never = zawsze uzywaj THP
#         always \[madvise\] never = tylko gdy aplikacja pyta (safe)
#         always madvise \[never\] = wylaczone

# WYŁĄCZ dla baz danych (Redis, PostgreSQL, MySQL, MongoDB)
echo never | sudo tee /sys/kernel/mm/transparent\_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent\_hugepage/defrag

# Trwałe wyłączenie przez GRUB
# /etc/default/grub:
# GRUB\_CMDLINE\_LINUX="... transparent\_hugepage=never"
sudo update-grub

# Alternatywa: madvise (zalecanew dla mieszanych workloadow)
echo madvise | sudo tee /sys/kernel/mm/transparent\_hugepage/enabled

# Sprawdz czy Redis narzeka na THP (tipowy komunikat):
# redis-cli info server | grep thp
# WARNING: You have Transparent Huge Pages (THP) support enabled in your kernel.

## CPU Governor — tryb wydajności procesora

\# Sprawdz dostepne governory i aktualny
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling\_available\_governors
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling\_governor

# Governory:
# performance  — max czestotliwosc przez caly czas (serwer produkcyjny)
# powersave    — oszczednosc energii (laptop, nieprodukcja)
# ondemand     — skaluje po potrzebie (legacy, wolna reakcja)
# schedutil    — skaluje zgodnie z CFS scheduler (nowoczesny default)
# conservative — ostrożniejsze skalowanie niz ondemand

# Ustaw performance dla wszystkich rdzeni (tymczasowo)
for cpu in /sys/devices/system/cpu/cpu\*/cpufreq/scaling\_governor; do
  echo performance | sudo tee $cpu
done

# Trwale przez cpufrequtils
sudo apt install cpufrequtils -y
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl restart cpufrequtils

# Na serwerach Intel sprawdz tez:
# /sys/devices/system/cpu/intel\_pstate/no\_turbo
echo 0 | sudo tee /sys/devices/system/cpu/intel\_pstate/no\_turbo  # wlacz turbo boost

## I/O Scheduler — optimalizacja dla SSD i HDD

Scheduler

Najlepszy dla

Latencja

Przepustowość

none (noop)

NVMe SSD, wirtualne maszyny

Bardzo niska

Bardzo wysoka

mq-deadline

SSD, bazy danych (MySQL/Postgres)

Niska

Wysoka

bfq (Budget Fair Queueing)

HDD, mixed workloads, interaktywne

Przewidywalna

Dobra

kyber

SSD multi-queue, niska latencja

Bardzo niska

Wysoka

\# Sprawdz scheduler i typ dysku
cat /sys/block/sda/queue/scheduler
lsblk -d -o NAME,ROTA  # ROTA=0 to SSD/NVMe, ROTA=1 to HDD

# Ustaw scheduler dla SSD/NVMe (tymczasowo)
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler  # SSD SATA

# Trwale przez udev rules (zalecane)
# /etc/udev/rules.d/60-io-scheduler.rules:
# ACTION=="add|change", KERNEL=="sd\[a-z\]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
# ACTION=="add|change", KERNEL=="sd\[a-z\]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# ACTION=="add|change", KERNEL=="nvme\[0-9\]\*", ATTR{queue/scheduler}="none"

sudo udevadm control --reload-rules
sudo udevadm trigger --type=devices --action=change

## IRQ Affinity i NUMA awareness

\# Sprawdz topologie NUMA (multi-socket serwery)
numactl --hardware
# available: 2 nodes (0-1)
# node 0 cpus: 0 1 2 3 4 5 6 7
# node 1 cpus: 8 9 10 11 12 13 14 15

# Uruchom aplikacje na okreslonym NUMA node (lokalnosc pamieci)
numactl --cpunodebind=0 --membind=0 nginx
numactl --cpunodebind=1 --membind=1 postgres

# IRQ affinity — przypnij przerwania sieciowe do konkretnych rdzeni
# Sprawdz aktualne przerwania
cat /proc/interrupts | grep -E "eth|ens|enp"

# Automatyczne balansowanie IRQ przez irqbalance (zalecane dla wiekszosci serwerow)
sudo apt install irqbalance -y
sudo systemctl enable --now irqbalance

# Reczne przypinanie IRQ do rdzeni (zaawansowane — multi-queue NIC)
# Sprawdz queues karty sieciowej:
ls /sys/class/net/eth0/queues/
ethtool -l eth0  # pokaz combined queues

# Ustaw RSS (Receive Side Scaling) — rozprasza ruch na wiele CPU
ethtool -X eth0 equal 8  # 8 CPU dla RX queues

## Najczęstsze pytania

Jakie parametry sysctl mają największy wpływ na wydajność serwera? +

Kluczowe parametry sysctl dla serwera: net.core.somaxconn i net.ipv4.tcp\_max\_syn\_backlog (pojemność kolejki połączeń — krytyczne dla Nginx/Node), vm.swappiness=10 (ogranicza swap dla serwerów aplikacyjnych), fs.file-max i fs.inotify.max\_user\_watches (limity deskryptorów plików), net.ipv4.tcp\_fin\_timeout=30 (szybsze zwalnianie portów), net.core.netdev\_max\_backlog (bufor sieciowy dla skoków ruchu). Zawsze testuj zmiany pod obciążeniem — błędna konfiguracja może pogorszyć wydajność.

Co to są Transparent Hugepages i kiedy je wyłączyć? +

Transparent Hugepages (THP) to mechanizm jądra automatycznie tworzący duże strony pamięci (2MB zamiast 4KB) dla aplikacji. Dla baz danych (PostgreSQL, MySQL, Redis, MongoDB) THP powoduje problemy: długie przerwy GC przy defragmentacji pamięci i nieregularne spowolnienia latencji. Zalecenie: wyłącz THP dla baz danych (echo never > /sys/kernel/mm/transparent\_hugepage/enabled) lub ustaw madvise (tylko dla aplikacji które tego proszą). Dla serwerów HPC i big data THP może przyspieszyć działanie.

Czym różni się ulimit od limits.conf? +

ulimit to polecenie shell ustawiające limity zasobów dla bieżącego procesu i jego potomków — działa tylko w tej sesji. /etc/security/limits.conf to trwała konfiguracja przez PAM — limity są ustawiane przy logowaniu użytkownika i dotyczą wszystkich jego procesów. Dla systemd services limity ustawia się przez LimitNOFILE i inne dyrektywy w pliku .service (nie przez limits.conf). Sprawdź aktualne limity procesu: cat /proc/PID/limits.

Jak wybrać scheduler I/O dla dysku SSD lub HDD? +

Dla dysków SSD i NVMe: używaj scheduler none (no-op) lub mq-deadline — SSD nie ma głowicy do ułożenia, kolejkowanie jest zbędne. Dla dysków HDD: bfq (Budget Fair Queueing) jest najlepszy dla serwerów z mieszanym ruchem I/O — zapobiega zagłodzeniu procesów. Sprawdź aktualny scheduler: cat /sys/block/sda/queue/scheduler. Ustaw trwale przez udev rules lub parametry GRUB. Na serwerach wirtualnych (VPS) scheduler I/O może nie mieć znaczenia bo hypervisor zarządza I/O.

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

Dedykowany VPS z pełną kontrolą nad sysctl i parametrami jądra

Dedicated VPS

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

ProSerwer.pl

Polski VPS z root access — pełny tuning kernela bez ograniczeń

Root + Tuning

[Aktywuj rabat →](/out/proserwer-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/proserwer)

Mikr.us

Budżetowy VPS do nauki konfiguracji kernela i testowania parametrów

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

## Powiązane strony

-   [perf — profilowanie CPU i analiza wydajności](/baza-wiedzy/perf-profiling-cpu)
-   [bpftrace — dynamiczne śledzenie z eBPF](/baza-wiedzy/bpftrace-dynamiczne-sledzenie)
-   [Nginx — load balancer i upstream konfiguracja](/baza-wiedzy/nginx-load-balancer-konfiguracja)
-   [Wszystkie artykuły](/baza-wiedzy/)