Bazı eski kernel sürümlerinde, TCP tıkanıklık kontrol algoritması olarak Bottleneck Bandwidth and Round-trip propagation time (BBR) kullanılırken fq qdisc zamanlayıcısı yapılandırılmamışsa bağlantı başına CPU yükü artar. Bu durum Redis veritabanları gibi iş yüklerinde ağ performansını düşürür. Bu konuda sorunun nedeni açıklanır ve üç çözüm sunulur.
Etkilenen sürümler
Bu sorun, tüm aşağıdaki koşulları sağlayan Elastic Compute Service (ECS) örneklerini etkiler:
Görüntü sürümü:
aliyun_2_1903_64_20G_alibase_20190619.vhdveya daha önceki bir sürümKernel sürümü:
kernel-4.19.48-14.al7veya daha önceki bir sürümYüksek CPU kullanımı ve yüksek paket iletim hızının aynı anda görülmesi
Neden
BBR etkin TCP tıkanıklık kontrol algoritması olarak kullanıldığında ancak ağ arayüzünün qdisc ayarı fq zamanlayıcısını kullanmıyorsa TCP yığını dahili yüksek çözünürlüklü zamanlayıcıya (hrtimer) geri döner. Bu durum bağlantı başına CPU kullanımını artırır.
Çözüm seçin
Ağ senaryonıza göre bir çözüm seçin:
| Senaryo | Çözüm |
|---|---|
| Örnek yalnızca iç ağ üzerinden trafik sunar | CUBIC'e geçin |
| Örnek İnternet üzerinden trafik sunar | qdisc ayarını fq olarak değiştirin |
| Her iki seçenek de uygun değil veya kalıcı bir düzeltme istiyorsunuz | Kernel'i yükseltin |
CUBIC'e geçin
CUBIC, yüksek bant genişliği ve düşük gecikme süresi gerektiren iç ağ ortamları için uygundur. CUBIC'e geçiş, fq zamanlayıcısı olmadan BBR kaynaklı hrtimer yükünü ortadan kaldırır.
-
Değişikliği hemen uygulayın.
sudo sysctl -w net.ipv4.tcp_congestion_control=cubic -
Değişikliği yeniden başlatmalarda kalıcı hale getirin.
echo "net.ipv4.tcp_congestion_control=cubic" | sudo tee -a /etc/sysctl.d/50-aliyun.conf -
Etkin algoritmayı doğrulayın.
sysctl net.ipv4.tcp_congestion_controlBeklenen çıktı:
net.ipv4.tcp_congestion_control = cubic
qdisc ayarını fq olarak değiştirin
İnternet'e açık trafik sunan örneklerde ağ arayüzünde fq zamanlayıcısını yapılandırmak, BBR'nin hrtimer geri dönüşüne olan ihtiyacı ortadan kaldırır. Bu sayede BBR etkin kalırken bağlantı başına CPU yükü azalır.
Aşağıdaki komut değişikliği yalnızca sonraki yeniden başlatmaya kadar uygular. Yapılandırmayı kalıcı hale getirmek için komutu bir başlangıç betiğine ekleyin veya qdisc ayarını ağ yapılandırma yönetim aracınız üzerinden kalıcı olarak yapılandırın.
<$DEV> ifadesini gerçek ağ arayüzü adı ile değiştirin (örneğin eth0).
sudo tc qdisc add dev <$DEV> root fq
Arayüzde fq qdisc'in etkin olduğunu doğrulayın.
tc qdisc show dev <$DEV>
Beklenen çıktı (kesin değerler farklılık gösterebilir):
qdisc fq 8001: root refcnt 2 limit 10000p flow_limit 100p ...
Kernel'i yükseltin
En son Alibaba Cloud Linux 2 kernel'ine yükseltmek bu sorunu kalıcı olarak çözer.
Kernel yükseltmeleri uyumluluk ve kararlılık sorunlarına neden olabilir. Yükseltme işleminden önce Alibaba Cloud Linux 2 sürüm notlarını inceleyin ve değişiklikleri üretim dışı bir ortamda test edin.
Örneği yeniden başlatmak hizmeti geçici olarak durdurur; bu durum çalışan hizmetleri kesintiye uğratabilir ve veri kaybına yol açabilir. Devam etmeden önce kritik verileri yedekleyin ve yeniden başlatma işlemini yoğun saatler dışında planlayın.
-
En son kernel sürümüne yükseltin.
sudo yum update kernel -
Yeni kernel'in etkili olması için örneği yeniden başlatın.
sudo reboot -
Örnek yeniden başladıktan sonra kernel sürümünü doğrulayın.
uname -rÇıktının
kernel-4.19.48-14.al7sürümünden daha yeni bir kernel gösterdiğinden emin olun.