Netstat简介
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
输出linux系统的网络情况信息,以前面试的时候还被问过:“如何查看占用某个端口的程序的pid?”,这个问题实际用netstat -anp
输出,然后再grep一下即可。
基本格式 netstat [option]
-
-a
显示所有socket连接 -
-l
显示监控中(listening)的socket连接 -
-n
直接使用ip地址,而不使用域名服务器 -
-p
显示正在使用socket的程序的pid和名称 -
-r
打印路由表 -
-t
显示TCP传输协议的连线状况 -
-u
显示UDP传输协议的连线状况 -
-s
显示网络工作信息统计表
执行netstat命令,netstat的输出结果可以分为两个部分:
一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。
常见参数
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项 -n 拒绝显示别名,能显示数字的全部转化成数字。 -l 仅列出有在 Listen (监听) 的服務状态-p 显示建立相关链接的程序名
-r 显示路由信息,路由表 -e 显示扩展信息,例如uid等 -s 按各个协议进行统计 -c 每隔一个固定时间,执行该netstat命令。提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
1. 列出所有端口 (包括监听和未监听的)
列出所有端口 netstat -a
# netstat -a | more Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:30037 *:* LISTEN udp 0 0 *:bootpc *:* Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 6135 /tmp/.X11-unix/X0 unix 2 [ ACC ] STREAM LISTENING 5140 /var/run/acpid.socket
查看631端口
[root ~]# netstat -anpt | grep 631
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1218/cupsd tcp 0 0 ::1:631 :::* LISTEN 1218/cupsd
列出所有 tcp 端口 netstat -at
# netstat -at Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:30037 *:* LISTEN tcp 0 0 localhost:ipp *:* LISTEN tcp 0 0 *:smtp *:* LISTEN tcp6 0 0 localhost:ipp [::]:* LISTEN
列出所有 udp 端口 netstat -au
# netstat -au Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:bootpc *:* udp 0 0 *:49119 *:* udp 0 0 *:mdns *:*
显示程序的pid和名称
netstat -anp
输出本机路由表
netstat -r
输出监听状态中的tcp协议统计信息
netstat -lts
2. 列出所有处于监听状态的 Sockets
只显示监听端口 netstat -l
# netstat -l Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:ipp *:* LISTEN tcp6 0 0 localhost:ipp [::]:* LISTEN udp 0 0 *:49119 *:*
只列出所有监听 tcp 端口 netstat -lt
# netstat -lt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:30037 *:* LISTEN tcp 0 0 *:smtp *:* LISTEN tcp6 0 0 localhost:ipp [::]:* LISTEN
只列出所有监听 udp 端口 netstat -lu
# netstat -lu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:49119 *:* udp 0 0 *:mdns *:*
只列出所有监听 UNIX 端口 netstat -lx
# netstat -lx Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 6294 private/maildrop unix 2 [ ACC ] STREAM LISTENING 6203 public/cleanup unix 2 [ ACC ] STREAM LISTENING 6302 private/ifmail unix 2 [ ACC ] STREAM LISTENING 6306 private/bsmtp
显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su
# netstat -st # netstat -su
3. 在 netstat 输出中显示 PID 和进程名称 netstat -p
netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。
# netstat -pt Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 1 0 ramesh-laptop.loc:47212 192.168.185.75:www CLOSE_WAIT 2109/firefox
tcp 0 0 ramesh-laptop.loc:52750 lax:www ESTABLISHED 2109/firefox
4. 找出程序运行的端口
并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。
# netstat -ap | grep ssh tcp 1 0 dev-db:ssh 101.174.100.22:39213 CLOSE_WAIT - tcp 1 0 dev-db:ssh 101.174.100.22:57643 CLOSE_WAIT -
找出运行在指定端口的进程
# netstat -an | grep ':80'
netcat
nc -vv IP 端口号:意思是只显示该 IP 地址的某端口是否处于正常状态(succeeded:成功,Connection refused:连接拒绝)
nc -z IP 端口号; echo $?:意思是判断该 IP 地址的某端口是否有误(0:无误,1:有误)
[root@localhost ~]# nc -vv 192.168.1.127 22Connection to 192.168.1.127 22 port [tcp/ssh] succeeded!SSH-2.0-OpenSSH_5.3[root@localhost ~]# nc -z 192.168.1.127 22; echo $?Connection to 192.168.1.127 22 port [tcp/ssh] succeeded!0[root@localhost ~]# nc -vv 192.168.1.127 3306nc: connect to 192.168.1.127 port 3306 (tcp) failed: Connection refused
lsof
lsof 查看端口占用语法格式:lsof -i :端口号
[root@localhost ~]# lsof -i:631COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEcupsd 1218 root 6u IPv6 12257 0t0 TCP localhost:ipp (LISTEN)cupsd 1218 root 7u IPv4 12258 0t0 TCP localhost:ipp (LISTEN)cupsd 1218 root 9u IPv4 12261 0t0 UDP *:ipp
端口扫描工具
nmap 127.0.0.1 不加任何参数将以默认的方式扫描 127.0.0.1 主机的开放端口和服务名称。
使用 -sT 参数尝试同目标主机的每个 TCP 端口建立连接、观察有哪些端口处于开放状态以及所运行的有哪些服务;
例如:扫描 GitHub 网站,看看存在哪些开放的端口。
[root@localhost ~]# nmap -sT www.github.comStarting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:24 CSTNmap scan report for www.github.com (52.74.223.119)Host is up (0.15s latency).rDNS record for 52.74.223.119: ec2-52-74-223-119.ap-southeast-1.compute.amazonaws.comNot shown: 996 filtered portsPORT STATE SERVICE22/tcp open ssh80/tcp open http443/tcp open https9418/tcp open gitNmap done: 1 IP address (1 host up) scanned in 70.72 seconds
扫描指定的 IP ,看看存在哪些开放的端口。
[root@localhost ~]# nmap -sT 220.181.38.150Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:40 CSTNmap scan report for 220.181.38.150Host is up (0.0056s latency).Not shown: 999 filtered portsPORT STATE SERVICE443/tcp open httpsNmap done: 1 IP address (1 host up) scanned in 4.64 seconds
-
-O 参数:探测主机操作系统;
-
-sV 参数:探测端口上运行的软件;
通过上述两项参数,结合在一起,扫描 baidu 网站主机操作系统和扫描出的端口上运行着什么软件?
扫描后,我们可以看出端口号为:80 和 443 所运行着 Microsoft Windows UPnP(微软视窗)的软件
[root@localhost ~]# sudo nmap -O -sV www.baidu.comStarting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:32 CSTNmap scan report for www.baidu.com (220.181.38.150)Host is up (0.015s latency).Other addresses for www.baidu.com (not scanned): 220.181.38.149Not shown: 998 filtered portsPORT STATE SERVICE VERSION80/tcp open upnp Microsoft Windows UPnP443/tcp open ssl/upnp Microsoft Windows UPnPWarning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed portDevice type: switchRunning: HP embeddedOS details: HP 4000M ProCurve switch (J4121A)Service Info: OS: WindowsOS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 22.87 seconds
通过上述扫描域名的方式以外,也可以采用 IP 的方式来进行扫描指定主机的操作系统和端口上所运行的软件;
[root@localhost ~]# sudo nmap -O -sV 220.181.38.150Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:35 CSTNmap scan report for 220.181.38.150Host is up (0.015s latency).Not shown: 998 filtered portsPORT STATE SERVICE VERSION80/tcp open upnp Microsoft Windows UPnP443/tcp open ssl/upnp Microsoft Windows UPnPWarning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed portDevice type: switchRunning (JUST GUESSING): HP embedded (86%)Aggressive OS guesses: HP 4000M ProCurve switch (J4121A) (86%)No exact OS matches for host (test conditions non-ideal).Service Info: OS: WindowsOS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 21.82 seconds
-
-sS 参数:通过向目标的某一个端口发送 TCP SYN 包,然后根据对方不同的回应来判断该端口是否处于监听状态。
[root@localhost ~]# nmap -sS www.github.comStarting Nmap 5.51 ( http://nmap.org ) at 2019-05-28 05:03 CSTNmap scan report for www.github.com (13.229.188.59)Host is up (0.15s latency).rDNS record for 13.229.188.59: ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.comNot shown: 996 filtered portsPORT STATE SERVICE22/tcp open ssh80/tcp open http443/tcp open https9418/tcp open gitNmap done: 1 IP address (1 host up) scanned in 32.39 seconds
-
-sA 参数是 TCP ACK 扫描,只用来确定防火墙的规则集,本身并不扫描目标主机的端口。
[root@localhost ~]# nmap -sA www.newrank.cnStarting Nmap 5.51 ( http://nmap.org ) at 2019-05-28 05:25 CSTNmap scan report for www.newrank.cn (47.99.2.204)Host is up (0.029s latency).All 1000 scanned ports on www.newrank.cn (47.99.2.204) are filteredNmap done: 1 IP address (1 host up) scanned in 17.63 seconds
-
-sW 参数类似于 TCP ACK 扫描,可以检测到处于打开状态的端口。
[root@localhost ~]# nmap -sW www.newrank.cnStarting Nmap 5.51 ( http://nmap.org ) at 2019-05-28 05:55 CSTNmap scan report for www.newrank.cn (47.99.2.204)Host is up (0.032s latency).All 1000 scanned ports on www.newrank.cn (47.99.2.204) are filteredNmap done: 1 IP address (1 host up) scanned in 46.43 seconds
-
-PN 参数是强制 nmap 对这类主机进行扫描。
[root@localhost ~]# nmap -sT -PN 220.181.38.150Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:41 CSTNmap scan report for 220.181.38.150Host is up (0.0053s latency).Not shown: 998 filtered portsPORT STATE SERVICE80/tcp open http443/tcp open httpsNmap done: 1 IP address (1 host up) scanned in 4.00 seconds
[root@localhost ~]# nmap -sT -PN -p1-5000 192.168.1.127Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:51 CSTNmap scan report for 192.168.1.127Host is up (0.00058s latency).Not shown: 4998 closed portsPORT STATE SERVICE22/tcp open ssh111/tcp open rpcbindNmap done: 1 IP address (1 host up) scanned in 0.25 seconds
除上述参数之外,还有一些不常用的参数。
例如:
-
-sF:向目标发送 TCP FIN 包,根据目标的响应进行判断;
[root@localhost ~]# nmap -sF www.newrank.cn
-
-sX:向目标发送 TCP NULL 包,根据目标的响应进行判断;
[root@localhost ~]# nmap -sX www.newrank.cn
-
-sN:向目标发送 FIN、PSH、URG 的包,根据目标的响应进行判断;
[root@localhost ~]# nmap -sN www.newrank.cn
-
-sR:用于确认是否是 RPC 端口;
[root@localhost ~]# nmap -sR www.newrank.cn
-
-sU:确认哪些是 UDP 端口处于开放的;
[root@localhost ~]# nmap -sU www.newrank.cn
-
-sP:向目标发送 TCP ACK 的包,如果有响应,则表明目标处于活动状态;
[root@localhost ~]# nmap -sP www.newrank.cn
5、linux中如何查询端口被占用的情况
1、lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000
可以看到8000端口已经被轻量级文件系统转发服务lwfs占用
2、netstat -tunlp |grep 端口号,用于查看指定的端口号的进程情况,如查看8000端口的情况,netstat -tunlp |grep 8000
说明一下几个参数的含义:
附加一个python端口占用监测的程序,该程序可以监测指定IP的端口是否被占用。
该程序执行结果如下:
6、服务器被攻击常用命令
1,查看80端口连接数:
netstat -nat|grep -i "80" |wc -l2,对连接的IP按连接数量进行排序:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n3,用tcpdump嗅探80端口的访问看看谁最高:
tcpdump -i eth0 -tnn dst port 80 -c 10004,iptables屏蔽ip:
- 如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
- 屏蔽单个IP的命令是 iptables -I INPUT -s 123.45.6.7 -j DROP
- 封整个段即从123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP
- 封IP段即从123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP
- 封IP段即从123.45.6.1到123.45.6.254的命令是 iptables -I INPUT -s 123.45.6.0/24 -j DROP
5,对于web服务器(Nginx、Apache等)来说,并发连接数是一个比较重要的参数,下面就通过netstat命令和awk来查看web服务器的并发连接数以及TCP连接状态。
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(key in S) print key,"\t",S[key]}' FIN_WAIT2 38 CLOSING 3 SYN_RECV 1 CLOSE_WAIT 1 TIME_WAIT 261 ESTABLISHED 71 LAST_ACK 2 FIN_WAIT1 9参数解释:CLOSED 无连接是活动的或正在进行 LISTEN 服务器在等待进入呼叫 SYN_RECV 一个连接请求已经到达,等待确认 SYN_SENT 应用已经开始,打开一个连接 ESTABLISHED 正常数据传输状态/当前并发连接数 FIN_WAIT1 应用说它已经完成 FIN_WAIT2 另一边已同意释放 ITMED_WAIT 等待所有分组死掉 CLOSING 两边同时尝试关闭 TIME_WAIT 另一边已初始化一个释放 LAST_ACK 等待所有分组死掉ESTABLISHED参数后面的值就是当前系统的并发连接数了。
6. 在 netstat 输出中显示 PID 和进程名称 netstat -p
netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。
# netstat -pt Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 1 0 ramesh-laptop.loc:47212 192.168.185.75:www CLOSE_WAIT 2109/firefox tcp 0 0 ramesh-laptop.loc:52750 lax:www ESTABLISHED 2109/firefox
7. 在 netstat 输出中不显示主机,端口和用户名 (host, port or user)
当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。
同样可以加速输出,因为不用进行比对查询。
# netstat -an
如果只是不想让这三个名称中的一个被显示,使用以下命令
# netsat -a --numeric-ports# netsat -a --numeric-hosts# netsat -a --numeric-users
8. 持续输出 netstat 信息
netstat 将每隔一秒输出网络信息。
# netstat -c Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 ramesh-laptop.loc:36130 101-101-181-225.ama:www ESTABLISHED tcp 1 1 ramesh-laptop.loc:52564 101.11.169.230:www CLOSING tcp 0 0 ramesh-laptop.loc:43758 server-101-101-43-2:www ESTABLISHED tcp 1 1 ramesh-laptop.loc:42367 101.101.34.101:www CLOSING ^C
8. 显示系统不支持的地址族 (Address Families)
netstat --verbose
在输出的末尾,会有如下的信息
netstat: no support for `AF IPX' on this system.netstat: no support for `AF AX25' on this system.netstat: no support for `AF X25' on this system.netstat: no support for `AF NETROM' on this system.
9、显示核心路由信息 netstat -r
# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.1.0 * 255.255.255.0 U 0 0 0 eth2 link-local * 255.255.0.0 U 0 0 0 eth2 default 192.168.1.1 0.0.0.0 UG 0 0 0 eth2
注意: 使用 netstat -rn 显示数字格式,不查询主机名称。
10. 找出程序运行的端口
并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。
# netstat -ap | grep ssh tcp 1 0 dev-db:ssh 101.174.100.22:39213 CLOSE_WAIT - tcp 1 0 dev-db:ssh 101.174.100.22:57643 CLOSE_WAIT -
找出运行在指定端口的进程
# netstat -an | grep ':80'
11. 显示网络接口列表
# 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 0 0 0 0 0 0 0 0 BMU eth2 1500 0 26196 0 0 0 26883 6 0 0 BMRU lo 16436 0 4 0 0 0 4 0 0 0 LRU
显示详细信息,像是 ifconfig 使用 netstat -ie:
# netstat -ie Kernel Interface table eth0 Link encap:Ethernet HWaddr 00:10:40:11:11:11 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Memory:f6ae0000-f6b00000
12. IP和TCP分析
查看连接某服务端口最多的的IP地址
wss8848@ubuntu:~$ netstat -nat | grep "192.168.1.15:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -2018 221.136.168.363 154.74.45.2422 78.173.31.2362 62.183.207.982 192.168.1.142 182.48.111.2152 124.193.219.342 119.145.41.22 114.255.41.301 75.102.11.99
TCP各种状态列表
wss8848@ubuntu:~$ netstat -nat |awk '{print $6}'established)ForeignLISTENTIME_WAITESTABLISHEDTIME_WAITSYN_SENT
先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。
wss8848@ubuntu:~$ netstat -nat |awk '{print $6}'|sort|uniq -c143 ESTABLISHED1 FIN_WAIT11 Foreign1 LAST_ACK36 LISTEN6 SYN_SENT113 TIME_WAIT1 established)
最后的命令如下:
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
分析access.log获得访问前10位的ip地址
awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10
13. 查看某个IP地址链接数
问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服务各种连接状态(TIME_WAIT/ CLOSE_WAIT/ ESTABLISHED)的连接数。
参考答案:
-
netstat -n | grep 1.2.3.4:22 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
-
netstat -lnpta | grep ssh | egrep “TIME_WAIT | CLOSE_WAIT | ESTABLISHED”
14、从已经备份好的日志中查询数据
问题:从已备份的suyun.2017-06-26.log.bz2日志中,找出包含关键字1.2.3.4的日志有多少条。
参考答案:
-
bzcat suyun.2017-06-26.log.bz2 | grep '1.2.3.4' | wc -l
-
bzgrep '1.2.3.4' suyun.2017-06-26.log.bz2 | wc -l
-
less suyun.2017-06-26.log.bz2 | grep '10.37.9.11' | wc -l
说明:线上日志文件一般以bz2 压缩之后保留,如果解压查询,非常耗空间与时间,bzcat和bzgrep是研发同学必须掌握的工具。
15、备份服务的技巧
问题:打包备份/opt/web/suyun_web目录,排除掉目录中的logs和目录,打包好的文件存放在/opt/backup目录下。
参考答案:
tar -zcvf /opt/backup/shenjian.tar.gz \
-exclude /opt/web/suyun_web/logs \
/opt/web/suyun_web
说明:这个命令线上应用较为频繁,在项目需要打包迁移时,常常需要排除掉日志目录,exclude是需要掌握的参数
16、查询线程数
问题:查询服务器运行服务的总线程数,当机器线程数超报警阀值时,能快速查出相关进程及线程信息。
参考答案:
-
ps -eLf | wc -l
-
pstree -p | wc -l
17、磁盘报警,清空最大文件
问题:找出服务器上,某个正在运行的tomcat产生的大量异常日志,找出该文件,并释放空间。不妨设该文件包含log关键字,并且大于1G。
参考答案:
第一步,找到该文件
-
find / -type f -name "*log*" | xargs ls -lSh | more
-
du -a / | sort -rn | grep log | more
-
find / -name '*log*' -size +1000M -exec du -h {} \;
第二步,将文件清空
假设找到的文件为a.log
正确的情况方式应该为:echo "">a.log,文件空间会立刻释放。
很多同学:rm -rf a.log,这样文件虽然删除,但是因tomcat服务仍在运行,空间不会立刻释放,需要重启tomcat才能将空间释放。
18、显示文件,过滤注释
问题:显示server.conf 文件,屏蔽掉#号开头的注释行
参考答案:
-
sed -n '/^[#]/!p' server.conf
-
sed -e '/^#/d' server.conf
-
grep -v "^#" server.conf
19、磁盘IO异常排查
问题:磁盘IO异常如何排查,类似写入慢或当前使用率较高,请查出导致磁盘IO异常高的进程ID。
参考答案:
第一步:iotop -o 查看当前正在写磁盘操作的所有进程ID信息。
第二步:如果此时各项写入指标都很低,基本没有大的写入操作,则需要排查磁盘自身。可以查看系统dmesg或cat /var/log/message 看看是否有相关的磁盘异常报错,同时可以在写入慢的磁盘上touch 一个空文件看看,是否磁盘故障导致无法写入。
linux下追查线上问题常用命令
20、查占用cpu最多的进程
实际命令:
ps H -eo pid,pcpu | sort -nk2 | tail
执行效果如下:
[work ~]$ ps H -eo pid,pcpu | sort -nk2 | tail
31396 0.6
31396 0.6
31396 0.6
31396 0.6
31396 0.6
31396 0.6
31396 0.6
31396 0.6
30904 1.0
30914 1.0
结果:
瞧见了吧,最耗cpu的pid=30914(实际上是31396)
方法二:
核心指令:top
实际命令:
top
Shift + t
21、在上面20的基础上,对应的服务名是什么呢
方法一:
核心指令:ps
实际命令:
ps aux | fgrep pid
执行效果如下:
[work ~]$ ps aux | fgrep 30914
work 30914 1.0 0.8 309568 71668 ? Sl Feb02 124:44 ./router2 –conf=rs.conf
结果:
瞧见了吧,进程是./router2
方法二:
核心指令:…无,直接查proc
实际命令:
ll /proc/pid
执行效果如下:
[work ~]$ ll /proc/30914
lrwxrwxrwx 1 work work 0 Feb 10 13:27 cwd -> /home/work/im-env/router2
lrwxrwxrwx 1 work work 0 Feb 10 13:27 exe -> /home/work/im-env/router2/router2
结果:
这个好,全路径都出来了
22、查看某个端口的连接情况
方法一:
核心指令:netstat
实际命令:
netstat -lap | fgrep port
执行效果如下:
[work ~]$ netstat -lap | fgrep 22022
tcp 0 0 10.58.xxx.29:22022 *:* LISTEN 31396/imui
tcp 0 0 10.58.xxx.29:22022 10.58.xxx.29:46642 ESTABLISHED 31396/imui
tcp 0 0 10.58.xxx.29:22022 10.58.xxx.29:46640 ESTABLISHED 31396/imui
方法二:
核心指令:lsof
实际命令:
lsof -i :port
执行效果如下:
[work ~]$ /usr/sbin/lsof -i :22022
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
router 30904 work 50u IPv4 69065770 TCP 10.58.xxx.29:46638->10.58.xxx.29:22022 (ESTABLISHED)
router 30904 work 51u IPv4 69065772 TCP 10.58.xxx.29:46639->10.58.xxx.29:22022 (ESTABLISHED)
router 30904 work 52u IPv4 69065774 TCP 10.58.xxx.29:46640->10.58.xxx.29:22022 (ESTABLISHED)
23、使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:
答 :
# netstat-n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
这个命令会输出类似下面的结果:
LAST_ACK16
SYN_RECV348
ESTABLISHED70
FIN_WAIT1229
FIN_WAIT230
CLOSING33
TIME_WAIT18098
我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。
编辑配置文件:/etc/sysctl.conf,在这个文件中,加入下面的几行内容:
# 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
输入下面的命令,让内核参数生效:
# sysctl-p
简单的说明上面的参数的含义:
net.ipv4.tcp_syncookies= 1
表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse= 1
表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle= 1
表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout
修改系統默认的TIMEOUT 时间。
在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。
此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:
net.ipv4.tcp_keepalive_time= 1200
net.ipv4.ip_local_port_range= 1024 65535
net.ipv4.tcp_max_syn_backlog= 8192
net.ipv4.tcp_max_tw_buckets= 5000
这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。
net.ipv4.tcp_keepalive_time= 1200
表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
ip_local_port_range= 1024 65535
表示用于向外连接的端口范围。缺省情况下很小,改为1024到65535。
net.ipv4.tcp_max_syn_backlog= 8192
表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets= 5000
表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000,改为5000。此项参数可以控制TIME_WAIT的最大数量,只要超出了。
24、
25、
26、
27、
28、
29、
30、
参考链接 :
https://www.cnblogs.com/itech/archive/2012/09/09/2678041.html
https://mp.weixin.qq.com/s/OSN14MFsznIE851ypvQE0A
作者:
出处:作者:流水莫须
链接:https://www.jianshu.com/p/d9fe6be01667 來源:简书