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

⚡ W skrócie · 9 min czytania

-   sysctl.conf (net.core, vm.swappiness, file-max), ulimit i limits.conf, transparent hugepages, NUMA awareness, CPU governor (performance), IRQ affinity, schedulery I/O (CFQ vs BFQ vs deadline).
-   sysctl.conf - parametry sieci i pamięci.
-   ulimit i limits.conf - limity zasobów procesów.
-   Transparent Hugepages - kiedy wyłączyć.
-   CPU Governor - tryb wydajności procesora.

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 "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 "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 "Mikr.us")

#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/)
-   [strace i ltrace - diagnostyka procesów na serwerze Linux
    
    strace syscall tracing (-p/-e/-c), ltrace library calls, śledzenie procesów potomnych (-f), filtrowanie wywołań, -T…
    
    ](/baza-wiedzy/strace-debugging-linux/)
-   [Proxmox VE - wirtualizacja KVM i LXC dla serwerów dedykowanych
    
    Proxmox VE: instalacja, tworzenie VM i kontenerów LXC, storage ZFS/LVM/Ceph, networking bridges/VLAN, backup z Proxmox…
    
    ](/baza-wiedzy/proxmox-ve-wirtualizacja/)
-   [Prometheus + Grafana - monitoring stack dla VPS i serwerów
    
    Instalacja Prometheusa, node\_exporter, Grafany i Alertmanagera. Konfiguracja scraperów, PromQL basics, gotowe…
    
    ](/baza-wiedzy/prometheus-grafana-monitoring/)
-   [Jaki VPS wybrać?](/jaki-vps-wybrac/)

Autor: [Redakcja HostGrade.pl](/autorzy/) Zespół redakcyjny · Aktualizacja: 10 kwietnia 2026

Artykuły HostGrade.pl przygotowuje i aktualizuje redakcja serwisu. Ceny startowe, ceny odnowienia i warunki planów sprawdzamy w cennikach i regulaminach dostawców, a potem liczymy całkowity koszt za 2 lata (cena startowa plus odnowienia). Zasady zbierania danych i liczenia kosztów opisujemy na stronie Metodologia. Linki partnerskie oznaczamy jako #reklama.

[O redakcji i metodologii →](/autorzy/)