定位服务器数据丢弃包问题
當(dāng)某個服務(wù)器發(fā)生數(shù)據(jù)丟包時,它們肯定是由于某種原因。我們?nèi)绾蝸矸治鰹槭裁磾?shù)據(jù)包丟失。
以下是我們想要了解的情況:
一個數(shù)據(jù)包進(jìn)入您計算機的網(wǎng)絡(luò)堆棧( RX )(例如在端口 8000 上)。 在端口 8000 對應(yīng)的應(yīng)用程序接收之前被丟。
發(fā)送一個數(shù)據(jù)包( TX )。 在它從您的機器發(fā)出之前被丟。
本文不關(guān)注“數(shù)據(jù)包在網(wǎng)絡(luò)傳輸過程丟了,讓我們用 traceroute / 通過計數(shù) TCP 重傳進(jìn)行診斷”(雖然這也很重要)!
?
怎么知道數(shù)據(jù)包是否被丟棄?
我在 Twitter 上提問,得到了非常有用的答案 “看?netstat -i?!”這是我的筆記本電腦上運行得到的結(jié)果:
bork@kiwi~> sudo netstat -i Kernel Interface table Iface ? ? ? MTU Met ? RX-OK RX-ERR RX-DRP RX-OVR ? ?TX-OK TX-ERR TX-DRP TX-OVR Flg docker0 ? ?1500 0 ? ? ? ? 0 ? ? ?0 ? ? ?0 0 ? ? ? ? ? ? 0 ? ? ?0 ? ? ?0 ? ? ?0 BMU enp0s25 ? ?1500 0 ? 1235101 ? ? ?0 ? ?242 0 ? ? ? ?745760 ? ? ?0 ? ? ?0 ? ? ?0 BMRU lo ? ? ? ?65536 0 ? ? 21558 ? ? ?0 ? ? ?0 0 ? ? ? ? 21558 ? ? ?0 ? ? ?0 ? ? ?0 LRU nlmon0 ? ? 3776 0 ? ?551262 ? ? ?0 ? ? ?0 0 ? ? ? ? ? ? 0 ? ? ?0 ? ? ?0 ? ? ?0 ORU看起來有一些收到的( RX )數(shù)據(jù)包在 enp0s25 (我的無線網(wǎng)卡)上丟失了。 但是沒有 TX 包丟失。
有人也告訴我,運行?ethtool -S?會有幫助,但是我的 ethtool 沒有 -S 選項。
?
怎么知道為什么數(shù)據(jù)包被丟棄
通過谷歌搜索,發(fā)現(xiàn)一個很酷的工具叫 dropwatch 。 沒有現(xiàn)成的 Ubuntu 安裝軟件包,但可以通過 github 下載:?
https//github.com/pavel-odintsov/drop_watch
以下是我可以編譯的說明:
sudo apt-get install -y libnl-3-dev libnl-genl-3-dev binutils-dev libreadline6-dev git clone https://github.com/pavel-odintsov/drop_watch cd drop_watch/src vim Makefile # comment out the -Werror argument to gcc make這里是輸出! 它告訴我哪個內(nèi)核函數(shù)丟失數(shù)據(jù)包,酷!
sudo ./dropwatch -l kas Initalizing kallsyms db dropwatch> start Enabling monitoring... Kernel monitoring activated. Issue Ctrl-C to stop monitoring1 drops at tcp_v4_do_rcv+cd (0xffffffff81799bad) 10 drops at tcp_v4_rcv+80 (0xffffffff8179a620) 1 drops at sk_stream_kill_queues+57 (0xffffffff81729ca7) 4 drops at unix_release_sock+20e (0xffffffff817dc94e) 1 drops at igmp_rcv+e1 (0xffffffff817b4c41) 1 drops at igmp_rcv+e1 (0xffffffff817b4c41)用perf監(jiān)控丟棄的數(shù)據(jù)包
還有另一個很酷的方法,用來調(diào)試發(fā)生什么。
thomas graf 告訴我,可以使用 perf 監(jiān)視?kfree_skb?事件,這將告訴你什么時候丟棄數(shù)據(jù)包(內(nèi)核堆棧發(fā)生的地方):
sudo perf record -g -a -e skb:kfree_skb sudo perf script?
擴(kuò)展閱讀
還有這兩個很酷的文章:
監(jiān)控和調(diào)優(yōu)Linux網(wǎng)絡(luò)堆棧:接收數(shù)據(jù)
https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/
監(jiān)控和調(diào)優(yōu)Linux網(wǎng)絡(luò)堆棧:發(fā)送數(shù)據(jù)
https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/
文檔非常詳細(xì)。
如果您有更好的調(diào)試數(shù)據(jù)包丟棄的方法,請在本文末留言吧,所有讀者也都會感興趣。
英文原文:https://jvns.ca/blog/2017/09/05/finding-out-where-packets-are-being-dropped/
總結(jié)
以上是生活随笔為你收集整理的定位服务器数据丢弃包问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统重构的10点经验总结
- 下一篇: 京东到家基于netty与websocke