...

Kernel-tuning i Linux-hosting: Et overblik over Sysctl-parametre

Indstilling af kernen i Linux-hosting giver målbare præstationsgevinster, fordi jeg specifikt justerer sysctl-parametre for netværk, hukommelse, CPU og sikkerhed. Jeg indlæser profiler uden at genstarte og justerer værdier for arbejdsbelastninger, samtidighed og I/O-adfærd, så Server reagerer hurtigt under belastning og fungerer pålideligt.

Centrale punkter

  • sysctl Kontrollerer kernens opførsel på runtime
  • Netværk optimere: Backlogs, sockets, TCP
  • Hukommelse trim: Ombytning, beskidte sider
  • CPU Finjustering: Scheduler, PID'er
  • Sikkerhed Hærdning uden overhead

Hvad er sysctl i Linux-hosting?

Med sysctl Jeg læser og ændrer kerneparametre på runtime uden at kompilere kernen. Værdierne gemmes som filer i /proc/sys-biblioteket, f.eks. net/ipv4/tcp_max_syn_backlog, og styrer netværk, hukommelse og sikkerhed. Ved hosting af workloads med mange forbindelser reducerer direkte tuning latency peaks og timeouts. Jeg foretager midlertidige ændringer med sysctl -w og skriver permanente profiler i /etc/sysctl.d/*.conf. Derefter indlæser jeg alt med sysctl -system og tjekker dmesg og journal logs, så jeg hurtigt kan genkende fejlkonfigurationer.

Sådan bruger du sysctl sikkert

Før du foretager ændringer Profiler og dokumenterer de faktiske værdier med sysctl -a, så jeg til enhver tid kan rulle tilbage. Jeg tester først nye værdier på staging-VM'er med en sammenlignelig belastning. Derefter øger jeg parametrene trin for trin, overvåger målingerne og justerer igen. Det er sådan, jeg forhindrer OOM-dødsfald, socket-drop og sporadiske retransmissioner. For at kunne reproducere opsætninger opretter jeg en separat fil som /etc/sysctl.d/99-hosting.conf og indlæser den på en kontrolleret måde.

Test midlertidigt #
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096

Indstil # permanent
sudo tee /etc/sysctl.d/99-hosting.conf >/dev/null <<'EOF'
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 4096
vm.swappiness = 10
vm.dirty_ratio = 20
EOF

sudo sysctl --system

Netværksparametre, der bærer webservere

For mange samtidige forbindelser øger jeg somaxconn, så Nginx' eller Apaches listebacklog ikke flyder over. Jeg bruger net.ipv4.tcp_max_syn_backlog til at øge køen af halvåbne forbindelser, hvilket hjælper under trafikspidser. I rene webopsætninger lader jeg normalt net.ipv4.ip_forward være slået fra, men med reverse proxyer eller gateways slår jeg den til. Jeg validerer backlog drops med ss -s og netstat -s og tjekker, om acceptkøerne er ved at være tomme. Hvis du vil gå dybere ind i overbelastningskontrol, kan du også evaluere algoritmer som CUBIC eller BBR; min henvisning til TCP overbelastningskontrol.

# Eksempel på værdier for højfrekvente webservere
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.ip_forward = 0

Storage- og VM-tuning til hosting af arbejdsbelastninger

Jeg sænker byttevillighed til 10, så kernen bruger RAM i længere tid og swapper mindre. Med vm.dirty_ratio på 15 til 20 procent begrænser jeg dirty pages, så skrivebelastningen ikke fører til lange flush bursts. For mange processer sætter jeg vm.overcommit_memory til 1, hvis jeg kender applikationerne og forstår deres reserver. Jeg overvåger også page cache hits og IO wait, så jeg kan fortolke caching-effekter korrekt. Jeg giver et dybere kig på cache-adfærd med denne guide til Side-cache.

# Storage- og VM-profiler
vm.swappiness = 10
vm.dirty_ratio = 20
vm.overcommit_memory = 1

Finjustering af CPU og scheduler

Med høj samtidighed løfter jeg kernel.pid_max så mange arbejdsprocesser modtager ID'er. For CFS-kvoter justerer jeg kernel.sched_cfs_bandwidth_slice_us for at undgå for korte slices til bursty services. Jeg tjekker længden af kørekøer, kontekstskift og steal-tider, især på delte hosts. Hvis jeg har brug for CPU-isolering, binder jeg tjenester til kerner via taskset eller cgroups. En introduktion til dybere kerneoptimering findes i denne compact Kernens ydeevne-Guide.

# Proces- og planlægningsparametre
kernel.pid_max = 4194304
# Eksempel på finere CFS-skiver
kernel.sched_cfs_bandwidth_slice_us = 5000

Sikkerhedsparametre uden tab af ydeevne

Jeg aktiverer dmesg_restrict, for at forhindre uprivilegerede brugere i at læse kernelogs. Jeg bruger kernel.kptr_restrict til at skjule adresser, der kan hjælpe angribere med exploits. På netværksniveau slår jeg rp_filter til som standard for at forhindre IP-spoofing. Disse indstillinger koster næsten ingen ydelse og styrker host hardening betydeligt. Jeg lægger dem ind i den samme sysctl-fil på en kontrolleret måde, så jeg forbliver sporbar.

#-hærdning via sysctl
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

Udvidet netværksbuffer til høj gennemstrømning

Til værter med høj trafik passer jeg TCP-buffer så hurtige forbindelser ikke hænger i vinduesgrænsen. Jeg bruger net.ipv4.tcp_rmem og tcp_wmem til at definere minimums-, standard- og maksimumsstørrelser. net.core.optmem_max og net.core.netdev_max_backlog hjælper med at absorbere korte udbrud på en ren måde. Jeg overvåger retransmissioner, cwnd-udvikling og bufferfyldningsniveauer, før jeg øger værdierne yderligere. Disse trin øger gennemstrømningen og reducerer mærkbart udsving i ventetiden på moderne 10G-links.

# udvidet netværksbuffer
net.core.optmem_max = 81920
net.core.netdev_max_backlog = 3000
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

Praksis: Fra baseline til målbart overskud

Jeg starter hver tuning med en Baseline og dokumenterer nøgletal som P95-latency, throughput og fejlrate. Derefter ændrer jeg nogle få parametre, indlæser profilen og måler igen med ab, wrk eller sysbench. Hvis latenstiden falder, registrerer jeg ændringen; hvis den stiger, ruller jeg den tilbage. Sådan opbygger jeg en hostingprofil, der svarer til min applikation. Til sidst verificerer jeg igen under produktionsbelastning, før jeg lader værdierne være permanente.

# Gem den aktuelle status
sysctl -a > /root/sysctl-baseline.txt

# Se netværksparametre
sysctl -a | grep -E 'net\.core|net\.ipv4'

# Genindlæs profiler
sysctl --system

Sammenligningstabel: Standard- vs. hostingprofil

Det følgende Bord viser praktiske startværdier, som jeg ofte bruger. Værdierne afhænger af arbejdsbyrde, netværk og hardware. Jeg starter med dette, tjekker målingerne og justerer trin for trin. Hvis der er problemer, går jeg tilbage til standardværdierne og øger dem igen i små trin. På den måde minimerer jeg risici og opnår ensartede resultater.

Parametre Standard Hosting-profil Fordel
net.core.somaxconn 128 65535 Flere accepterede forbindelser
net.ipv4.tcp_max_syn_backlog 1024 4096 Færre dråber med toppe
vm.swappiness 60 10 Mindre udskiftning under belastning
kernel.pid_max 32768 4194304 Flere processer/medarbejdere mulige
vm.dirty_ratio 30 20 Mere jævn skrivning

Undgå almindelige fejl og overvåg

Jeg bruger ikke Ekstreme værdier, fordi de kan føre til timeouts, OOM-kills eller pakketab. Jeg tester ændringer i etaper, hver med en klar metrik og en kort observationsfase. Kritiske indikatorer er acceptkøens længde, TCP-retransmissioner, P95-latency, IO wait og swap in/out. Jeg bruger letvægtsagenter og dashboards til overvågning, så jeg hurtigt kan genkende tendenser. Efter kerneopdateringer tjekker jeg, om sysctl-profilerne stadig er gyldige, og genindlæser dem om nødvendigt.

Persistens, rækkefølge og fordeling

For at sikre, at profilerne forbliver reproducerbare, følger jeg indlæsningssekvensen i /etc/sysctl.d: Filer behandles leksikografisk. Jeg tildeler bevidst præfikser som 60-... eller 99-... for at sikre, at min hostingprofil tilsidesætter andre standardindstillinger. Forskelle mellem distributioner (Debian/Ubuntu vs. RHEL/Alma) påvirker normalt kun stier og standardværdier; sysctl -system indlæser altid /etc/sysctl.conf, /etc/sysctl.d/*.conf og leverandørfiler, hvis det er relevant. Efter større systemopdateringer tjekker jeg med sysctl -system -o (dry run afhængigt af versionen) eller sammenligner den indlæste effektive konfiguration med min skabelon for at undgå overraskelser.

# Eksempel: Sørg for en ren sekvens
sudo ls -1 /etc/sysctl.d
10-vendor.conf
50-defaults.conf
99-hosting.conf # overskriver alt før den

# adskiller effektivt indlæste værdier
sysctl -a > /root/sysctl-after.txt
diff -u /root/sysctl-baseline.txt /root/sysctl-after.txt | less

TCP-livscyklus og portstyring

Under stor belastning oprettes der mange kortvarige forbindelser. Jeg sætter ip_local_port_range så udgående forbindelser (f.eks. fra proxyer) ikke sidder fast i den kortvarige portgrænse. tcp_fin_timeout styrer, hvor længe sockets forbliver i FIN-WAIT-2. Med meningsfuld Keepalive-parametre lukker jeg døde sessioner hurtigere uden aggressivt at afbryde forbindelser. TIME_WAIT er normal og beskytter mod sene pakker; jeg reducerer den ikke blindt. tcp_tw_reuse hjælper primært på klientværter, på rene servere forbliver det normalt slået fra. Jeg lader tidsstempler og SACK være slået til, da de forbedrer ydeevnen og robustheden.

# Portinterval og TCP-livscyklus
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# Forsigtig med tcp_tw_reuse: kun nyttig til udgående klientbelastning
# net.ipv4.tcp_tw_reuse = 1

Hold IPv6 og nabotabeller stabile

Mange værter har i dag dual-stack-trafik. Jeg optimerer ARP/ND-tabellerne, så der ikke er nogen „neighbour table overflow“-meddelelser, især på proxyer eller noder med mange peers. Den gc_thresh-Jeg definerer tærskler, der matcher forbindelsesmatrixen. Jeg lader ICMPv6- og router add-indstillingerne være restriktive for servere, så ingen uønskede ruter inkluderes. For IPv4 er jeg også opmærksom på ARP garbage collection, så poster ældes i god tid, men ikke forsvinder for tidligt.

#-nabotabeller: mere generøse tærskler
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192

net.ipv6.neigh.default.gc_thresh1 = 1024
net.ipv6.neigh.default.gc_thresh2 = 4096
net.ipv6.neigh.default.gc_thresh3 = 8192

# ARP/ND-Aging konservativ
net.ipv4.neigh.default.gc_stale_time = 60

At tænke filbeskrivelser og backlogs sammen

En hyppig flaskehals er Filbeskrivelser. Hvis applikationer har tusindvis af sockets, passer fs.file-max (for hele systemet) og ulimit/nofile (pr. tjeneste) sammen. somaxconn øger listekøen, men hjælper kun, hvis webserveren selv får lov til at åbne flere FD'er, og acceptraten er høj nok. Jeg sørger for, at system- og servicegrænser er synkroniserede, ellers opstår der kunstige flaskehalse på trods af „store“ kernel backlogs.

# Tillad flere FD'er i hele systemet
fs.file-max = 2097152

# Service side (eksempel på systemd-enhed)
# [Service]
# LimitNOFILE=1048576

Dæmpning af UDP/QUIC-arbejdsbelastninger

Brug DNS, syslog, telemetri og QUIC (HTTP/3) UDP. Her skalerer jeg de globale socket-buffere og UDP-specifikke hukommelsesgrænser. Ved store, kraftige UDP-belastninger (som f.eks. telemetri-gateways) forhindrer dette udfald i modtagelsesstien. Jeg overvåger fejltællerne med ss -u -a og netstat -su og justerer gradvist maksimum. For QUIC er net.core.rmem_max/wmem_max også relevant, da userspace-stakke ofte når disse grænser via setsockopt.

# UDP-buffer og grænser
net.core.rmem_max = 268435456
net.core.wmem_max = 268435456
net.ipv4.udp_mem = 98304 131072 262144
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192

Angiv dirty writeback: Bytes i stedet for procenter

På systemer med meget RAM kan procentværdier føre til store, pludselige skylninger. Jeg foretrækker derfor at bruge vm.dirty_background_bytes og vm.dirty_bytes, for at definere absolutte øvre grænser. Det stabiliserer skrivehastigheden og udjævner ventetiden, især med HDD'er eller blandede arbejdsbelastninger. Jeg overvejer også vm.min_fri_kbytes moderat, så kernen har nok ledig hukommelse til burst-allokeringer.

# Eksempel: absolutte dirty-grænser (ca. 1G baggrund, 4G hård)
vm.dirty_background_bytes = 1073741824
vm.dirty_bytes = 4294967296
vm.min_free_kbytes = 65536

Fordel RPS/RFS og netværkets IRQ-belastning

Ved høje PPS-hastigheder kan en enkelt CPU-kerne hænge på NIC-IRQ'en. Jeg bruger Receive Packet Steering (RPS) og om nødvendigt Receive Flow Steering (RFS) til at fordele pakkebehandlingen på flere kerner. Globalt indstiller jeg net.core.rps_sock_flow_entries, Den faktiske allokering sker pr. kø via sysfs. Dette reducerer CPU-hotspots, forbedrer cache-lokaliteten og reducerer latenstidstoppe. I kombination med net.core.netdev_max_backlog resulterer dette i en mere robust pipeline.

# Globale flowindgange for RPS
net.core.rps_sock_flow_entries = 32768

# Bemærk: Indstilling pr. kø via /sys/class/net//queues/rx-*/rps_cpus
# og rps_flow_cnt, afhængigt af NIC og antal køer.

