Çekirdek neden paketleri düşürsün?


49

Ben kesintiye tcpdumpile Ctrl+ Cve bu toplam özetini var:

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel

"Çekirdekten düşen paketler" nedir? Bu neden oluyor?


Benim durumumda -s0 seçeneğini kullanıyordum, -s1600 olarak değiştirdim (MTU'nun hemen üstünde) benim için çözdü.
LatinSuD

Yanıtlar:


48

Tcpdump kılavuzundan:

'`çekirdek tarafından bırakılan paketler' '(bu, işletim sistemi bu bilgileri uygulamalara bildirirse, tcpdump'ın çalıştığı işletim sistemi üzerindeki işletim sistemi paket yakalama mekanizması tarafından, arabellek alanı yetersizliğinden dolayı bırakılan paketlerin sayısıdır; değilse, 0 olarak bildirilecektir.

Biraz açıklama:

tcpdumpBir ağ arabirimi üzerinden geçen ham paketleri yakalar. Paketlerin komut satırında belirtilen kurallara göre ayrıştırılması ve filtrelenmesi gerekir ve bu biraz zaman alır, bu nedenle gelen paketlerin işlenmesi için arabelleğe alınması (sıraya alınır) gerekir. Bazen çok fazla paket vardır, bunlar bir ara belleğe kaydedilir, ancak işlenenden daha hızlı kaydedilir, bu nedenle arabellek alanı boşalır, böylece çekirdek arabellekte bir miktar boş alan alana kadar tüm diğer paketleri bırakır.

Tampon boyutunu aşağıdaki gibi -B( --buffer-size) seçeneğiyle artırabilirsiniz :

tcpdump -B 4096 ....

Boyutun kilobayt cinsinden belirtildiğine dikkat edin, bu nedenle yukarıdaki satır arabellek boyutunu 4 MB olarak ayarlar.


1
Ayrıca kasıtlı olarak kibi- / mebi- kilo- / mega- değiştirdim ve insanların kafasını karıştırmamak için libpcap hakkında bir kelime ihmal ettim.
Dmitry Vasilyanov

4
Ayrıca, tcpdump'ta "uzun seçenekler" desteğinin nispeten yeni olduğuna dikkat edin; Eski sürümlerde (arabellek boyutunu ayarlamayı desteklemeyen birçok eski sürüm hariç) yapabilirsiniz tcpdump -B 4096.

Başka bir not, büyük tamponların ayarlanması zaman alır. Tamponları çılgınca bir şeye ayarlarsanız, bu başlatma süresi sırasında paketleri (tcpdump bunları "çekirdek tarafından bırakılan paketler" olarak bildirir) kaçırabilirsiniz.
dgreene

26

Göz önünde bulundurulması / denenmesi tcpdumpgereken bir şey daha, IP'leri etki alanı adlarına çözümlemek için DNS sorguları yaparak çok fazla zaman harcamak olabilir. Bunlara ihtiyacınız yoksa, -n(arama yok) bayrağına atmayı deneyin . Örneğin:

tcpdump -n port 80

1
Bu bir kurtarıcıydı. Bir dosyaya dökerken tcpdump'ın çözünürlüğü tersine çevirdiğinin farkında değildim !! Kullanmam -nn -B 4096izin verdi0 packets dropped by kernel
Blanka

11

Göre man tcpdump:

çekirdek tarafından düşürülen paketler (bu, işletim sistemi bu bilgileri uygulamalara bildirirse, tcpdump'ın çalıştığı işletim sisteminde tcpdump'ın çalıştığı işletim sistemi üzerindeki paket yakalama mekanizması tarafından bırakılan paketlerin sayısıdır) 0 olarak bildirilecektir).

Çekirdek yakalanan paketleri sabit boyutlu yakalama arabelleğine koyar . Bu tcpdumparabellek yeterince hızlı bir şekilde boşaltılmazsa, çekirdek arabellekteki eski paketlerin üzerine yazmaya ve buna bağlı olarak bırakılan sayacı artırmaya başlar. Bu sayacın değeri "çekirdeğin düştüğü" olarak gördüğünüz değerdir.

Bu arada, şunları yapabilirsiniz yakalama tampon yeniden boyutlandırmak : Pass bir KiB boyutuyla seçeneği.tcpdump-B


2

Adam sayfasının söylediklerinin yanı sıra, paketlerin çekirdeğin neden düşmesine neden olabileceği bazı ek nedenler var. tcpdumpAğdaki tek trafiğin saniyede bir 512B paket PRBS olduğu yerden % 100 paket düşüşüyle ​​karşılaşıyordum . Açıkça arabellek alanı açıklaması burada bir anlam ifade etmiyor - çekirdeğin 0.5kiB / s kullanabileceğini düşünüyorum.

Dağıtımımla (Ubuntu 14.04) birlikte gelen bir şey, bağlantı paketinde test paketlerimi beğenmeyen bir çeşit akıllı filtreleme yapıyor olabilir. Geçici çözümüm şu şekilde yeni bir ağ ad alanı oluşturmaktı:

sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up

İç netnskabuğunda, daha önce sorun çıkaran işletim sistemi işlemleri ne olursa olsun resim dışında kalıyor ve tcpdumpgörmeyi beklediğim tüm paketleri gösteriyor.


1

Bu tcpdump -cseçeneği kullanarak yararlı buluyorum . Bu şekilde paket sayısını ayarlayabilir ve ardından durdurabilirsiniz; arabellek dolduramazsınız.

Örneğin bu, localhost'taki tcp isteklerini yakalayacaktır.

tcpdump -ni lo tcp -c 20
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.