Áno, aj v ére GNS3/Eve-ng ešte používame Dynamis/dynagen ako super CLI riešenie pre beh overených monolitických IOS
Na našom serveri / LXC kontajneri však pozorujeme “zamŕzanie” TCP relácii, ktoré sa prejavuje výpadkom telnet pripojenia na konzolu zariadenia na cca 10minut.
Server spravuje veľké množstvo interných topológií, aktuálne beží v danom čase desiatky Dynagen hypervizorov, ktoré obsluhujú cca 400 smerovačov a zároveň obsluhuje do 50 študentov. Zdá sa, že je vhodné a potrebné optimalizovať systémové a sieťové nastavenia, aby sa zabezpečila stabilita a výkon. Tu je konfigurácia ktorú testujem pre náš server či LXC kontajner:
1.Zvýšenie limitu otvorených súborov (file descriptors)
Server bude potrebovať veľké množstvo otvorených súborov (file descriptors) pre sieťové spojenia a virtuálne zariadenia.
* soft nofile 262144
* hard nofile 524288
Upraviť v /etc/security/limits.conf:
Upraviť /etc/sysctl.conf:
fs.file-max = 1048576
Aplikovať zmeny: sudo sysctl -p
2. Optimalizácia TCP nastavení
Optimalizácia TCP nastavení pomôže zvládnuť viac sieťových spojení a zabrániť problémom, ako sú straty paketov alebo oneskorenia.
Upraviť /etc/sysctl.conf:
net.core.somaxconn = 2048
net.core.netdev_max_backlog = 10000
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 5
Aplikovať zmeny: sudo sysctl -p
3. Možno do budúcna – Optimalizácia sieťových rozhraní
Pre vysokú sieťovú záťaž odporúčam optimalizovať sieťové rozhrania.
Upraviť /etc/sysctl.conf:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
Aplikovať zmeny: sudo sysctl -p
Teória okolo
1) Zvýšenie limitu pre počet otvorených súborov:
Skontroluj limit príkazom:
ulimit -n VALUE
Výpis otvorených súborov a počet podporovaných file descriptorov:
cat /proc/sys/fs/file-nr
Tento príkaz vypíše tri čísla:
- Prvé číslo: Počet aktuálne alokovaných file descriptorov (otvorených súborov).
- Druhé číslo: Počet nepoužitých file descriptorov.
- Tretie číslo: Maximálny počet file descriptorov, ktoré systém podporuje (hodnota fs.file-ma
or celkový počet otvorených súborov pre všetky procesy v systéme
lsof | wc -l
Nastaviť počet:
Nastav neperzistentne:
ulimit -n 131072
Nastav perzistentne:
- Nastavenie limitu v /etc/security/limits.conf:
Uprav súbor /etc/security/limits.conf a pridaj nasledujúce riadky pre používateľa alebo skupinu, ktorá beží na serveri. Ja nastavujem na:
- * soft nofile 262144
- * hard nofile 524288
- soft nofile: Aktuálny limit, ktorý môže používateľ zvýšiť.
- hard nofile: Maximálny limit, ktorý nemôže byť prekročený.
- * – vsetci používatelia or nahraď menom
- Nastavenie systémového limitu v /etc/sysctl.conf:
Uprav súbor /etc/sysctl.conf a pridaj nasledujúci riadok:
fs.file-max = 2097152
Tento parameter nastavuje maximálny počet otvorených súborov pre celý systém. Hodnota 2097152 je bežne používaná pre serverové prostredia.
Po úprave aplikuj zmeny príkazom:
sudo sysctl -p
2) Nastavenie TCP keepalive:
Aktivujem TCP keepalive, aby sa zabránilo tomu, že neaktívne spojenia zostanú otvorené príliš dlho. Robím pridaním nasledujúcich riadkov do /etc/sysctl.conf:
Potom použi príkaz sysctl -p, aby sa zmeny prejavili.
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 5
Teória:
Čo robí TCP keepalive?
TCP keepalive je mechanizmus, ktorý periodicky kontroluje, či je druhá strana spojenia stále aktívna. Ak nie, spojenie sa uzavrie. Toto je dôležité pre:
- Uvoľnenie zdrojov: Uzavretie nepotrebných spojení uvoľní file descriptory a pamäť.
- Detekciu problémov: Zistenie, či druhá strana spojenia prestala reagovať (napr. kvôli výpadku siete alebo pádu servera).
- Parametre TCP keepalive:
V Linuxe sú tri hlavné parametre, ktoré ovplyvňujú správanie TCP keepalive:
net.ipv4.tcp_keepalive_time:
- Čas (v sekundách), po ktorom sa začnú odosielať keepalive pakety, ak spojenie nebolo aktívne.
- Predvolená hodnota: 7200 sekúnd (2 hodiny).
- Odporúčaná hodnota: 600 (10 minút).
net.ipv4.tcp_keepalive_intvl:
- Interval (v sekundách) medzi odoslaním jednotlivých keepalive paketov.
- Predvolená hodnota: 75 sekúnd.
- Odporúčaná hodnota: 60 (1 minúta).
net.ipv4.tcp_keepalive_probes:
- Počet keepalive paketov, ktoré sa majú odoslať, ký*m sa spojenie považuje za mŕtve.
- Predvolená hodnota: 9.
- Odporúčaná hodnota: 5.
3) Optimalizácia nastavení TCP:
Ďalšie nastavenia TCP v /etc/sysctl.conf:
Opäť použite príkaz sysctl -p, aby sa zmeny prejavili.
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
Teória
Tu je vysvetlenie, čo robia jednotlivé parametre a ako ich optimalizovať:
net.core.somaxconn = 1024
- Čo robí: Nastavuje maximálny počet požiadaviek na pripojenie (connection requests), ktoré môžu čakať v rade na prijatie (backlog) pre každý socket.
- Predvolená hodnota: Zvyčajne 128.
- Optimalizácia: Zvýšenie na 1024 alebo vyššie zlepšuje výkon serverov, ktoré spracúvajú veľké množstvo súčasných pripojení (napr. webové servery).
- Kedy použiť: Ak máte server s vysokou záťažou a často sa vyskytujú problémy s oneskorenými pripojeniami.
net.core.netdev_max_backlog = 5000
- Čo robí: Nastavuje maximálny počet paketov, ktoré môžu čakať v rade na spracovanie sieťovým rozhraním (interface), keď je systém zaneprázdnený.
- Predvolená hodnota: Zvyčajne 1000.
- Optimalizácia: Zvýšenie na 5000 pomáha predchádzať stratám paketov pri vysokom sieťovom zaťažení.
- Kedy použiť: Ak máte vysokú sieťovú prevádzku a často strácate pakety.
net.ipv4.tcp_max_syn_backlog = 2048
- Čo robí: Nastavuje maximálny počet neúplných TCP spojení (SYN packets), ktoré môžu čakať v rade na dokončenie (trojcestného handshake).
- Predvolená hodnota: Zvyčajne 128.
- Optimalizácia: Zvýšenie na 2048 alebo vyššie zlepšuje odolnosť servera proti SYN flood útokom a zvyšuje kapacitu pre súčasné pripojenia.
- Kedy použiť: Ak máte server, ktorý často prijíma veľké množstvo nových pripojení.
net.ipv4.tcp_fin_timeout = 30
- Čo robí: Nastavuje čas (v sekundách), po ktorom sa uzavrie TCP spojenie po odoslaní posledného paketu (FIN).
- redvolená hodnota: Zvyčajne 60 sekúnd.
- Optimalizácia: Zníženie na 30 sekúnd urýchľuje uvoľnenie zdrojov (file descriptorov a pamäte) pre neaktívne spojenia.
- Kedy použiť: Ak máte veľa krátkodobých TCP spojení a chcete rýchlejšie uvoľniť zdroje.
net.ipv4.tcp_tw_reuse = 1
- Čo robí: Umožňuje opätovné použitie TIME-WAIT socketov pre nové TCP spojenia, ak je to bezpečné.
- Predvolená hodnota: Zvyčajne 0 (vypnuté).
- Optimalizácia: Nastavenie na 1 znižuje počet socketov v stave TIME-WAIT a zlepšuje výkon pri vysokom počte krátkodobých spojení.
- Kedy použiť: Ak máte server, ktorý často vytvára a uzatvára veľa TCP spojení (napr. webové servery).
net.ipv4.tcp_tw_recycle = 1
- Čo robí: Umožňuje rýchlejšie uvoľnenie socketov v stave TIME-WAIT.
- Predvolená hodnota: Zvyčajne 0 (vypnuté).
- Optimalizácia: Nastavenie na 1 môže zlepšiť výkon, ale môže spôsobiť problémy v prostrediach s NAT (napr. za routerom).
- Kedy použiť: Len na serveroch, ktoré nie sú za NAT a majú veľa krátkodobých TCP spojení.
- Poznámka: Tento parameter sa nepoužíva v novších jadrách Linuxu (od 4.12), pretože môže spôsobovať problémy.