Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kullanıcı Veri Birimi Protokolü (UDP), yönetilen AKS kümelerinde kullanılan bağlantısız bir protokoldür. UDP paketleri, veri aktarımından önce bağlantı kurmadıkları için herhangi bir teslim, güvenilirlik veya sipariş garantisi olmadan gönderilir. Bu, UDP paketlerinin birden çok nedenden dolayı kaybolabileceği, çoğaltılabildiği veya hedefe ulaşabileceği anlamına gelir.
Bu makalede, yüksek ağ trafiğine sahip olduğunuz durumlarda taşabilen küçük bir okuma arabelleğinden kaynaklanan UDP paket bırakma sorunlarını tanılama ve çözme işlemleri açıklanmaktadır.
Önkoşullar
- UDP tabanlı bir uygulama çalıştıran en az bir düğüm havuzu ve bir pod içeren bir AKS kümesi.
- Azure CLI yüklü ve yapılandırılmış. Daha fazla bilgi için bkz . Azure CLI'yi yükleme.
- Kubectl, AKS kümenize bağlanacak şekilde yüklendi ve yapılandırıldı. Daha fazla bilgi için bkz . Kubectl yükleme.
- AKS kümenize UDP paketleri gönderip alabilen bir istemci makinesi.
Sorun: UDP bağlantılarının paket bırakma oranı yüksek
UDP paket kaybının olası nedenlerinden biri, UDP arabellek boyutunun gelen trafiği işleyemeyecek kadar küçük olmasıdır. UDP arabellek boyutu, uygulama tarafından işlenmeden önce çekirdekte ne kadar veri depolanabileceğini belirler. Arabellek boyutu yetersizse, çekirdek arabellek kapasitesini aşan paketleri bırakabilir. Bu ayar düğümleriniz için sanal makine (VM) düzeyinde yönetilir ve varsayılan değer 1048576 bayt veya 1 MB olarak ayarlanır.
Not
20.04, 22.04 ve 24.04 hariç 24.10'un önceki Ubuntu sürümlerinde varsayılan UDP arabellek kapasitesi 212992 bayt veya 0,2 MB olarak ayarlanmıştır.
VM düzeyinde arabellek boyutlarına uygulanan iki farklı değişken vardır:
net.core.rmem_max = 1048576 bytes
: Yuva sahibinin açıkça ayarlayabildiği en büyük arabellek değeri.net.core.rmem_default = 1048576 bytes
: Bir değer açıkça ayarlanmazsarmem_max
sistemin arabelleği büyütebileceği üst sınır.
Arabelleğin yüksek trafik artışlarına hizmet verecek şekilde büyümesine izin vermek için arabellek boyutu değerlerini güncelleştirmemiz gerekir.
Not
Bu makalede Ubuntu Linux çekirdek arabellek boyutlarına odaklanılmaktadır. Linux ve Windows için diğer yapılandırmaları görmek istiyorsanız bkz . AKS düğüm havuzları için düğüm yapılandırmasını özelleştirme.
Tanılama
Geçerli UDP arabellek ayarlarını denetleyin
komutunu kullanarak
kubectl get nodes
düğümlerinizin listesini alın ve arabellek ayarlarını denetlemek istediğiniz düğümü seçin.kubectl get nodes
komutunu kullanarak seçtiğiniz düğümde bir hata ayıklama podunu
kubectl debug
ayarlayın. değerini, hata ayıklamak istediğiniz düğümün adıyla değiştirin<node-name>
.kubectl debug -it node/<node-name> --image=ubuntu --share-processes -- bash
Aşağıdaki
sysctl
komutu kullanarak venet.core.rmem_default
değişkenlerininnet.core.rmem_max
değerini alın:sysctl net.core.rmem_max net.core.rmem_default
Gelen UDP trafiğini ölçme
Arabelleğinizin uygulamanız için çok küçük olup olmadığını denetlemek ve paketleri bırakmak için podlarınızda gerçekçi ağ trafiğinin benzetimini yaparak ve gelen trafiği izlemek için bir hata ayıklama pod'unu ayarlayarak başlayın. Ardından, gelen UDP trafiğini ölçmek için aşağıdaki komutları kullanabilirsiniz.
Aşağıdaki
cat
komutu kullanarak test çalışırken UDP dosyasını denetleyin:cat /proc/net/udp
Bu dosya, sütun altındaki geçerli açık bağlantıların istatistiklerini
rx_queue
gösterir. Geçmiş verileri göstermez.Snmp dosyasını denetleyin ve aşağıdaki
cat
komutu kullanarak test öncesi ve sonrası değerini karşılaştırınRcvbufErrors
:cat /proc/net/snmp
Bu dosya, udp paketlerinin tarihe kadar olan ömrünü gösterir ve sütuna
RcvbufErrors
kaç paket bırakıldığını gösterir.
veya değerindeki arabellek boyutunun rx_queue
ötesinde bir RcvbufErrors
artış fark ederseniz, arabellek boyutunuzu artırmanız gerekir.
Not
Uygulamanız gelen paket hızına ayak uyduramıyorsa sistem arabelleği boyutunu artırmak etkili olmayabilir. Bu durumda sistem arabelleği boyutunun artırılması yalnızca paket bırakma işlemini geciktirdi. Bu gibi durumlarda UDP paketlerini nasıl işlediğine ilişkin uygulamanızı incelemeyi ve geliştirmeyi göz önünde bulundurmalısınız. Daha büyük bir arabellek boyutu yalnızca bazen arabelleği dolduran ani trafik artışları olduğunda kullanışlıdır, bu da çekirdeğe isteklerdeki artışla başa çıkmak için daha fazla zaman/kaynak sağlar.
Azaltmak
Not
Çekirdek, paketler geldiğinde her yuva için okuma arabelleklerini önceden ayırmak yerine dinamik olarak ayırır. rmem_default
ve rmem_max
ayarları, paket kaybı gerçekleşmeden önce her yuva için çekirdek arabellek sınırlarını belirtir.
Düğüm havuzu oluşturma işlemi sırasında düğüm havuzu düzeyinde arabellek boyutu değerlerini değiştirebilirsiniz. Bu bölümdeki adımlar, Linux işletim sisteminizi yapılandırmayı ve değişiklikleri düğüm havuzundaki tüm düğümlere uygulamayı gösterir. Bu ayarı mevcut düğüm havuzuna ekleyemezsiniz.
Yerel makinenizde aşağıdaki içeriklere sahip bir
linuxosconfig.json
dosya oluşturun. Değerleri uygulama gereksinimlerinize ve düğüm SKU'nuza göre değiştirebilirsiniz. En düşük değer 212992 bayt ve en büyük değer 134217728 bayttır.{ "sysctls": { "netCoreRmemMax": 1572864, "netCoreRmemDefault": 1572864 } }
Dosyayla aynı dizinde olduğunuzdan
linuxosconfig.json
emin olun ve komutunu kullanarakaz aks nodepool add
arabellek boyutu yapılandırmasıyla yeni bir düğüm havuzu oluşturun.az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name $NODE_POOL_NAME --linux-os-config ./linuxosconfig.json
Bu komut, düğümdeki her yuva için maksimum UDP arabellek boyutunu 8 MB olarak ayarlar. Bu değerleri dosyada
linuxosconfig.json
uygulama gereksinimlerinize göre ayarlayabilirsiniz.
Doğrulama
Yeni değerleri uyguladıktan sonra, yeni değerlerin varsayılan olarak ayarlandığından emin olmak için VM'nize erişebilirsiniz.
komutunu kullanarak
kubectl get nodes
düğümlerinizin listesini alın ve arabellek ayarlarını denetlemek istediğiniz düğümü seçin.kubectl get nodes
komutunu kullanarak seçtiğiniz düğümde bir hata ayıklama podunu
kubectl debug
ayarlayın. değerini, hata ayıklamak istediğiniz düğümün adıyla değiştirin<node-name>
.kubectl debug -it node/<node-name> --image=ubuntu --share-processes -- bash
Aşağıdaki
sysctl
komutu kullanarak değişkeninnet.core.rmem_max
değerini alın:sysctl net.core.rmem_max net.core.rmem_default
Değerleriniz artık içinde
linuxosconfig.json
ana hatlarıyla belirtilen değerlere ayarlanmalıdır.
Özgün değerlere geri dön
Arabellek boyutunu varsayılan 1 MB değerine geri yüklemek istiyorsanız, dosyayı aşağıdaki değerlerle güncelleştirebilirsinizlinuxosconfig.json
:
{
"sysctls": {
"netCoreRmemMax": 1048576,
"netCoreRmemDefault": 1048576
}
}
Sonraki adımlar
Bu makalede, Azure Kubernetes Service'te (AKS) UDP paket bırakmalarını tanılamayı ve çözmeyi öğrendiniz. AKS'deki sorunları giderme hakkında daha fazla bilgi için Azure Kubernetes Service sorun giderme belgelerine bakın.
Azure Kubernetes Service