Soketler lsof tarafından bulundu ancak netstat tarafından bulunmadı


19

Görünüşe göre yuvaları açarak dosya tanımlayıcıları biten bir uygulama var, ama tam olarak bu yuvaların ne olduğunu bulamıyorum. Bunlar lsof çıktısında şu şekilde görünür:

java    9689 appuser 1010u  sock       0,5          263746675 can't identify protocol
java    9689 appuser 1011u  sock       0,5          263746676 can't identify protocol
java    9689 appuser 1012u  sock       0,5          263746677 can't identify protocol
java    9689 appuser 1014u  sock       0,5          263746678 can't identify protocol
java    9689 appuser 1015u  sock       0,5          263746679 can't identify protocol
java    9689 appuser 1016u  sock       0,5          263746681 can't identify protocol

ve / proc / $ PID / fd biçiminde

lrwx------ 1 appuser appuser 64 Jun 23 11:49 990 -> socket:[263732085]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 991 -> socket:[263732086]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 992 -> socket:[263735307]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 993 -> socket:[263732088]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 995 -> socket:[263735308]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 996 -> socket:[263735309]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 997 -> socket:[263745434]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 998 -> socket:[263745435]
lrwx------ 1 appuser appuser 64 Jun 23 11:49 999 -> socket:[263745436]

ancak benzer bir çıktı yok netstat -a.

Bu soketler nedir ve ne yaptıklarını nasıl öğrenebilirim?

Düzenleme : $ SOCKET örneğin 263746679 olduğu lsof SSS , grep $SOCKET /proc/nettavsiye edildiği gibi çalışmayı denedim , ama bu da sonuç vermedi.


Arka plan olarak, uygulama, diğerlerinin yanı sıra, ağ aramaları yapan birden çok görev için bir kapsayıcıdır. Çılgına döneni seçmeliyim, ama bu soketlerin kiminle iletişim kurduğunu öğrenene kadar sıkıştım.


