linux TCP 相关的东西
TCP 连接相关
Client ------------------------- Server
SYN
SYN+ACK
ACK
Clinet:
作为客户端。发起连接失败的次数。达到后才弹出错误。
cat /proc/sys/net/ipv4/tcp_syn_retries
5
作为客户端
连接中断,重试次数,超过以后拆除连接。注意,时
间不是等值,而是差值1,10,15.
/proc/sys/net/ipv4/tcp_retries1
3
Server:
作为服务端。发起连接失败的次数。达到后才弹
出错误。
/proc/sys/net/ipv4/tcp_synack_retries
5
作为服务端
连接中断,重试次数,超过后在拆除连接。
/proc/sys/net/ipv4/tcp_retries2
TCP失败重传次数,默认值15,意味着重传15次才彻底
放弃.可减少到5,以尽早释放内核资源.
=========================
net.ipv4.tcp_tw_reuse = 1
表示开启重用。允许将TIME-WAIT sockets
重新用于新的TCP连接,默认为0,表示关
闭;
net.ipv4.tcp_tw_recycle = 1
表示开启TCP连接中TIME-WAIT sockets的
快速回收,默认为0,表示关闭。
内核源码:
/usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/include/net
例如 tcp.h
===========================
net/ipv4/tcp_max_syn_backlog
进入SYN包的最大请求队列.默认1024.对重负
载服务器,增加该值显然有好处. (128MB)
可调整到2048.
/proc/sys/net/core/netdev_max_backlog
增加网络核心层(IP之下层面)中可以排队的最大报
文数。增加发送数据包量级,可减少因队列满而丢
包。
/proc/sys/net/ipv4/tcp_window_scaling
因为TCP协议头部中窗口填充位16bit,所以
窗口最大64KB,为了支持大于64KB的窗口
要打开。
中国--美国
卫星上网
分片驻留内存时间单位秒
/proc/sys/net/ipv4/ipfrag_time
作用:增加时间,丢包率就会降低,性能就会提升。
分片进程使用内存上现,当分片数据到达这个临界值后,那么将不在接受新的数据片。
ipfrag_high_thresh
分片进程使用内存下现,当分片内存空间回落到这个值以下,系统重新开始接收数据片。
ipfrag_low_thresh
单位字节
======================
iptraf
-i iface - start the IP traffic monitor (use "-i all" for all interfaces)
-g - start the general interface statistics
-d iface - start the detailed statistics facility on an interface
知道你的网络流量情况
-s iface - start the TCP and UDP monitor on an interface
知道那个服务的流量
-z iface - shows the packet size counts on an interface
知道那个尺寸的数据包最多
-l iface - start the LAN station monitor ("-l all" for all LAN interfaces)
监控流量是否用尽!!!
Outgoing rates:是否已经达到注册流量。
测试与监听分析:
netserver + netperf
netperf -H 192.168.5.73 -l 10
netperf -t TCP_RR -H 192.168.5.73 -l 10 -- -r 2048,32767
流量监听分析:
tcpdump
wireshrak
rpm -ivh tcptrace-*
tcptrace
man tcptrace
tcpdump -i eth0 -vv -nn -w /tmp/tcp -c 10000
tcptrace -n /tmp/tcp
网卡中断[CPU]---网络传输[MTU]---网络传输BONDING
网络协议TCP/IP优化---网络测试工具---流量分析工具
网卡中断:
[root@cm ~]# watch -n 0.1 'cat /proc/interrupts|grep eth0 '
[root@cm ~]# cat /proc/irq/
0/ 11/ 14/ 193/ 209/ 3/ 6/ 9/
1/ 12/ 15/ 2/ 217/ 4/ 7/
10/ 13/ 169/ 201/ 225/ 5/ 8/
[root@cm ~]# cat /proc/irq/217/
eth0/ smp_affinity
[root@cm ~]# cat /proc/irq/217/smp_affinity
00000001
改变cpu的工作核心
echo 00000005 > /proc/irq/217/smp_affinity
ifconfig eth0 | grep irq
watch -n 1 'cat /proc/interrupts | grep 169'
让多核工作
echo 00000005 > /proc/irq/169/smp_affinity
=========================
MTU
[应用数据] ->[应用数据[TCP20 or UDP8 ]] ->
网络层IP 分片
[应用数据分片Frame[TCP20 or UDP8][IP20]]
TCP 1500-40=1460
UDP 1500-28=1472
内网提速之巨帧Jumbo Frame
ifconfig eth0 mtu 9000
vim /etc/sysconfig/network-scripts/ifcfg-eth1
MTU=9000
TCP 9000-40=8960
UDP 9000-28=8972
永久生效见文档:
/usr/share/doc/initscripts-8.45.30/sysconfig.txt
1. iptables丢包问题: ip_conntrack: table full, dropping packet.
/boot/grub/grub.conf kernel行中增加参数
ip_conntrack.hashsize=524288
/etc/sysctl.conf中增加
net.ipv4.netfilter.ip_conntrack_max = 2097152
默认的hashsize只有8192,太小。ip_conntrack_max与hashsize比值不宜超过8,且最好为2的整数倍
高负载机器,这两个参数均应该调大。
需要重启机器
网上很多调整sysctl.conf的方法经实验无效,但这个方法有效,已经通过生产环境考验。
2. time wait bucket table overflow
/etc/sysctl.conf中增加
net.ipv4.tcp_max_tw_buckets = 180000
默认值是5000,太小,也需要调大。
3. 登录shell ulimit的默认值
/etc/security/limits.conf中加入
* soft nofile 655360
* hard nofile 655360
默认的文件描述符限制为1024, 太小,即使调整成65536,对高负载机器也可能不够,故设置为655360,但也要注意,这个值不能设置过大,否则会导致shell无法登录。
4. Linux 文件系统文件描述符限制
RHEL 5.6 64bit的fx.file-max默认值为1585156,这对绝大多数系统完全够用,若要调整可加入/etc/sysctl.conf:
fs.file-max = 1585156
5. squid换varnish后流量增加的解决方案:
/etc/security/limits.conf中加入
* soft memlock 1048576
* soft memlock 1048576
或执行 ulimit -HSl 1048576
默认的memlock 只有32K,对varnish来说,太小太小。varnish使用内存块保存日志,故这个值需要调大一些。
上面的设置将其调整为1G,即可解决varnish流量高于squid的问题, 已经通过生产环境反复考验。
6. 目前遗留的问题:
修改/etc/security/limits.conf后,只对登录shell有效。对开机运行的程序,一定要注意这个问题
那么,登录shell的资源限制来自于/etc/security/limits.conf,那么系统级的资源限制可在哪里修改?
解决(kernel: ip_conntrack: table full, dropping packet)的方法
有两点我们要注意.
-conntrack最大数量.叫做conntrack_max
-存储这些conntrack的hash表的大小,叫做hashsize
当conntrack入口数大于conntrack_max时,在hash表中每一个conntrack list中的存储的入口将不可控.(conntrack_mark/hashsize 为每个list所能存储的入口的数量)
hash表存在于固定的的不可swap的内存中. conntrack_mark决定占用多少这些不可swap的内存.
缺省的hashsize
--------------------------------
conntrack_max=hashsize*8
i386中 hashsize=conntrack_max/8=ramsize(in bytes)/131072=ramsize(in MegaBytes)*8.
所以32位pc,512M内存可以存512*1024^2/128/1024=512*8=4096(连接池list)
但是正确的算法是:
hashsize=conntrack_max/8=ramsize(in bytes)/131072/(x/32)
x表示使用的指针类型是(32位还是64的)
----------------------------\
读取conntrack_max值
2.4内核
cat /proc/sys/net/ipv4/ip_conntrack_max
2.6内核
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
读取hashsize值
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets
------------------------------
你可修改这两个值以适应高负载的netfilter的应用
系统默认为conntrack_max:hashsize是8:1,你可以设成1:1以提高性能.
-------------------------
设置conntrack_max