工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表2012年09月的文章

ip_conntrack: table full

有两点我们要注意.
-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
echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max
设置hashsize
如果(netfilter conntrack静态编译在内核中),2.4中可以在编译时设置,2.6可以在启动中(boot时)加入ip_conntrack.hashsize=$hashsize
如果为modules,则可以使用 modprobe ip_conntrack hashsize=$hashsize
#####################################
实践过方法:
Vi  /etc/modprobe.conf
添加:
options ip_conntrack hashsize=524288
 
vi  /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_max = 524288  (根据自己的物理内存算出来的)
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
##########################################
--------------------------
conntrack使用的内存计算
size_of_mem_used_by_conntrack (in bytes) =
        CONNTRACK_MAX * sizeof(struct ip_conntrack) +
        HASHSIZE * sizeof(struct list_head)
其中sizeof(struct ip_conntrack)大概在192-352字节之间.
sizeof(struct list_head) = 2 * size_of_a_pointer(i386中为4字节)
一个例子512m内存,使用384m来用于conntrack则
384*1024*1024/(352+8)(使用它是保守计算) =~1143901 (此为conntrack:hashszie为1:1,352为sizeof(ip_conntrack),8为sizeof(list_head).
由于hash最好设为2的乘方的数,所以为1048576(2^20).
---------------------
附相关设置及命令:
ip_conntrack timeout 原值432000秒(5天)
可改为10小时,echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
ip_conntrack buffer使用情况
grep conn /proc/slabinfo
例ip_conntrack      188069 229570    336   11    1 : tunables   54   27    8 : slabdata  20870
 
相关修改:
echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range
echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo "1048576" > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "268435456" >/proc/sys/kernel/shmall
echo "536870912" >/proc/sys/kernel/shmmax
echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo "1024" > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo "2048" > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo "4096" > /proc/sys/net/ipv4/neigh/default/gc_thresh3
echo "52428800" > /proc/sys/net/ipv4/route/max_size
echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

undefined reference to `apr_array_clear'

--with-included-apr --with-apr=/usr --with-apr-util=/usr

Linux 下网络性能优化方法简析

通过/proc/sys/net/ipv4/优化Linux下网络性能

通过/proc/sys/net/ipv4/优化Linux下网络性能

/proc/sys/net/ipv4/优化
1)      /proc/sys/net/ipv4/ip_forward
该文件表示是否打开IP转发。
0,禁止
1,转发
 
缺省设置:0
2)      /proc/sys/net/ipv4/ip_default_ttl

 


该文件表示一个数据报的生存周期(Time To Live),即最多经过多少路由器。
 
缺省设置:64
增加该值会降低系统性能。
3)      /proc/sys/net/ipv4/ip_no_pmtu_disc
该文件表示在全局范围内关闭路径MTU探测功能。
 
缺省设置:0
4)      /proc/sys/net/ipv4/route/min_pmtu
该文件表示最小路径MTU的大小。
 
缺省设置:552
5)      /proc/sys/net/ipv4/route/mtu_expires
该文件表示PMTU信息缓存多长时间(秒)。
 
缺省设置:600(秒)
6)      /proc/sys/net/ipv4/route/min_adv_mss
该文件表示最小的MSS(Maximum Segment Size)大小,取决于第一跳的路由器MTU。
 
缺省设置:256(bytes)
6.1 IP Fragmentation
1)      /proc/sys/net/ipv4/ipfrag_low_thresh
/proc/sys/net/ipv4/ipfrag_low_thresh
两个文件分别表示用于重组IP分段的内存分配最低值和最高值,一旦达到最高内存分配值,其它分段将被丢弃,直到达到最低内存分配值。
 
缺省设置:196608(ipfrag_low_thresh)
     262144(ipfrag_high_thresh)
2)      /proc/sys/net/ipv4/ipfrag_time
该文件表示一个IP分段在内存中保留多少秒。
 
缺省设置:30(秒)
6.2 INET Peer Storage
1)      /proc/sys/net/ipv4/inet_peer_threshold
INET对端存储器某个合适值,当超过该阀值条目将被丢弃。该阀值同样决定生存
时间以及废物收集通过的时间间隔。条目越多,存活期越低,GC 间隔越短。
 
缺省设置:65664
2)      /proc/sys/net/ipv4/inet_peer_minttl
条目的最低存活期。在重组端必须要有足够的碎片(fragment)存活期。这个最低
存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies为
单位测量。
 
缺省设置:120
3)      /proc/sys/net/ipv4/inet_peer_maxttl
条目的最大存活期。在此期限到达之后,如果缓冲池没有耗尽压力的话(例如:缓
冲池中的条目数目非常少),不使用的条目将会超时。该值以 jiffies为单位测量。
 
缺省设置:600
4)      /proc/sys/net/ipv4/inet_peer_gc_mintime
废物收集(GC)通过的最短间隔。这个间隔会影响到缓冲池中内存的高压力。该值
以 jiffies为单位测量。
 
缺省设置:10
5)      /proc/sys/net/ipv4/inet_peer_gc_maxtime
废物收集(GC)通过的最大间隔,这个间隔会影响到缓冲池中内存的低压力。该值
以 jiffies为单位测量。
 
缺省设置:120
6.3 TCP Variables
1)      /proc/sys/net/ipv4/tcp_syn_retries
该文件表示本机向外发起TCP SYN连接超时重传的次数,不应该高于255;该值仅仅针对外出的连接,对于进来的连接由tcp_retries1控制。
 
缺省设置:5
2)      /proc/sys/net/ipv4/tcp_keepalive_probes
该文件表示丢弃TCP连接前,进行最大TCP保持连接侦测的次数。保持连接仅在
SO_KEEPALIVE套接字选项被打开时才被发送。
 
缺省设置:9(次)
3)      /proc/sys/net/ipv4/tcp_keepalive_time
该文件表示从不再传送数据到向连接上发送保持连接信号之间所需的秒数。
 
缺省设置:7200(2小时)
4)      /proc/sys/net/ipv4/tcp_keepalive_intvl
该文件表示发送TCP探测的频率,乘以tcp_keepalive_probes表示断开没有相应的TCP连接的时间。
 
缺省设置:75(秒)
5)      /proc/sys/net/ipv4/tcp_retries1
  该文件表示放弃回应一个TCP连接请求前进行重传的次数。
  
  缺省设置:3
6)      /proc/sys/net/ipv4/tcp_retries2
  该文件表示放弃在已经建立通讯状态下的一个TCP数据包前进行重传的次数。
  
  缺省设置:15
7)      /proc/sys/net/ipv4/tcp_orphan_retries
在近端丢弃TCP连接之前,要进行多少次重试。默认值是 7 个,相当于 50秒–
16分钟,视 RTO 而定。如果您的系统是负载很大的web服务器,那么也许需
要降低该值,这类 sockets 可能会耗费大量的资源。另外参考
tcp_max_orphans。
8)      /proc/sys/net/ipv4/tcp_fin_timeout
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能
会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在
2.2版本的内核中是 180 秒。您可以设置该值,但需要注意,如果您的机器为负
载很重的web服务器,您可能要冒内存被大量无效数据报填满的风险,
FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1,因为它们最多只吃 1.5K 
的内存,但是它们存在时间更长。另外参考 tcp_max_orphans。
 
缺省设置:60(秒)
9)      /proc/sys/net/ipv4/tcp_max_tw_buckets
系统在同时所处理的最大timewait sockets 数目。如果超过此数的话,
time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制,纯
粹为了抵御那些简单的 DoS 攻击,千万不要人为的降低这个限制,不过,如果
网络条件需要比默认值更多,则可以提高它(或许还要增加内存)。
 
缺省设置:180000
10) /proc/sys/net/ipv4/tcp_tw_recyle
打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求,请不要随
意修改这个值。
 
缺省设置:0
11) /proc/sys/net/ipv4/tcp_tw_reuse
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。
 
缺省设置:0
12) /proc/sys/net/ipv4/tcp_max_orphans
系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那
么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这
个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要依赖这个或是人为的降
低这个限制。
 
缺省设置:8192
13) /proc/sys/net/ipv4/tcp_abort_on_overflow
当守护进程太忙而不能接受新的连接,就向对方发送reset消息,默认值是false。
这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态。只有在你确
信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。
 
缺省设置:0
14) /proc/sys/net/ipv4/tcp_syncookies
该文件表示是否打开TCP同步标签(syncookie),内核必须打开了 CONFIG_SYN_COOKIES项进行编译。同步标签(syncookie)可以防止一个套接字在有过多试图连接到达时引起过载。
 
缺省设置:0
15) /proc/sys/net/ipv4/tcp_stdurg
使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的
BSD解释,因此如果您在 Linux 打开它,或会导致不能和它们正确沟通。
 
缺省设置:0
16) /proc/sys/net/ipv4/tcp_max_syn_backlog
对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目。对于
超过 128Mb 内存的系统,默认值是 1024,低于 128Mb 的则为 128。如果
服务器经常出现过载,可以尝试增加这个数字。警告!假如您将此值设为大于
1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE,以保持
TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如
果tcp_adv_win_scale 128Mb 32768-610000)则系统将忽略所有发送给自己
的ICMP ECHO请求或那些广播地址的请求。
 
缺省设置:1024
17) /proc/sys/net/ipv4/tcp_window_scaling
该文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。
 
缺省设置:1
18) /proc/sys/net/ipv4/tcp_sack
该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。
 
缺省设置:1
19) /proc/sys/net/ipv4/tcp_timestamps
该文件表示是否启用以一种比超时重发更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。
 
缺省设置:1
20) /proc/sys/net/ipv4/tcp_fack
该文件表示是否打开FACK拥塞避免和快速重传功能。
 
缺省设置:1
21) /proc/sys/net/ipv4/tcp_dsack
该文件表示是否允许TCP发送“两个完全相同”的SACK。
 
缺省设置:1
22) /proc/sys/net/ipv4/tcp_ecn
该文件表示是否打开TCP的直接拥塞通告功能。
 
缺省设置:0
23) /proc/sys/net/ipv4/tcp_reordering
该文件表示TCP流中重排序的数据报最大数量。
 
缺省设置:3
24) /proc/sys/net/ipv4/tcp_retrans_collapse
该文件表示对于某些有bug的打印机是否提供针对其bug的兼容性。
 
缺省设置:1
25) /proc/sys/net/ipv4/tcp_wmem
该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于发送缓冲的内存最小值。每个TCP socket都可以使用它。
Default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem中default的 值,一般要低于net.core.wmem中default的值。
Max:为TCP socket预留用于发送缓冲的内存最大值。该值不会影响net.core.wmem_max,今天选择参数SO_SNDBUF则不受该值影响。默认值为128K。
 
缺省设置:4096 16384 131072
26) /proc/sys/net/ipv4/tcp_rmem
该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下TCP socket都至少会有这么多数量的内存用于接收缓冲。
Default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem中default的 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win的默认值情况下,TCP 窗口大小为65535。
Max:为TCP socket预留用于接收缓冲的内存最大值。该值不会影响 net.core.wmem中max的值,今天选择参数 SO_SNDBUF则不受该值影响。
 
缺省设置:4096 87380 174760
27) /proc/sys/net/ipv4/tcp_mem
该文件包含3个整数值,分别是:low,pressure,high
Low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
Pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。
High:允许所有tcp sockets用于排队缓冲数据报的页面量。
一般情况下这些值是在系统启动时根据系统内存数量计算得到的。
 
缺省设置:24576 32768 49152
28) /proc/sys/net/ipv4/tcp_app_win
该文件表示保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。
 
缺省设置:31
29) /proc/sys/net/ipv4/tcp_adv_win_scale
该文件表示计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale >; 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale )。
 
缺省设置:2
6.4 IP Variables
1)      /proc/sys/net/ipv4/ip_local_port_range
该文件表示TCP/UDP协议打开的本地端口号。
 
缺省设置:1024 4999
建议设置:32768 61000
2)      /proc/sys/net/ipv4/ip_nonlocal_bind
该文件表示是否允许进程邦定到非本地地址。
 
缺省设置:0
3)      /proc/sys/net/ipv4/ip_dynaddr
该参数通常用于使用拨号连接的情况,可以使系统动能够立即改变ip包的源地址为该ip地址,同时中断原有的tcp对话而用新地址重新发出一个syn请求包,开始新的tcp对话。在使用ip欺骗时,该参数可以立即改变伪装地址为新的ip地址。该文件表示是否允许动态地址,如果该值非0,表示允许;如果该值大于1,内核将通过log记录动态地址重写信息。
 
缺省设置:0
4)      /proc/sys/net/ipv4/icmp_echo_ignore_all
/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
该文件表示内核是否忽略所有的ICMP ECHO请求,或忽略广播和多播请求。
0,响应请求
1,忽略请求
 
缺省设置:0
建议设置:1
5)      /proc/sys/net/ipv4/icmp_ratelimit
6)      /proc/sys/net/ipv4/icmp_ratemask
7)      /proc/sys/net/ipv4/icmp_ignore_bogus_error_reponses
某些路由器违背RFC1122标准,其对广播帧发送伪造的响应来应答。这种违背行
为通常会被以告警的方式记录在系统日志中。如果该选项设置为True,内核不会
记录这种警告信息。
 
缺省设置:0
8)      /proc/sys/net/ipv4/igmp_max_memberships
该文件表示多播组中的最大成员数量。
 
缺省设置:20
6.5 Other Configuration
1)      /proc/sys/net/ipv4/conf/*/accept_redirects
   如果主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关
   在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就会给你
   发一个所谓的“重定向”icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔
   值,1表示接收这类重定向icmp 信息,0表示忽略。在充当路由器的linux主机上缺
   省值为0,在一般的linux主机上缺省值为1。建议将其改为0以消除安全性隐患。
2)      /proc/sys/net/ipv4/*/accept_source_route
 是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。在
 充当网关的linux主机上缺省值为1,在一般的linux主机上缺省值为0。从安全性角
 度出发,建议关闭该功能。
3)      /proc/sys/net/ipv4/*/secure_redirects
 其实所谓的“安全重定向”就是只接受来自网关的“重定向”icmp包。该参数就是
 用来设置“安全重定向”功能的。参数值为布尔值,1表示启用,0表示禁止,缺省值
 为启用。
4)      /proc/sys/net/ipv4/*/proxy_arp
 设置是否对网络上的arp包进行中继。参数值为布尔值,1表示中继,0表示忽略,
 缺省值为0。该参数通常只对充当路由器的linux主机有用。

Linux下高性能网络编程中的几个TCP/IP选项

最近在新的平台上测试程序,以前一些没有注意到的问题都成为了性能瓶颈,通过设置一些TCP/IP选项能够解决一部分问题,当然根本的解决方法是重构代码,重新设计服务器框架。先列出几个TCP/IP选项:

选项
man 7 socket:
SO_REUSEADDR
SO_RECVBUF/SO_SNDBUF
SO_KEEPALIVE
SO_LINGER

man 7 tcp:
TCP_CORK
TCP_NODELAY
TCP_DEFER_ACCEPT
TCP_KEEPCNT/TCP_KEEPIDLE/TCP_KEEPINTVL

SO_REUSEADDR
在服务器程序中,SO_REUSEADDR socket选项通常在调用bind()之前被设置。
SO_REUSEADDR可以用在以下四种情况下。 
(摘自《Unix网络编程》卷一,即UNPv1)
1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。 
2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。 
3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。 
4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。

TCP_NODELAY/TCP_CHORK
TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,Nagle化在这里的含义是采用Nagle算法把较小的包组装为更大的帧。TCP_NODELAY和TCP_CORK都禁掉了Nagle算法,只不过他们的行为不同而已。
TCP_NODELAY 不使用Nagle算法,不会将小包进行拼接成大包再进行发送,直接将小包发送出去,会使得小包时候用户体验非常好。
当在传送大量数据的时候,为了提高TCP发送效率,可以设置TCP_CORK,CORK顾名思义,就是"塞子"的意思,它会尽量在每次发送最大的数据量。当设置了TCP_CORK后,会有阻塞200ms,当阻塞时间过后,数据就会自动传送。

详细的资料可以查看参考文献5。

SO_LINGER
linger,顾名思义是延迟延缓的意思,这里是延缓面向连接的socket的close操作。默认,close立即返回,但是当发送缓冲区中还有一部分数据的时候,系统将会尝试将数据发送给对端。SO_LINGER可以改变close的行为。控制SO_LINGER通过下面一个结构:
struct linger
{
int l_onoff;
int l_linger;
};

通过结构体中成员的不同赋值,可以表现为下面几种情况:
1. l_onoff设置为0,选项被关闭。l_linger值被忽略,就是上面的默认情形,close立即返回。
2. l_onoff设置为非0,l_linger被设置为0,则close()不被阻塞立即执行,丢弃socket发送缓冲区中的数据,并向对端发送一个RST报文。这种关闭方式称为“强制”或“失效”关闭。
3. l_onoff设置为非0,l_linger被设置为非0,则close()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。

注意:
这个选项需要谨慎使用,尤其是强制式关闭,会丢失服务器发给客户端的最后一部分数据。UNP中:
The TIME_WAIT state is our friend and is there to help us(i.e., to let the old duplicate segments expire in the network).

TCP_DEFER_ACCEPT
defer accept,从字面上理解是推迟accept,实际上是当接收到第一个数据之后,才会创建连接。对于像HTTP等非交互式的服务器,这个很有意义,可以用来防御空连接攻击(只是建立连接,但是不发送任何数据)。
使用方法如下:

val = 5;
setsockopt(srv_socket->fd, SOL_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val)) ;

里面 val 的单位是秒,注意如果打开这个功能,kernel 在 val 秒之内还没有收到数据,不会继续唤醒进程,而是直接丢弃连接。如果服务器设置TCP_DEFER_ACCEPT选项后,服务器受到一个CONNECT请求后,三次握手之后,新的socket状态依然为SYN_RECV,而不是ESTABLISHED,操作系统不会Accept。
由于设置TCP_DEFER_ACCEPT选项之后,三次握手后状态没有达到ESTABLISHED,而是SYN_RECV。这个时候,如果客户端一直没有发送"数据"报文,服务器将重传SYN/ACK报文,重传次数受net.ipv4.tcp_synack_retries参数控制,达到重传次数之后,才会再次进行setsockopt中设置的超时值,因此会出现SYN_RECV生存时间比设置值大一些的情况。

关于SYN_RECV状态可以查看参考文献7。

SO_KEEPALIVE/TCP_KEEPCNT/TCP_KEEPIDLE/TCP_KEEPINTVL
如果一方已经关闭或异常终止连接,而另一方却不知道,我们将这样的TCP连接称为半打开的。TCP通过保活定时器(KeepAlive)来检测半打开连接。
在高并发的网络服务器中,经常会出现漏掉socket的情况,对应的结果有一种情况就是出现大量的CLOSE_WAIT状态的连接。这个时候,可以通过设置KEEPALIVE选项来解决这个问题,当然还有其他的方法可以解决这个问题,详细的情况可以查看参考资料8。

使用方法如下:

//Setting For KeepAlive
int keepalive = 1;
setsockopt(incomingsock,SOL_SOCKET,SO_KEEPALIVE,(void*)(&keepalive),(socklen_t)sizeof(keepalive));
                        
int keepalive_time = 30;
setsockopt(incomingsock, IPPROTO_TCP, TCP_KEEPIDLE,(void*)(&keepalive_time),(socklen_t)sizeof(keepalive_time));
int keepalive_intvl = 3;
setsockopt(incomingsock, IPPROTO_TCP, TCP_KEEPINTVL,(void*)(&keepalive_intvl),(socklen_t)sizeof(keepalive_intvl));
int keepalive_probes= 3;
setsockopt(incomingsock, IPPROTO_TCP, TCP_KEEPCNT,(void*)(&keepalive_probes),(socklen_t)sizeof(keepalive_probes));


设置SO_KEEPALIVE选项来开启KEEPALIVE,然后通过TCP_KEEPIDLE、TCP_KEEPINTVL和TCP_KEEPCNT设置keepalive的开始时间、间隔、次数等参数。
当然,也可以通过设置/proc/sys/net/ipv4/tcp_keepalive_time、tcp_keepalive_intvl和tcp_keepalive_probes等内核参数来达到目的,但是这样的话,会影响所有的socket,因此建议使用setsockopt设置。

参考:
1. man 7 socket
2. man 7 tcp
3. 《Unix Network Programming》 Section 7.5 "Generic Socket Options"
4. http://www.linuxsir.org/bbs/showthread.php?t=55738
5. http://blog.chinaunix.net/u/12592/showart_1723934.html
6. http://blog.csdn.net/fullsail/archive/2009/08/09/4429102.aspx
7. http://www.kernelchina.org/?q=node/110
8. http://blog.chinaunix.net/u/12592/showart.php?id=2059174

Bind中的SOA记录详解

Bind的SOA记录:每个Zone仅有一个SOA记录。SOA记录包括Zone的名字,一个技术联系人和各种不同的超时值。例子:

$TTL 3600
$ORIGIN texiangbao.com.cn.
@ IN SOA dns.qqdns.com. domainadmin.dnspod.com.(
1247134024 ;Serial
3600 ; Refresh ( seconds )
1800 ; Retry ( seconds )
1209600 ; Expire ( seconds )
3600 );Minimum TTL for Zone ( seconds )
;
@ IN NS dns.qqdns.com.
@ IN NS dns.ggdns.com.
www 3600 IN A 63.220.7.134
www 3600 IN A 63.220.7.134
;
;generated @ 2009-07-09 18:07:12
;end

* #Serial 
数值Serial代表这个Zone的序列号作用:供Slave DNS判断是否从Master DNS获取新数据。每次Zone文件更新,都需要修改Serial数值。RFC1912 2.2建议的格式为YYYYMMDDnn 其中nn为修订号;
* #Refresh
数值Refresh设置Slave DNS多长时间与Master Server进行Serial核对。目前Bind的notify参数可设置每次Master DNS更新都会主动通知Slave DNS更新,Refresh参数主要用于notify参数关闭时;
* #Retry
数值Retry设置当Slave DNS试图获取Master DNS Serial时,如果Master DNS未响应,多长时间重新进行检查;
* #Expire
数值Expire将决定Slave DNS在没有Master DNS的情况下权威地提供域名解析服务的时间长短;
* #Minimum
在8.2版本之前,由于没有独立的 $TTL 指令,所以通过 SOA 最后一个字段来实现。但由于 BIND 8.2 后出现了 $TTL 指令,该部分功能就不再由 SOA 的最后一个字段来负责,由 $TTL 全权负责,SOA 的最后一个字段专门负责 negative answer ttl(negative caching)
The last field in the SOA is the negative caching TTL. This controls how long other servers will cache no-such-domain(NXDOMAIN)responses from you.

 

 

管理授权记录区域以服务器授权机构的概念为基础。

 
当 DNS 服务器配置成加载区域时,它使用两种资源记录来确定区域的授权属性
首先,起始授权机构 (SOA) 资源记录指明区域的源名称,并包含作为区域信息主要来源的服务器的名称。它还表示该区域的其他基本属性。 
其次,名称服务器 (NS) 资源记录用于标记被指定为区域权威服务器的 DNS 服务器。通过在 NS RR 中列出服务器,其他服务器就认为它是该区域的权威服务器。这意味着在 NS RR 中指定的任何服务器都被其他服务器当作权威的来源,并且能肯定应答区域内所含名称的查询。 
SOA 和 NS 资源记录在区域配置中具有特殊作用。他们是任何区域都需要的记录并且一般是文件中列出的第一个资源记录。在默认情况下,使用 DNS 控制台来添加新的主要区域时,“新建区域向导”会自动创建这些记录。
SOA 资源记录
起始授权机构 (SOA) 资源记录总是处于任何标准区域中的第一位。它表示最初创建它的 DNS 服务器或现在是该区域的主服务器的 DNS 服务器。它还用于存储会影响区域更新或过期的其他属性,如版本信息和计时。这些属性会影响在该区域的权威服务器之间进行区域传输的频繁程度
SOA 资源记录包含以下信息:
字段 描述 
主服务器(所有者) 区域的主 DNS 服务器的主机名。 
负责人 管理区域的负责人的电子邮件地址。在该电子邮件名称中使用英文句点 (.) 代替“at”符号 (@)。 
序列号 该区域文件的修订版本号。每次区域中的资源记录改变时,这个数字便会增加。每次区域改变时增加这个值非常重要,它使部分区域改动或完全修改的区域都可以在后续传送中复制到其他辅助服务器上。 
刷新间隔 以秒计算的时间,它是在查询区域的来源以进行区域更新之前辅助 DNS 服务器等待的时间。当刷新间隔到期时,辅助 DNS 服务器请求来自响应请求的源服务器的区域当前 SOA 记录副本。然后,辅助 DNS 服务器将源服务器的当前 SOA 记录(如响应中所示)的序列号与其本地 SOA 记录的序列号相比较。如果二者不同,则辅助 DNS 服务器从主要 DNS 服务器请求区域传输。这个域的默认时间是 900 秒(15 分钟)。 
重试间隔 以秒计算的时间,是辅助服务器在重试失败的区域传输之前等待的时间。通常,这个时间短于刷新间隔。该默认值为 600 秒(10 分钟)。 
到期间隔 以秒计算的时间,是在区域没有刷新或更新的已过去的刷新间隔之后、辅助服务器停止响应查询之前的时间。因为在这个时间到期,因此辅助服务器必须把它的本地数据当作不可靠数据。默认值是 86,400 秒(24 小时)。 
最小(默认)TTL 区域的默认存在时间 (TTL) 和缓存否定应答名称查询的最大间隔。该默认值为 3,600 秒(1 小时)。
以下是一个默认的 SOA 资源记录的例子:

@ IN SOA nameserver.example.microsoft.com. postmaster.example.microsoft.com. (
1 ; serial number
3600 ; refresh [1h]
600 ; retry [10m]
86400 ; expire [1d]
3600 ) ; min TTL [1h]
如上所述的 SOA 记录的例子中,区域的主要或源服务器显示为 nameserver.example.microsoft.com。有关区域问题的联系人电子邮件地址为 postmaster.example.microsoft.com。
注意
在区域中写入和存储 DNS 域名时,使用英文句点代表电子邮件地址。在电子邮件应用程序中,以前例子中的地址很可能是这种形式:postmaster@example.microsoft.com 
在 SOA 资源记录中使用的括号出现在区域文件中时,用于允许记录能自动换行为多行文本。 
如果一个单独的 TTL 值被指派并应用于在区域中使用的指定资源记录,那么它将覆盖在 SOA 记录中设置的最小(默认) TTL。 
NS 资源记录
可按以下两种方式使用名称服务器 (NS) 资源记录,将授权机构指派给 DNS 域名的指定服务器: 
通过建立域的权威服务器列表,可以使请求该域(区域)信息的其他服务器知道这些服务器。 
通过为从区域委派出去的任何子域指明权威 DNS 服务器。 
在同一区域中用主机名指派服务器的情况下,相应的地址 (A) 资源记录通常在区域中使用,以将指定服务器的名称解析为他们的 IP 地址。对于使用此 RR 作为向子域的区域委派的一部分指定的服务器,NS 资源记录通常包含区域以外的名称。对于要解析的区域以外的名称,可能需要指定的区域以外服务器的 A 资源记录。当这些区域以外的 NS 和 A 记录需要用于提供委派时,被称为“粘附记录”。
说明: 将“所有者”中指定的 DNS 域名映射到在 name_server_domain_name 域中指定的运行 DNS 服务器的主机名。 
语法: owner ttl IN NS name_server_domain_name 
例如:

多网卡负载均衡(双网卡做bonding模式)

如果节点上有多个网络接口时可以通过bonding将多个网络接口虚拟为一个网络接口,bonding可以提供高可用及负载均衡功能,从而提高节点的网络接口性能及可用性。

1、使用如下命令安装

T01-MON11:~# apt-get install ifenslave-2.6

2、修改网络接口配置文件/etc/network/interfaces

auto lo

iface lo inet loopback

auto bond0

iface bond0 inet static

address 192.168.0.189

netmask 255.255.0.0

gateway 192.168.1.1

slaves eth0 eth1                    

bond-mode balance-rr       

bond-miimon 100

其中:

    slaves eth0 eth1,说明绑定两个“从网卡”eth0eth1bond0逻辑接口,如果要绑定多个网络接口,继续在该行附加网络接口名字即可。

   bond-mode balance-rr,指定绑定模式为采用Round-robin策略的负载均衡模式,两个网络接口会均匀分担网络负载,另一个常用模式为active-backup,也就是hot standby模式,支持网络接口failover。

如果重新启动网络时出现bonding: Warning:的提示,则需要在/etc/modprobe.d目录下新建名为文件aliases-bond.conf的,并加入如下内容。

alias bond0 bonding

squid TCP_NEGATIVE_HIT

TCP_NEGATIVE_HIT

在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否

命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下

列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501,

502, 503, 504。