Son zamanlarda .NET Core web uygulamalarımızdan biriyle (Kestrel'li Ubuntu sunucusu) bu sorunla karşı karşıyayız, ancak kaydedilen cihaz "protokol: TCP" adıyla "0,9". 0 ve 9 cihazlarının tam olarak ne olduğunu bulmaya çalışmanın zor olduğu kanıtlanmıştır. Ancak semptomların hepsi, bağlanma ve kullanma olmadan aynı yuvaları açma durumu gibi görünür.
icelava

Yanıtlar:


17

Bu, bir soket oluşturursanız, ancak asla sokete () veya bind () bağlamazsanız oluşabilir. En iyi seçeneğiniz, uygulamayı zorlamak (-fF) ve daha sonra soruna hangi soketlerin neden olduğunu belirlemek için lsof çıktısıyla çapraz referans olabilir. Hata ayıklama için bir bonus yöntemi olarak: soket çağrılarınızı hata ayıklama bilgileriyle sararsanız ve / dev / null dosyasına yazarsanız, size çok büyük günlük dosyaları vermeden şeritte görünür.


Teşekkürler, kulağa ilginç geliyor. Uygulamamızla durumun gerçekten böyle olup olmadığını bulmaya çalışacağım.
Robert Munteanu

1
Biraz aynı çizgi boyunca, çünkü bu Java strace kullanmak çok zor olabilir; üst (gerçek) JDK soketine iletmeden önce bilgileri kaydeden kendi soket alt sınıfınızı oluşturmak daha iyi bir yöntem olabilir. strace, yalnızca işletim sisteminin altında yatan Java çağrılarını görebilir ve bu soket çağrılarını gerçekte yapan şey için iş parçacıklarınızın içinde göremez, hepsini sarmak için büyük bir java topu gibi görünür.
troyengel

@troyengel: Byteman'ı ( jboss.org/byteman ) bu çağrıları izlemek için gereken bayt kodunu girmeme olanak tanıyan çok temiz bir araç keşfettim .
Robert Munteanu

En faydalı cevap, bu yüzden ödül alır. Teşekkürler!
Robert Munteanu

2

Python kullanarak, SSL soketlerinde aynı sorunla karşılaştım:

  • Socket.close () kullandığımda, yuva süresiz olarak CLOSE_WAIT durumunda kalır
  • socket.shutdown () kullandığımda, lsof "protokolü tanımlayamıyor" diyor

Çözüm kapanmadan önce SSL katmanının paketini açmaktı:

  • origsock = socket.unwrap ()
  • origsock.close ()

Bu, uygulamamdaki yuvaları düzgün bir şekilde kapatır.


1

Dosya tanımlayıcı sınırınız varsa ilk yapacağım şey incrase.

~# vi /etc/sysctl.conf
fs.file-max = 331287

Daha sonra sisteminizin güncel olduğundan emin olurum, bu tüm kütüphaneleri ve sunucuları içerir. Java uygulama sunucunuzun güncel olmaması mümkündür (eğer kullanıyorsanız). Ayrıca uygulama sunucunuzun yanlış yapılandırılmış olması, yapılandırma dosyanıza bakmanız connectionTimeoutve ve / veya maxKeepAliveRequestscihazınızı düşürmeniz (hangi uygulama sunucusunu kullandığınızdan veya hiç kullanmıyorsanız ...) emin değilsiniz.

Bu uygulamanın ne yaptığından emin değilim, ancak on binlerce soket gerektirdiğini düşünmüyorsanız, bu neredeyse kesinlikle Java uygulamanızda bir "dosya tanımlayıcı sızıntısı" dır . Satıcıya bir hata raporu göndermeniz gerekebilir. Bu hata raporuna, sorunun nasıl yeniden oluşturulacağı hakkında bilgi eklemelisiniz.

İşte sorunu ayıklamanın bazı yolları.

Wireshark (veya klips için twireshark), bu soketlerin nasıl kullanıldığını görmek için en iyi araçtır. Wireshark, telin üzerine atılan trafik türünün bir dökümünü verecektir. İlk birkaç bağlantının başarılı olması ve daha sonra dosya tanımlayıcı sınırına ulaşması muhtemeldir. Dosya tanımlayıcı sınırına ulaşıldıktan sonra Wireshark hiçbir şey almaz (ve daha neater bu konuda netstattır), ancak bu sorunu daraltmaya yardımcı olacaktır. Giden SYN'lerin gönderildiği bir durum olabilir, ancak hiçbir SYN / ACK alınmamaktadır, bu nedenle çok sayıda tcp bağlantısı SYN_WAIT durumunda kalmıştır.

Kaynak koda erişiminiz varsa ve yaratılan soket türünü biliyorsanız (strace kullanmak veya sadece kodu aramak gibi) projeyi Eclipse'de (veya başka bir IDE) açabilir ve işlevde bir kırılma noktası ayarlayabilirsiniz. bu soketleri yaratıyor. Kesme noktası vurulduğunda, yığın izlemesine bakabilirsiniz. Bu dosya tanımlayıcı sızıntısı basit bir sonsuz döngü olabilir ya da yuva zaman aşımı değeri çok büyük olabilir. Başka bir olasılık, java uygulaması socket.close()bağlantıları temizlemek için bir yapmıyor olmasıdır . Kapatma yapmak genellikle bir finelyblokta yapılır try/catch(Evet, bir soketin her zaman Java'da bir try / catch olması gerekir veya oluşturmaz :). Günün sonunda, Java uygulamasının IOException kurallarını düzgün işlememesi muhtemeldir.


Cevap için teşekkürler. Aslında bu uygulamayı - konteyner kısmı - sadece yönetmek yerine geliştiriyorum ve kapalı olmayan soketlerle ilgili herhangi bir sorun bulamadım. Ama wireshark / twireshark ipucu iyi, bunu kullanacağım.
Robert Munteanu

@Robert Munteanu Bu uygulamayı inşa ediyorsanız, bu stackoverflow için bir sorudur. Asla daha az soket açıyorsunuz.
Kale

Rook: Ben kod bilge bulmaktan vazgeçtim ve bir sysadmin olarak izlemeye çalıştım. Bu yüzden SF'de yayınladım. Ve evet, bir şekilde çok fazla soketin açık olduğunu biliyorum. Ama nerede olduğu hakkında sıfır ipucu var ...
Robert Munteanu

@Robert Munteanu Yuva oluşturulduktan sonra kırılma noktaları ayarlamanız ve bu noktada yığın izlemesine ve belleğe bakmanız gerekir. Sonsuz bir döngüye düştüğünden şüpheleniyorum. Kodunuz böyle karmaşık sorunlar için en iyi yaklaşım olsa da, herhangi bir değişken ve adım bakmak mümkün olmak.
Kale

Kale maalesef bu, 20 sunucudan birinde - her zaman aynı değil - sadece üretim ortamlarında ve belki de haftada iki kez rastgele görünüyor. Aksi takdirde parmaklarını çıkarmak oldukça kolay olurdu. Şu anda Byteman'ı ( jboss.org/byteman ) soket oluşturma / bağlama / bağlama / kapatma çağrılarını izlemek için kullanıyorum . Umarım bundan bir şey gelir.
Robert Munteanu
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.