Unix / Linux

服务器端的tcp有大量TIME_WAIT怎么办

公司的群里讨论tcp的TIME_WAIT的问题。TIME_WAIT这个状态可是面试时经常问的知识点啊。

讨论的问题是,服务器执行主动关闭,出现了大量的tcp TIME_WAIT状态,吞吐量上不去,怎么办?

先说结论,针对我司的环境,启用port reuse不会有太大问题,或者更好的,把/proc/sys/net/ipv4/tcp_fin_timeout改小,改成1或者2。让TIME_WAIT只保持很短的时间。

再说理由:

首先,需要知道一个tcp会话由 src_ip, src_port, dest_ip, dest_port 四元组确定。
我们公司的IDC环境中, tcp的发起是TGW(腾讯内部用的一个反向代理)或者LVS proxy发起的,这样 src_ip 就固定了, dest_ip是你的服务器ip, port是服务器监听端口。这样只有 src_port 是可变化的,但port只有16个bits还不能用well-known ports,这样就更少了。

再说,主动关闭时,tcp连接需要进入TIME_WAIT状态,保持两倍MSL时长,是为了处理两种情况:
1) 让当前这个会话的迷路包在网路中消失。这样不会干扰到新建的会话。
2) 确保主动关闭方的FIN-ACK包,如果丢失的话,还能重发。
1981年的TCP RFC上把MSL设成两分钟,https://tools.ietf.org/html/rfc793
> Maximum Segment Lifetime, the time a TCP segment can exist in
> the internetwork system. Arbitrarily defined to be 2 minutes.
MSL设置这么长,因为以前的网络环境差啊。不过现在因为移动互联网,比较差的网络状态也是非常常见的。但RFC允许实现方减少MSL值。事实上腾讯用的tlinux中MSL肯定没有2分钟这么长。
但我们的服务器和TGW交互全都是在相对稳定光纤内网啊,外网用户是由TGW接入的。所以MSL没必要设得很大,一秒两秒就能让上述的两个可能性降到很低很低。

最后,我不同意某位同事说的connect时,线性遍历找port的说法。真实原因是确定tcp会话的四元组中只能改src_port,但src_port已经用完了,必须等服务器方对应TIME_WAIT结束。
如果抓包观察,当可立即建立tcp会话的port用完以后,proxy再调用connect去连接服务器。tcp连接发起方因为执行被动关闭,不需要经过长时间的TIME_WAIT状态,仍然能选到一个port number,假如是port 12345,然后发送SYN包到服务器,但服务器一查,四元组(src_ip, 12345, dest_ip, dest_port)在TIME_WAIT状态,所以一直不回复或者回复RST。

其实,在内网,tcp连接的双方都是确定的,就没必要用短tcp连接,上tcp长链接啊。最好是用消息中间阵,上zeromq多省心啊。

Be the first to comment - What do you think?  Posted by zausiu - October 20, 2017 at 14:03

Categories: Network, Unix / Linux   Tags:

Linux 如何知道有哪些硬件,该装哪个驱动

Linux 如何知道有哪些硬件,该装哪个驱动

公司明文不准安装虚拟机了,被查到就是死罪。于是我在自己的笔记本上安装了Debian Linux。

结果无线网卡识别不了~~

次奥~

怎么破呢?

这么破:

# lspci

该命令列出了所有PCI总线上的硬件设备,稍微看看就能看到自己的无线网卡了。

05:00.0 Network Controller: Atheros Communication Inc. AR9287 Wireless Network Adaptor (PCI-Express)(rev 01)

注意前面的坐标05:00.0,再到/sys下面找对应哪个驱动:

find /sys | grep drivers.*05:00.0

/sys/bus/pci/drivers/ath9k/0000:05:00.0

其实,还有更简单的办法:

#lspci -v 

就搞定了。

用lsmod 和 dmesg | grep ath9k 可以看到网卡对应模块的一些信息.

再编辑 /etc/network/interface

auto wlan0

iface wlan0 inet dhcp

wpa-ssid Tencent-FreeWiFi

wpa-psk xxxxxx

最后: iwconfig wlan up

搞定!!!

Be the first to comment - What do you think?  Posted by zausiu - July 23, 2014 at 11:12

Categories: Network, Tech Articles, Unix / Linux   Tags:

怎么知道gcc搜索头文件的路径

每个C/C++程序员都知道,对于#include directive,一般,以双引号引用的头文件是程序号自定义的头文件。而用尖括号引用的头文件是系统的头文件或其它库文件。

更详细的,编译器先在当前目录找用双引号""引用的头文件,如果找不到再到系统目录找这个头文件。而对于尖括号引用的头文件,编译器就只在系统文件中搜索了。

那么,到底是在哪些目录中搜索头文件呢?

可以用cpp查看,如下:

root@vicarious:/home/kamus/projs/horoscope/boost# cpp -v
Using built-in specs.
COLLECT_GCC=cpp
Target: x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-5) 
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu - -mtune=generic -march=x86-64
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

 

一般编写makefile时给gcc指定 -I选项,-I的参数代表的目录是搜索系统头文件时使用的目录。可以试试# cpp -I/tmp -v 

/tmp目录会被添加为搜索系统头文件时的第一个目录。

如果想要添加搜索双引号""引用的头文件使用的目录呢,用 -iquote 选项指定更多的目录。

copyright blog.ykyi.net

Be the first to comment - What do you think?  Posted by zausiu - February 13, 2014 at 16:02

Categories: Tech Articles, Unix / Linux   Tags:

Next Page »