-o 包含和网络计时相关的信息
统计所有监听的TCP端口信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
[root@justin proc]
# netstat -salt
IcmpMsg:
OutType3: 7
Tcp:
0 active connections openings
1 passive connection openings
0 failed connection attempts
0 connection resets received
1 connections established
2748 segments received
2516 segments send out
1 segments retransmited
0 bad segments received.
0 resets sent
UdpLite:
TcpExt:
40 delayed acks sent
1 delayed acks further delayed because of locked socket
Quick ack mode was activated 2
times
1 packets directly queued to recvmsg prequeue.
1994 packets header predicted
177 acknowledgments not containing data received
449 predicted acknowledgments
1 congestion windows recovered after partial ack
0 TCP data loss events
1 other TCP timeouts
2 DSACKs sent
for
old packets
1 DSACKs received
TCPSackShiftFallback: 1
IpExt:
InMcastPkts: 5294
OutMcastPkts: 14
InBcastPkts: 152617
InOctets: 17485149
OutOctets: 219292
InMcastOctets: 1419973
OutMcastOctets: 2979
InBcastOctets: 15494653
[root@justin proc]
#
|
显示路由信息
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@justin proc]
# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.15.72.0 * 255.255.255.0 U 0 0 0 eth0
link-
local
* 255.255.0.0 U 0 0 0 eth0
default 10.15.72.254 0.0.0.0 UG 0 0 0 eth0
[root@justin proc]
# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.15.72.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 10.15.72.254 0.0.0.0 UG 0 0 0 eth0
|
显示网络接口信息
1
2
3
4
5
6
|
[root@justin proc]# netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0
1500
0
223370
1
2
0
4334
0
0
0
BMRU
lo
16436
0
0
0
0
0
0
0
0
0
LRU
[root@justin proc]#
|
netstat -lnp (打印当前系统启动哪些端口)以及netstat -an (打印网络连接状况)这两个命令非常有用,请一定要记住。如果你所管理的服务器是一台提供web服务(80端口)的服务器,那么你就可以使用netstat -an |grep 80查看当前连接web服务的有哪些IP了。
系统连接状态篇:
1.查看TCP连接状态
1
2
3
4
5
6
7
8
9
|
netstat
-nat |
awk
‘{print $6}’|
sort
|
uniq
-c|
sort
-rn
netstat
-n |
awk
‘/^tcp/ {++S[$NF]};END {
for
(a
in
S) print a, S[a]}’ 或
netstat
-n |
awk
‘/^tcp/ {++state[$NF]}; END {
for
(key
in
state) print key,”\t”,state[key]}’
netstat
-n |
awk
‘/^tcp/ {++arr[$NF]};END {
for
(k
in
arr) print k,”\t”,arr[k]}’
netstat
-n |
awk
‘/^tcp/ {print $NF}’|
sort
|
uniq
-c|
sort
-rn
netstat
-ant |
awk
‘{print $NF}’ |
grep
-
v
‘[a-z]‘ |
sort
|
uniq
-c
|
2.查找请求数请20个IP(常用于查找攻来源):
1
2
3
|
netstat
-anlp|
grep
80|
grep
tcp|
awk
‘{print $5}’|
awk
-F: ‘{print $1}’|
sort
|
uniq
-c|
sort
-nr|
head
-n20
netstat
-ant |
awk
‘/:80/{
split
($5,ip,”:”);++A[ip[1]]}END{
for
(i
in
A) print A[i],i}’ |
sort
-rn|
head
-n20
|
3.用tcpdump嗅探80端口的访问看看谁最高
1
|
tcpdump -i eth0 -tnn dst port 80 -c 1000 |
awk
-F”.” ‘{print $1″.”$2″.”$3″.”$4}’ |
sort
|
uniq
-c |
sort
-nr |
head
-20
|
4.查找较多time_wait连接
1
|
netstat
-n|
grep
TIME_WAIT|
awk
‘{print $5}’|
sort
|
uniq
-c|
sort
-rn|
head
-n20
|
5.找查较多的SYN连接
1
|
netstat
-an |
grep
SYN |
awk
‘{print $5}’ |
awk
-F: ‘{print $1}’ |
sort
|
uniq
-c |
sort
-nr |
more
|
6.根据端口列进程
1
|
netstat
-ntlp |
grep
80 |
awk
‘{print $7}’ |
cut
-d/ -f1
|
网站日志分析篇1(Apache):
1.获得访问前10位的ip地址
1
2
|
cat
access.log|
awk
‘{print $1}’|
sort
|
uniq
-c|
sort
-nr|
head
-10
cat
access.log|
awk
‘{counts[$(11)]+=1}; END {
for
(url
in
counts) print counts[url], url}’
|
2.访问次数最多的文件或页面,取前20
1
|
cat
access.log|
awk
‘{print $11}’|
sort
|
uniq
-c|
sort
-nr|
head
-20
|
3.列出传输最大的几个exe文件(分析下载站的时候常用)
1
|
cat
access.log |
awk
‘($7~/\.exe/){print $10 ” ” $1 ” ” $4 ” ” $7}’|
sort
-nr|
head
-20
|
4.列出输出大于200000byte(约200kb)的exe文件以及对应文件发生次数
1
|
cat
access.log |
awk
‘($10 > 200000 && $7~/\.exe/){print $7}’|
sort
-n|
uniq
-c|
sort
-nr|
head
-100
|
5.如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面
1
|
cat
access.log |
awk
‘($7~/\.php/){print $NF ” ” $1 ” ” $4 ” ” $7}’|
sort
-nr|
head
-100
|
6.列出最最耗时的页面(超过60秒的)的以及对应页面发生次数
1
|
cat
access.log |
awk
‘($NF > 60 && $7~/\.php/){print $7}’|
sort
-n|
uniq
-c|
sort
-nr|
head
-100
|
7.列出传输时间超过 30 秒的文件
1
|
cat
access.log |
awk
‘($NF > 30){print $7}’|
sort
-n|
uniq
-c|
sort
-nr|
head
-20
|
8.统计网站流量(G)
1
|
cat
access.log |
awk
‘{
sum
+=$10} END {print
sum
/1024/1024/1024
}’
|
9.统计404的连接
1
|
awk
‘($9 ~
/404/
)’ access.log |
awk
‘{print $9,$7}’ |
sort
|
10. 统计http status.
1
2
|
cat
access.log |
awk
‘{counts[$(9)]+=1}; END {
for
(code
in
counts) print code, counts[code]}'
cat
access.log |
awk
'{print $9}'
|
sort
|
uniq
-c|
sort
-rn
|
10.蜘蛛分析
查看是哪些蜘蛛在抓取内容。
1
|
/usr/sbin/tcpdump
-i eth0 -l -s 0 -w - dst port 80 | strings |
grep
-i user-agent |
grep
-i -E
'bot|crawler|slurp|spider'
|
网站日分析2(Squid篇)
按域统计流量
1
|
zcat squid_access.log.
tar
.gz|
awk
'{print $10,$7}'
|
awk
'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%s\t%d\n",domain,trfc[domain]}}'
|
内核socket优化
net.core.netdev_max_backlog = 30000 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.somaxconn = 262144 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制
net.core.rmem_default = 8388608 接收套接字缓冲区大小的默认值(以字节为单位)
net.core.wmem_default = 8388608 发送套接字缓冲区大小的默认值(以字节为单位)
net.core.rmem_max=16777216 接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_max=16777216 发送套接字缓冲区大小的最大值(以字节为单位)
net.ipv4.ip_local_port_range = 1024 65536 用于向外连接的端口范围
net.ipv4.tcp_mem = 786432 1048576 1572864 确定 TCP 栈应该如何反映内存使用,此处分别为3G、4G、6G;每个值的单位都是内存页(通常是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。
net.ipv4.tcp_rmem=4096 87380 16777216 TCP接收缓冲区,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的值
net.ipv4.tcp_wmem=4096 65536 16777216 TCP发送缓冲区,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
net.ipv4.tcp_fin_timeout = 10 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒
net.ipv4.tcp_tw_recycle = 1 开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1 表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。
net.ipv4.tcp_max_tw_buckets = 6000 系统在同时所处理的最大timewait sockets 数目。如果超过此数的话,time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要人为的降低这个限制,不过,如果网络条件需要比默认值更多,则可以提高它(或许还要增加内存)
net.ipv4.tcp_timestamps = 0 时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_window_scaling = 1 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64KB), 必须设置该数值为1。
net.ipv4.tcp_sack = 1 表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用
net.ipv4.tcp_no_metrics_save=1 默认情况下一个tcp连接关闭后,把这个连接曾经有的参数比如慢启动门限snd_sthresh,拥塞窗口snd_cwnd 还有srtt等信息保存到dst_entry中, 只要dst_entry 没有失效,下次新建立相同连接的时候就可以使用保存的参数来初始化这个连接.通常情况下是关闭的。
net.ipv4.tcp_keepalive_time = 1200 当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
net.ipv4.tcp_syncookies = 1 当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_max_orphans = 262144 系统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_max_syn_backlog = 262144 表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,默认为1024,加大队列长度为262144,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_synack_retries = 2 为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。
net.ipv4.tcp_syn_retries = 2 在内核放弃建立连接之前发送SYN 包的数量
web服务器收到了大量的连接,在启用了iptables的情况下,iptables会把所有的连接都做链接跟踪处理,这样iptables就会有一个链接跟踪表
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=1800 链接跟踪表保存时间,单位:秒
net.ipv4.netfilter.ip_conntrack_max=131070 链接跟踪表最大数目
kernel.sysrq = 0 允许按住Alt + PrtSc键打印内核信息,除非是调试,一般要关闭此功能
kernel.core_uses_pid = 1 控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core
kernel.msgmnb = 65536 每个消息队列的最大字节限制。
kernel.msgmax = 65536 从一个进程发送到另一个进程的消息的最大长度(bytes)。进程间的消息传递是在内核的内存中进行的,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。
kernel.shmmax = 68719476736 表示内核所允许的最大共享内存段的大小(bytes)
kernel.shmall = 4294967296 系统上可以使用的共享内存的总量(bytes)
kernel.randomize_va_space = 1 将该值设置为 0 可禁用地址空间布局随机化。DB2 数据服务器依赖特定共享内存对象的固定地址,地址空间布局随机化会导致有些活动发生错误
net.ipv4.ip_forward = 0 0表示禁用 IPv4 包转送
net.ipv4.neigh.default.gc_stale_time=120 ARP参数,检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
/sbin/sysctl -p 生效
/sbin/sysctl -a | grep net.core.netdev_max_backlog 查看
如果出现error: "net.ipv4.netfilter.ip_conntrack_max" is an unknown key
执行下面的命令加载对应模块:
modprobe ip_conntrack
lsmod |grep conn -- if you see entries it means modules have been loaded correctly
sysctl -w -- to write the changes you made under /etc/sysctl.conf
sysctl -p -- to view the changes and see if it was actually loaded.
还不行,把net.ipv4.netfilter.ip_conntrack_max替换为:
net.nf_conntrack_max = 131070试试看
除了调整内核参数,还需调高系统允许打开的文件数才能支持大的并发,默认1024是远远不够的。
执行Shell命令:
echo ulimit -HSn 65536 >> /etc/rc.local
echo ulimit -HSn 65536 >>/root/.bash_profile
Windows:
打开注册表编辑器,在运行栏输入:regedit
第一步:启动注册表编辑器HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
第二步:新建
值名称:MaxUserPort
值类型: DWORD
值数据: 65534(用十进制的方法写进去就可以)
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
第三步:新建
值名称:TCPTimedWaitDelay
值类型: DWORD
值数据: 0000001e(也就是30,这个表示TIME_WAIT的秒数)
重启电脑
1
2
3
4
5
|
[root@localhost ~]
# netstat -n | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
CLOSE_WAIT 1348
ESTABLISHED 1240
TIME_WAIT 5621
[root@localhost ~]
#
|
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 #修改系統默认的 TIMEOUT 时间。表示如果套接字由本端要求关闭,这个参数决定了它保持在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.route.gc_timeout = 100 #路由缓存刷新频率, 当一个路由失败后多长时间跳到另一个默认是300
net.ipv4.tcp_syn_retries = 1 #对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右。
若果tomcat服务做完以上优化后还是存在大量ESTABLISHED没有被释放,初步推断是tomcat服务器回收session时出了问题,这个一般都跟服务器的Timeout设置有联系。
查看tomcat的配置文件 server.xml
1
2
3
4
5
6
|
<Connector executor=
"tomcatThreadPool"
port=
"80"
protocol=
"HTTP/1.1"
connectionTimeout=
"20000"
enableLookups=
"false"
redirectPort=
"8443"
maxHttpHeaderSize=
"8192"
maxThreads=
"1000"
processorCache=
"1000"
acceptCount=
"100"
minSpareThreads=
"100"
URIEncoding=
"UTF-8"
maxKeepAliveRequests=
"1"
/>
|
检查配置得出20000毫秒的时候acceptCount=”100” ,明显不合理,最大连接数也太小了。
connectionTimeout="20000" 改为 connectionTimeout="100"
acceptCount="100"改为acceptCount="5000"
如果程序连接了mysql,需要在程序代码中没有使用mysql.colse()。
本文转自 justin_peng 51CTO博客,原文链接:http://blog.51cto.com/ityunwei2017/1328353,如需转载请自行联系原作者