Pazar, Aralık 22, 2024

Gigabit Porta Sahip Linux Sunucuların Optimize Edilmesi

gigabit porta sahip sunucunun optimize edilmesi, sunucu optimizasyonu, network performans arttırma

Bu yazımda, Gbit/s veri aktarımlarını gerçekleştirmek için işletim sistemini nasıl yapılandırabileceğinizi anlatmaya çalışacağım.

Bir süredir 1 Gigabit ağ kartı kullanan firmalar vardı. (Türkiye’de hala %95 her yer 1 Gbit kullanır. İstisnalar hariç) Bahsettiğim oldukça yakın bir tarih değil ve yakın zamanda 10Gbit/s‘lik ağ kartlar kullanılmaya başlandı hem donanım tarafında hem de kullanıcı tarafında yüksek hızlara ulaşmak mümkün oldu. Bununla birlikte saniyede x Gigabit kullanmak çoğu zaman mümkün değildir.

network-temsili-gorsel

Son sistemlerde çeşitli bileşenlerin dikkatle ayarlanması gerekir böylece yüksek hızlara ulaşabilme imkânınız olabilir.

Aslında bu yazı TCP‘yi kullanarak veri aktarımını gerçekleştirmekle ilgili olsa da genel olarak diğer aktarım türleri içinde kullanılabilir. Mümkünse her zaman UDP veri aktarımlarını kullanarak testleri gerçekleştirin ve her şey yolunda ise TCP‘yi kullanın.


txqueuelen(the length of the transmit queue)

linux-network-kuyruk

interfaces üzerinde mevcut kuyruğu arttırıyoruz. Bu değeri kafamıza göre seçmiyoruz. Arayüzler için 1000 ila 20000 arasında bir değer seçmeniz önerilir. En iyi değerler 8000 ila 16000 bin arasında alınabilir. Yüksek hızlı bağlantınız varsa bunu aralığın en yüksek değeri olan 20000 çekmek gerekir.

ifconfig <interfaces-name> txqueuelen 20000
  1. Modem bağlantıları ve ISDN gibi yüksek gecikme süresi olan daha yavaş cihazlar için küçük bir değer.
  2. Büyük veri aktarımlarını gerçekleştiren yüksek hızlı Internet bağlantılarına bağlı sunucular için yüksek değer önerilir.
echo 'ifconfig ens3 txqueuelen 20000' >> /etc/rc.local

Yukarıdaki örnekte sistemin her açılışında txqueuelen(the length of the transmit queue) değerinin arayüz için 20000 seviyesine getirilmesi sağlayacaktır.


RPS(Receive Packet Steering)

devconf-redhat-rps-gorsel

IP adreslerinden ve port numaralarından bir karma oluşturur, paketin hangi CPU’ya ekleneceğini belirlemek için kullanılır.

Karmanın kullanımı, aynı veri akışı içerisinde olanlar için paketlerin gönderilmesini sağlar, performansı arttırmak için CPU’ya yardımcı olur.

up echo f > /sys/class/net/eth1/queues/rx-0/rps_cpus

Ayarlamaları yaparken kullanacağınız CPU değerleri ve onlara karşılık gelenler ise şu şekildedir;

Çekirdek Değer
0-3 f
8-15 ff00

Receive Flow Steering(RFS)

flow-steering-gorsel

CPU önbellek oranını artırmak ve ağ gecikmesini azaltmak içinde kullanılır.

Tek bir gönderenden alınan veriler birden fazla CPU’ya gönderilmez. Tek bir gönderenden alınan veri miktarı tek bir CPU’nun işleyebileceğinden daha büyükse, CPU için işlem miktarını azaltmak için daha büyük bir frame yapılandırın.(zaten aşağıda yapıyoruz)

Öntanımlı olarak gelen bu özelliği tamamen aktif etmek için ise, düzenlemeniz gereken 2 adet dosya bulunuyor.

echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt

eth0 adlı arayüzü kendi sisteminizdeki arayüz ile değiştirmeyi unutmayın. rps_sock_flow_entries değerinde girmiş olduğumuz 32768 değerinin 16 ya bölümünden elde ettiğimiz değeri rps_flow_cnt değerine giriyoruz.


Kernel Optimizasyonları

Kernel ayarlamaları topluca vermeyi tercih ediyorum. Ayarlar 1 Gbit/s ve Üstü interfaces kullananlar için düzenlenmiştir.

nano /etc/sysctl.conf

Dosya içerisine aşağıdaki ayarları ekleyin. Kayıt edip çıkın

net.ipv4.ip_forward = 0
net.ipv4.tcp_syncookies = 1
#net.ipv4.tcp_synack_retries = 2
#net.ipv4.tcp_syn_retries = 2
    
net.ipv4.conf.default.forwarding = 0 
net.ipv4.conf.default.proxy_arp = 0 
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0

kernel.sysrq = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1

net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432 
net.ipv4.tcp_wmem = 4096 65536 33554432  
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_fin_timeout = 4

vm.min_free_kbytes = 65536
net.ipv4.netfilter.ip_conntrack_max = 196608
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
net.netfilter.nf_conntrack_checksum = 0
net.netfilter.nf_conntrack_max = 196608 
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 15

net.nf_conntrack_max = 196608
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.ip_local_port_range = 1025 65530
net.core.somaxconn = 20480
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_timestamps = 0

Ayarlamaların geçerli olabilmesi için ise aşağıdaki komutu verin.

sysctl -p

Yukarıda bahsi geçen tüm ayarlamalar pratikte piyasadaki bütün nix sistemler de çalışacaktır. Red hat ve Debian tabanlı sistemlerde sorunsuz bir şekilde ayarlamaları kullanabilirsiniz.


Referanslar

RedHat Performance Tuning
Kernel Network Scaling