Containere, navneområder og VM'er

Beholdere rummer mange net.*-Værdier navngivet og kan anvendes pr. netværksnavnerum. Jeg dokumenterer derfor, om jeg tilpasser host- eller pod/container-netværket. Orchestratorer tillader ofte kun en sikker liste af sysctls; værdier som kernel.pid_max forbliver på host-siden. På VM'er tjekker jeg, hvilke virtuelle NIC'er og offloads der er aktive (virtio, ENA), fordi offloads og MTU har stor indflydelse på bufferkrav og cwnd-udvikling. NUMA-tunge bare-metal-værter har gavn af deaktiverede vm.zone_reclaim_mode og bevidst CPU/IRQ-affinitetslayout.

# Undgå NUMA-bivirkning
vm.zone_reclaim_mode = 0

Et overblik over Conntrack og stateful firewalls

Hvis værten kører som en NAT/firewall eller er vært for mange containere med egress NAT, skalerer jeg nf_conntrack-tabel. Hash-tabeller, der er for små, genererer drops og høje ventetider under tabelscanninger. Jeg måler udnyttelsen med nstat og ser på „forventet“ vs. „i brug“. For rene webservere uden NAT er conntrack ofte ukritisk eller endda deaktiveret; på gateways skal den inkluderes i tuningspakken.

