Bagaimana Anda mendiagnosis kehilangan paket?

27

Saya menyadari ini sangat subyektif dan tergantung pada sejumlah variabel, tapi saya bertanya-tanya langkah apa yang kebanyakan orang lalui ketika mereka perlu mendiagnosis paket loss pada sistem yang diberikan?

KushalP
sumber
Apa itu "sistem"? Apakah maksud Anda bahwa Anda memiliki satu server (atau desktop) yang mengalami kehilangan paket? Atau apakah itu segmen seluruh jaringan? Bagaimana Anda mendiagnosis ini sebagai packet loss (yang saya asumsikan maksud Anda disebabkan oleh jaringan) dan bukan, misalnya, kinerja yang buruk pada server aplikasi, kehabisan port sementara atau tumpukan Java atau jutaan kemungkinan lainnya?
mfinni
Saya menyadari ini adalah deskripsi masalah yang buruk. Anggap saja murni akademis dan hipotetis. Anggap itu paket loss, hanya ingin tahu langkah apa yang dilakukan sebagian besar insinyur.
KushalP

Jawaban:

29

Saya seorang insinyur jaringan, jadi saya akan menggambarkan ini dari sudut pandang saya.

Bagi saya, mendiagnosis kehilangan paket biasanya dimulai dengan "itu tidak berfungsi dengan baik". Dari sana, saya biasanya mencoba menemukan kit sedekat mungkin dengan kedua ujung komunikasi (biasanya, workstation di kantor dan server di suatu tempat) dan ping sedekat mungkin ke ujung lainnya (idealnya "titik akhir jarak jauh", tapi terkadang ada firewall yang tidak bisa saya kirim ping, jadi harus puas dengan antarmuka LAN pada router) dan lihat apakah saya bisa melihat kerugian.

Jika saya dapat melihat kerugian, biasanya merupakan kasus "bandwidth tidak cukup" atau "tautan dengan masalah" di suatu tempat di antara keduanya, jadi temukan rute melalui jaringan dan mulai dari tengah, yang biasanya memberi Anda satu ujung atau yang lain.

Jika saya tidak dapat melihat kerugian, dua langkah selanjutnya cenderung menjadi "kirim ping lebih banyak" atau "kirim ping lebih besar". Jika itu tidak seperti memberi indikasi tentang apa masalahnya, sekarang saatnya untuk mulai melihat kebijakan QoS dan statistik antarmuka melalui seluruh jalur antara titik akhir.

Jika itu tidak menemukan apa-apa, sekarang saatnya untuk mulai mempertanyakan asumsi Anda, apakah Anda benar-benar menderita kehilangan paket. Satu-satunya cara yang pasti untuk menemukan itu adalah dengan melakukan penangkapan simultan di kedua ujungnya, baik dengan menggunakan WireShark (atau setara) pada host atau dengan menghubungkan mesin sniffer (mungkin menggunakan WireShark atau yang serupa) melalui keran jaringan. Kemudian datang kesenangan membandingkan dua paket menangkap ...

Kadang-kadang, apa yang dikaitkan dengan "packet loss" hanyalah sesuatu di sisi server terasa lebih lambat (seperti, katakanlah, memindahkan database dari "pada LAN yang sama" ke "20 ms jauhnya" dan menggunakan pertanyaan yang membutuhkan banyak sekali bolak-balik antara front-end dan database).

Vatine
sumber
+1. Menjadi insinyur jaringan dukungan pelanggan, saya biasanya mengikuti jalur ini juga.
petrus
1
@Vatine Akan menyenangkan untuk memiliki beberapa contoh kode sehingga dapat mempraktekkannya tanpa harus mencari perintah & opsi ...
Philippe Gachoud
11

Dari perspektif sistem Linux, pertama-tama saya akan mencari packet loss pada antarmuka jaringan ethtool -S ethX.

Sebagian besar waktu, meningkatkan buffer cincin dengan ethtool -G ethX rx VALUEmenyelesaikan ini.

Terkadang interupsi tidak menyeimbangkan karena sistem kehilangan layanan irqbalance, jadi lihat chkconfig(EL) atau update-rc(Debuntu) untuk melihat apakah layanan ini berjalan. Anda dapat mengetahui apakah interupsi tidak menyeimbangkan karena /proc/interruptshanya akan menampilkan Core 0 yang melayani semua saluran IRQ.

