当服务器出现丢包的时候,一定是因为什么原因导致的。我们如何分析丢包的原因。以下是我们想了解的内容:一个数据包进入您计算机的网络堆栈(RX)(例如,在端口8000上)。它在端口8000上的相应应用程序接收到它之前被丢弃。发送数据包(TX)。在从您的机器发送之前被丢弃。本文不关注“数据包在网络传输过程中丢失,让我们使用traceroute/通过计算TCP重传来诊断”(尽管这也很重要)!你怎么知道数据包是否被丢弃了?我在推特上询问并得到了非常有用的答案“看netstat-i!”Here'swhatIgotwhenIranitonmylaptop:bork@kiwi~>sudonetstat-iKernelInterfacetableIfaceMTUMetRX-OKRX-ERRRX-DRPRX-OVRTX-OKTX-ERRTX-DRPTX-OVRFlgdocker01500000000000BMUenp0s25150001235101024520600602155800021558000LRUnlmon0377605512620000000ORUItlookslikesomereceived(RX)数据包在enp0s25(我的无线网卡)上丢失了。但是没有TX丢包。我还被告知运行ethtool-S会有帮助,但我的ethtool没有-S选项。如何知道数据包被丢弃的原因谷歌搜索并发现了一个名为dropwatch的很棒的工具。没有开箱即用的Ubuntu安装包,但可以通过github下载:https://github.com/pavel-odintsov/drop_watch以下是我可以编译的说明:sudoapt-getinstall-ylibnl-3-devlibnl-genl-3-devbinutils-devlibreadline6-devgitclonehttps://github.com/pavel-odintsov/drop_watchcddrop_watch/srcvimMakefile#commentoutthe-Werrorargumenttogccmake这是输出!它告诉我哪个内核函数丢失了数据包,酷!sudo./dropwatch-lkasInitalizingkallsymsdbdropwatch>startEnablingmonitoring...KernelmonitoringactivIssueCtrl-Ctostopmonitoring1dropsattcp_v4_do_rcv+cd(0xffffffff81799bad)10dropsattcp_v4_rcv+80(0xffffffff8179a620)1dropsatsk_stream_kill_queues+57(0xffffffff81729ca7)4dropsatunix_release_sock+20e(0xffffffff817dc94e)1dropsatigmp_rcv+e1(0xffffffff817b4c41)1dropsatigmp_rcv+e1(0xffffffff817b4c41)使用性能监控丢掉的数据包还有一个很酷的方法来调试正在发生的事情。thomasgraf告诉我,你可以使用perf来监控kfree_skb事件,它会告诉你数据包何时被丢弃(内核堆栈发生的地方):sudoperfrecord-g-a-eskb:kfree_skbsudoperfscript英文原文:https://jvns.ca/blog/2017/09/05/finding-out-where-packets-are-being-dropped/本文作者JuliaEvans,娜娜翻译,转载转载请注明出处,技术原创和架构实践文章,欢迎访问通过公众号菜单联系我们“贡献。