# Conntrack-størrelse (kun hvis den bruges aktivt!)
net.netfilter.nf_conntrack_max = 1048576

Robusthed over for angreb og uregelmæssigheder

Hjælp med bot-trafik og scanninger tcp_syncookies og konservative ICMP/omdirigeringsindstillinger. Syncookies redder håndtrykket i tilfælde af overfyldte SYN-køer uden at begrænse den legitime trafik for meget. Jeg deaktiverer redirects og source routes på servere, der ikke skal rootes. Disse hærdningsforanstaltninger er lette og supplerer de ovennævnte beskyttelsesmekanismer.

# SYN flood-forsvar og konservativ routing-adfærd
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

Uddyb målepraksis: Hvad jeg tjekker regelmæssigt

For at få reproducerbare resultater måler jeg konsekvent før og efter ændringer. På netværkssiden bruger jeg ss -s, ss -ti, nstat og netstat -s til at se kø-længder, retransmissioner og sack-statistikker. På memory I/O-siden hjælper vmstat, iostat og pidstat med at kategorisere dirty flushes, context switches og CPU-ventetider. Jeg kigger også på belastningstests:

  • Acceptkø (LISTEN) og SYN-kø: Droppet vs. overløb
  • Pacing/throughput pr. forbindelse og cwnd-udvikling
  • P95/99-forsinkelser i A/B-sammenligning, i stedet for bare gennemsnit
  • Swap in/out-rate og page cache hit rate
  • IRQ-belastningsfordeling og længder på kørekøer per CPU