Gagal ini, Anda mungkin perlu meningkatkan net.core.netdev_max_backlogjika sistem melewati lebih dari beberapa gigabit lalu lintas, dan mungkin net.core.netdev_budget.

Jika itu tidak berhasil, Anda bisa mengubah nilai penggabungan interupsi dengan ethtool -C.

Jika tidak ada tetes paket pada antarmuka jaringan, lihat netstat -sdan lihat apakah ada penurunan dalam buffer soket, ini akan dilaporkan dengan statistik seperti " pruned from receive queue" dan " dropped from out-of-order queue".

Anda dapat mencoba meningkatkan buffer soket default dan maks untuk protokol yang sesuai (misalnya: net.ipv4.tcp_rmemuntuk TCP).

Jika aplikasi menetapkan ukuran buffer socket sendiri, maka aplikasi mungkin perlu perubahan konfigurasi. Jika aplikasi Anda memiliki ukuran buffer soket hard-coded, komplain ke vendor aplikasi Anda.

Secara pribadi saya tidak suka protokol offloading ke NIC (checksumming, segmentasi offload, besar menerima offload) karena tampaknya menyebabkan lebih banyak masalah daripada nilainya. Bermain-main dengan pengaturan ini menggunakan ethtool -Kmungkin layak dicoba.

Lihatlah opsi modul untuk NIC Anda ( modinfo <drivername>) karena Anda mungkin perlu mengubah beberapa fitur. Untuk memberikan satu contoh yang saya temui, menggunakan Intel Flow Director pada sistem yang menangani satu aliran TCP besar mungkin akan membahayakan efisiensi aliran itu, jadi matikan FDir.

Di luar itu Anda masuk ke sistem tuning khusus ini untuk beban kerjanya yang spesifik, yang saya kira berada di luar cakupan pertanyaan Anda.

suprjami
sumber
4

Saya akan mulai dengan menggunakan alat penangkap paket seperti: wireshark (di Windows) dan tcpdump (di terminal Linux).

Saya juga akan memeriksa konfigurasi firewall (firewall host serta firewall jaringan).

Khaled
sumber
3

Isolasikan, lalu hilangkan.

Temukan subset jalur terkecil dengan masalah. Lakukan ini dengan menguji berbagai kombinasi dan / atau menyaring laporan pengguna. Jangan lupa faktor waktu dalam persamaan. Mungkin hanya packetloss di semua lalu lintas ke jaringan tertentu, atau mungkin hanya klien nirkabel yang menderita. Memperhitungkan jenis lalu lintas yang berbeda (batas tarif untuk ping). Temukan cara yang paling andal dan mudah diulang untuk mengujinya.

Kemudian hilangkan penyebab potensial. Kurangi lalu lintas pada tautan (sementara), hapus sumber gangguan dari spektrum, putuskan sambungan klien tertentu. Akhirnya Anda akan menemukan sumber masalahnya.

Anda kadang-kadang dapat mengambil jalan pintas dengan melihat dump paket atau menebak (itu selalu lebih baik). Juga, beri tahu profesor serverfault Anda hebat.

Joris
sumber
Ini "Basmi" dan bukan "Hilangkan".
Andrew Smith
0

Ping tidak dapat menampilkan paket loss kecuali Anda mengirim ping besar! Saya mengalami kehilangan paket di jaringan saya yang tidak terlihat sampai saya meningkatkan ukuran paket ping saya.

Untuk windows:

ping -n 30 -l <largevalue> <target>

Karena largevaluesaya menggunakan 40.960 (paket 40k)

Karena targetsaya menggunakan beberapa alamat IP pertama daritracert google.com

(yang merupakan router & modem kabel saya). Salah satu perangkat lebih jauh ke bawah rantai mengalami kehilangan paket yang mengerikan (> 60%) untuk paket besar tetapi 0% untuk kecil. Saya memperbaikinya dengan menyalakannya kembali tetapi bisa juga berupa kabel atau sesuatu internal yang perlu diganti.

Jonathan
sumber