Linux altında bir soketin ne kadar bellek tükettiğini belirleyen formül nedir?


11

Bazı kapasite planlaması yapıyorum ve sunucumda kaç tane TCP bağlantısı yapabileceğimi tahmin etmek için kullanabileceğim bir formül olup olmadığını merak ediyordum. Şu anda sadece bellek gereksinimleriyle ilgileniyorum.

Formülde görüneceğini düşündüğüm bazı değişkenler:

  • sysctl'ler net.ipv4.tcp_wmem(min veya varsayılan değer)
  • sysctl'ler net.ipv4.tcp_rmem(min veya varsayılan değer)
  • çorap, sock_common, proto ve diğer soket başına veri yapılarının boyutu.

Ne kadar tcp_wmem ve tcp_rmem gerçekten tahsis ve ne zaman bellek tahsis emin değilim. Soket oluşturma zamanında mı? Talep üzerine?

Yanıtlar:


2

Kaynak kodunu değiştirebiliyorsanız, RSS'yi ölçmek ve ölçüm sırasında kaç tane TCP bağlantısı olduğunu kaydetmek için rusage verilerini kullanın.

Kaynak kodu değiştirilemezse, ağ uygulamasının RSS'sini top veya ps tarafından bildirildiği şekilde kullanın ve ölçüm sırasında ağ bağlantılarının sayısını alın lsof -i.

Uygulamanız en yüksek yükte ilerlerken bu verileri her dakika toplayın ve bu verilerden RAM kullanımıyla bağlantı sayısını ilişkilendiren bir formül oluşturabilirsiniz.

Elbette ölçebileceğiniz çok daha fazla şey var, özellikle tcp veri yapılarının önceden tahmin edilebilir ve hesaplanabilir olmasına rağmen, çekirdek RAM kullanımını ölçmek isteyebilirsiniz. Her durumda, bu soruya bir göz /server/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server TCP ayarlama ve daha fazla bilgi için ağ yığınında neler olup bittiğine dair net bir görünüm elde etme.


Ölçümü vurguladığınız ve beni bu metrikleri nasıl toplayacağınızı gösteren bağlantılara yönlendirdiğiniz için teşekkür ederiz!
Tim Stewart

8

tcp_mem daha önemlidir çünkü tcp yığınının bellek kullanımı söz konusu olduğunda nasıl davranması gerektiğini tanımlar. IMO gönderme ve alma arabelleği, tcp_mem öğesinin katı olmalıdır. Alma tamponu için bir formülün bağlantısı: http://www.acc.umu.se/~maswan/linux-netperf.txt . Kısacası:

Genel gider: window / 2 ^ tcp_adv_win_scale (tcp_adv_win_scale varsayılanı 2) Yani alıcı penceresi için linux varsayılan parametreleri (tcp_rmem): 87380 - (87380/2 ^ 2) = 65536. Transatlantik bağlantı (150 ms RTT) verildi, maksimum performans şu şekildedir: 65536 / 0.150 = 436906 bayt / s veya yaklaşık 400 kbyte / s, bugün gerçekten yavaş. Artan varsayılan boyutla: (873800 - 873800/2 ^ 2) /0.150 = 4369000 bayt / s veya modern bir ağ için resonable olan yaklaşık 4Mbayt / s. Ve bunun varsayılan olduğunu unutmayın, eğer gönderen daha büyük bir pencere boyutuyla yapılandırılırsa, modern bir ağ için oldukça iyi olan 10 katına kadar mutlu olacaktır (8738000 * 0.75 / 0.150 = ~ 40Mbytes / s).

Makalenin tcp_mem hakkında söylediği şey:

Kaldırdığınız şey, tcp performansı için yapay bir sınırdır, bu sınır olmadan mevcut uçtan uca bant genişliği ve kaybı ile sınırlandırılırsınız. Böylece, uplink'inizi daha etkili bir şekilde doyurabilirsiniz, ancak tcp bunu ele almakta iyidir.

IMO'nun daha büyük bir orta tcp_mem değeri, daha az güvenlik kaybıyla bağlantıyı hızlandırır ve bellek kullanımını hafifçe artırır.

Ağ yığınını aşağıdakilerle izleyebilirsiniz:

grep skbuff /proc/slabinfo

1
Bilgilendirici yanıt için teşekkürler. Ağ hakkında ne kadar öğrenmem gerektiğini gösterir.
Tim Stewart

1

David, sorulan soruya çok iyi bir cevap verdi, ancak yalnızca LFN'leri kullanmadığınız sürece , o zaman olay tabanlı bir sunucuda bile, TCP arabelleklerinin bağlantı başına ayak izinin sadece küçük bir kısmı olması muhtemeldir.

Kapasite planlaması için sunucuyu test etmek ve bellek kullanımının yüke göre gerilemesini hesaplamak için bir alternatif yoktur.


Teşekkürler, basit bir formülün ne zaman harika olacağını, ancak ölçmeniz gereken zamanlar vardır.
Tim Stewart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.