# hurtige statustjek
ss -s
netstat -s | egrep 'listen|SYN|retran|dropped'
vmstat 1 10
pidstat -w -u -r 1 5

Eksempel: Konsolideret hostingprofil

Til at begynde med kombinerer jeg grundlæggende og udvidede værdier i én fil. Derefter øger jeg i små trin, hver med klare målepunkter. De følgende værdier er et konservativt, men højtydende udgangspunkt for travle webservere og proxyer.

sudo tee /etc/sysctl.d/99-hosting.conf >/dev/null <<'EOF'
Grundlæggende om #-netværk
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 4096
net.core.netdev_max_backlog = 3000
net.core.optmem_max = 81920

# TCP-buffere og -porte
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5

# UDP/QUIC
net.core.rmem_max = 268435456
net.core.wmem_max = 268435456
net.ipv4.udp_mem = 98304 131072 262144
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192

# nabotabeller
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192
net.ipv6.neigh.default.gc_thresh1 = 1024
net.ipv6.neigh.default.gc_thresh2 = 4096
net.ipv6.neigh.default.gc_thresh3 = 8192
net.ipv4.neigh.default.gc_stale_time = 60

#-sikkerhed
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Hukommelse/VM
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_bytes = 1073741824
vm.dirty_bytes = 4294967296
vm.min_free_kbytes = 65536
vm.overcommit_memory = 1
vm.zone_reclaim_mode = 0

# CPU/Processer
kernel.pid_max = 4194304
kernel.sched_cfs_bandwidth_slice_us = 5000

# RPS
net.core.rps_sock_flow_entries = 32768

# FD'er
fs.file-max = 2097152
EOF

sudo sysctl --system

Resumé: Tuning som en tilbagevendende proces

Målrettet Indstilling af kernen med sysctl giver klare effekter i hosting: kortere svartider, højere throughput-værdier og konstante tjenester. Jeg starter med grundlæggende netværksfunktioner som somaxconn og tcp_max_syn_backlog og tager mig derefter af hukommelsen med swappiness og dirty_ratio. Derefter optimerer jeg PID'er og schedulere og hærder værten med dmesg_restrict, kptr_restrict og rp_filter. Jeg måler alle ændringer, dokumenterer dem og holder øje med metrics. Trin for trin opretter jeg en profil, der betjener mine workloads effektivt og har reserver til trafikspidser.

Aktuelle artikler