天天看点

当流量尖峰到达时,在 Linux 内核中解决网络问题当流量尖峰到达时,在 Linux 内核中解决网络问题

当流量尖峰到达时,在 Linux 内核中解决网络问题当流量尖峰到达时,在 Linux 内核中解决网络问题

几周前,我们开始注意位于华盛顿的追踪api的服务器网络流量有很大的变化。从一个相当稳定的日常模式下,我们开始看到300-400 mbps尖峰流量,但我们的合法的流量(事件和人为更新)是不变的。

当流量尖峰到达时,在 Linux 内核中解决网络问题当流量尖峰到达时,在 Linux 内核中解决网络问题

突然,我们的网络流量开始飙升像疯了似的。

找到虚假的流量来源是当务之急,因为这些尖峰流量正触发我们的上游路由器启动ddos减灾模式来阻止流量。

有一些很好的内置的linux工具帮助诊断网络问题。

ifconfig 会显示你的网络接口和多少数据包通过他们

ethtool -s 会显示你的数据包流的一些更详细的信息,象在网卡级丢弃的数据包的数量。

iptables -l -v -n 将显示你的各种防火墙规则处理数据包数。

sysctl -a | grep net.ip 将显示你所有kernel中网络相关的设置。

当流量尖峰到达时,在 Linux 内核中解决网络问题当流量尖峰到达时,在 Linux 内核中解决网络问题

此计数器的通常速率在未受影响的服务器上一般是 30-40 /秒,所以我们知道肯定是哪里出问题了。计数器表明我们正拒绝大量的包,因为这些包含有无效的 tcp 时间戳。临时的快速解决方案是用下面的命令关闭 tcp 时间戳:

<code>sysctl -w net.ipv4.tcp_timestamps=0</code>

在 mixpanel,每当我们看到异常流量模式的时候,我们一般也运行 tcpdump,这样我们能够分析流量,然后试图确定根本原因。我们发现大量的 tcp ack 数据包在我们的 api 服务器和一个特定的 ip 地址之间来回发送。结果我们的服务器陷入到向另一台服务器来来回回发送 tcp ack 包的无限循环里面。一个主机持续地发出 tcp 时间戳,但是另一主机却不能识别这是有效的时间戳。

我们将接受这个补丁而且将之移植到当前正在使用的ubuntu(trusty)内核当中。感谢ubuntu让这一切变得非常简单,重新编译修补过的内核仅仅只需要运行下面的命令,安装生成的.deb包并重启系统。

<code># 下载内核源代码并构建依赖</code>

<code>apt-get build-dep linux-image-3.13.0-45-generic</code>

<code>apt-get source linux-image-3.13.0-45-generic</code>

<code></code>

<code># 应用补丁</code>

<code>cd linux-lts-trusty-3.13.0/</code>

<code>patch -p1 &lt; mitigate-tcp-ack-loops.patch</code>

<code># 构建内核</code>

<code>fakeroot ./debian/rules clean</code>

<code>fakeroot ./debian/rules binary-headers binary-generic</code>

原文发布时间:2015-04-07

本文来自云栖合作伙伴“linux中国”

继续阅读