工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

解决TIME_WAIT过多问题(转)

#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122

状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

也就是说,这条命令可以把当前系统的网络连接状态分类汇总。

下面解释一下为啥要这样写:

一个简单的管道符连接了netstat和awk命令。

——————————————————————

先来看看netstat:

netstat -n

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT

你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。

——————————————————————

再来看看awk:

/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。

state[]
相当于定义了一个名叫state的数组

NF
表示记录的字段数,如上所示的记录,NF等于6

$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT

state[$NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数

++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一

END
表示在最后阶段要执行的命令

for(key in state)
遍历数组

print key,”\t”,state[key]
打印数组的键和值,中间用\t制表符分割,美化一下。

如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vim /etc/sysctl.conf
编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p 让参数生效。

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间

下面附上TIME_WAIT状态的意义:

客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
状态为TIME_WAIT

是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?

主动关闭的一方在发送最后一个 ack 后
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。

也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

TIME_WAIT 并不会占用很大资源的,除非受到攻击。

还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态


net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
  net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
  net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
  net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
  net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
  net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
默  认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

注:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

设置这两个参数: reuse是表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接; recyse是加速TIME-WAIT sockets回收

top详细介绍

序号 列名 含义
          a PID 进程id
          b PPID 父进程id
          c RUSER Real user name
          d UID 进程所有者的用户id
          e USER 进程所有者的用户名
          f GROUP 进程所有者的组名
          g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
          h PR 优先级
          i NI nice值。负值表示高优先级,正值表示低优先级
          j P 最后使用的CPU,仅在多CPU环境下有意义
          k %CPU 上次更新到现在的CPU时间占用百分比
          l TIME 进程使用的CPU时间总计,单位秒
          m TIME+ 进程使用的CPU时间总计,单位1/100秒
          n %MEM 进程使用的物理内存百分比
          o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
          p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
          q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
          r CODE 可执行代码占用的物理内存大小,单位kb
          s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
          t SHR 共享内存大小,单位kb
          u nFLT 页面错误次数
          v nDRT 最后一次写入到现在,被修改过的页面数。
          w S 进程状态。
            D=不可中断的睡眠状态
            R=运行
            S=睡眠
            T=跟踪/停止
            Z=僵尸进程
          x COMMAND 命令名/命令行
          y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
          z Flags 任务标志,参考 sched.h

默认情况下仅显示比较重要的  PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND  列。可以通过下面的快捷键来更改显示内容。
更改显示内容通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z  即可显示或隐藏对应的列,最后按回车键确定。
按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z  可以将相应的列向左移动。最后按回车键确定。
按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的  R 键可以将当前的排序倒转。
命令使用
1.  工具(命令)名称
top
2.工具(命令)作用
显示系统当前的进程和其他状况;top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.
3.环境设置
在Linux下使用。
4.使用方法
4.1使用格式
top [-] [d] [p] [q] [c] [C] [S]  [s]  [n]
4.2参数说明
d  指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
p  通过指定监控进程ID来仅仅监控某个进程的状态。
q该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
S 指定累计模式
s  使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i  使top不显示任何闲置或者僵死进程。
c  显示整个命令行而不只是显示命令名
4.3其他
下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
Ctrl+L 擦除并且重写屏幕。
h或者?  显示帮助画面,给出一些简短的命令总结说明。
k  终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
i 忽略闲置和僵死进程。这是一个开关式命令。
q  退出程序。
r  重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S 切换到累计模式。
s  改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5  s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f或者F 从当前显示中添加或者删除项目。
o或者O  改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t  切换显示进程和CPU状态信息。
c  切换显示命令名称和完整命令行。
M  根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W  将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

dns扩容记

这个智能DNS也用了有两年多了,还算用得稳定。
之前配置的是主辅两台,且自动解析区分电信网通。
而且,数据是同步的。也就是说,修改了主DNS后,资源记录数据会自动同步到辅DNS上。无需手工修改。
因当时没有作详细的记录文档,也找不到。当时是参考网上的别人的文档来做成的。
所以,这两天要扩容,也就是增加几台机器。
想法是这样。
一台主,四台辅,这样,就算主有问题仍有多台辅,或一机房的主辅有问题,仍有其它机房的顶住。因为当前的两台都在同一机房,所以,是为安全着想,增加几台。也是公司业务发展的需要了。

也因一时找不到文档了。像之前搬迁那样,直接安装,将配置文件等直接拷贝过去。然后修改记录,增加NS记录
但启动后,数据不能同步,是新增的三台不行,以前的那台辅正常可以同步。
便GG了一下。看到些好笑的议论
有些人说,直接拷贝或上传,再重起
有些人说,用rsync同步,再重起
更有人说,这样做同步很懒什么的(看到这句,便想到马云先生语录里对于懒的说法,很精辟的)。


回归正题,上面说到数据不能同步,是重新启动或载入时,主的数据不能同步的其它的辅上。
因为之前的两台是,修改完主,重启,重载,就会自动同步的辅上。现在就新加的三台不行
但有个奇怪的问题。昨天装好后不行,就丢在那了,其实是忙其它的事了
后来看来看到有数据同步的记录,只是失败了。
今天早上来到一看,那些数据都同步了。但修改后,重起,重载,还是不行。奇怪了。难不成一定要他们自己想同步的时候才可以?哈哈

再继续观察和查找问题...

还有一个问题,在之前的那台辅DNS上,能看到一些新增的辅发来的同步信号。
zone domain/IN/view_any: refused notify from non-master: IP#32769
拒绝了,但怎么不是发到主DNS上,发到辅DNS这来
在新增的辅DNS上,看到的记录,是主DNS的IP
在主的DNS上,能看到若是其中两台的同步记录。


上面这些,也写了有一些天了。我的这个一主多辅的智能DNS也搞了一些天,断断续续的搞。
今天再搞,似乎一切都正常了,有点高兴和郁闷,高兴的是怎么突然就好了,郁闷的是,怎么前些天都不行。唯一的不正常,是在每台辅DNS上都会有一个类似这样的记录
zone domain/IN/view_any: refused notify from non-master: IP#32769
每台辅DNS都能收到自身或其它辅DNS的notify请求,但在配置是没有设置这个的呀。还没搞懂原因何在。先留着吧。

想想在这中间有两个关键点
一 是同步KEY设置,就是同步信号的问题
二 是IP匹配的问题,notify,transfer,match-clients 这些的IP设置

 

下面是一些文件的部分
primary
options {
        recursion no;
        listen-on { 127.0.0.1;ip;};
        allow-notify { slave ip list;};
        allow-transfer { slave ip list;};
};

include "ip_tables_tel.txt";

view "view_tele" {
key "tele" {
algorithm hmac-md5;
secret "SWrRvyqCssGsbq25CFezrg==";
};
allow-transfer { key tele; };
match-clients  { key tele;!slave ip list;TEL; };//IP前面要加!才能同步
server slave ip { keys tele; };
.
.
.

zone "." {
type hint;
file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};

include "master/telecom.def";//电信的域名zone文件
};

//网通视图
view "view_cnc" {
..........//格式和上面一样,只是把zone文件分开
}

上面是主的文件,对于辅的文件
只需要修改notify,allo-transfer,match-clients,server,还有zone文件里的type

options {
        recursion no;
        listen-on { 127.0.0.1;ip;};
        allow-notify { primary ip;};
        allow-transfer { none;};
};
view "view_tele" {
key "tele" {
algorithm hmac-md5;
secret "SWrRvyqCssGsbq25CFezrg==";
};
allow-transfer { none; };
match-clients  { key tele;!primary ip;TEL; };
server primary ip  { keys tele; };

zone "." {
type hint;
file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};

include "master/telecom.def";
};

js格式化工具,html_js 工具,小工具

这两天在看一些JS代码,TMD的,长长一大段,且没有一点格式,真不知这些人是为什么要这样搞,想不易让人看懂还是喜欢这种风格.看得头都大

好在今晚找到个格式化工具,爽就一个字

http://www.51099.com/tool/js-format-compress.html 格式化及压缩

http://www.51099.com/tool/js-format-color.html  可以格式化javascript代码 并在格式化的同时对代码进行着色

http://www.51099.com/tool/html_js.html 

 http://www.51099.com/tools/jscode.htm

http://www.51099.com/tools/ucode.htm

rsync warning: some files vanished before they could be transferred

rsync warning: some files vanished before they could be transferred (code 24) at main.c(702)

rsync  version 2.6.3  protocol version 28

update
http://rsync.samba.org/
http://rsync.samba.org/ftp/rsync/

js

cygwin

一、cygwin是什么?
 简而言之,cygwin是一个在windows平台上运行的 linux模拟环境,是cygnus solutions公司开发的自由软件

http://www.cygwin.com/

Screen:Shell 孵化器(转)

Screen 这个东东真的够酷、好玩、十二分地有意思,而且也是相当地实用。Screen 就像一个 Shell 孵化器,只需一个 Shell,在 Screen 的神奇作用下,“道生一,一生二,二生三,三生万物”,想要多少个 Shell 都可以。当然,前提是只要你愿意。有了 Screen,再也不需要同时打开多个终端或者多个标签页了。还有更加好玩的在后头,在 Screen 孵化的 Shell 中执行任务,即便是你退出终端,仍然不会对它造成任何影响。稍后,同样可以再次进入 Screen 的世界。

如果你从来没有安装过 Screen,那么就执行 sudo apt-get install screen 吧。然后,在终端中输入 screen 就启动 Screen 了。按照提示按空格键或回车键开始我们的 Screen 快乐之旅吧。现在,你可以随便执行某些命令来测试,如:ls -l。接着,我们就用 Screen 来孵化一个新的 Shell,同时按组合键 ctrl-a c,同样的,你能够在这里执行命令,我们假如是 ps aux。加上最初的,那么现在在 Screen 中就有两个 Shell 了。可是,如何在这两个 Shell 间切换呢?试试 ctrl-a ctrl-a 看?是不是很方便地切换回来了呢。假如你要退出,甚至关掉终端,那么好吧,按 ctrl-a ctrl-d,屏幕会显示 [detached],你就放心的关终端吧。是的,在玩了一圈之后,你又想进入 Screen 了,怎么办?只需输入 screen -d -r 即可。

以下总结一些常用的 Screen 操作快捷键,供大家参考:

ctrl-a c:创建一个新的 Shell
ctrl-a ctrl-a:在 Shell 间切换
ctrl-a n:切换到下一个 Shell
ctrl-a p:切换到上一个 Shell
ctrl-a 0...9:同样是切换各个 Shell
ctrl-a d:退出 Screen 会话