给系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:cpu、网络、内存、磁盘、运行日志、异常堆栈、 GC 日志、线程快照 ( threaddump/javacore 文件)、堆转储快照( heapdump/hprof 文件)等。经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。
1、系统工具
1.1、top
top命令用于显示所有运行和活跃的实时进程并定期更新它。它显示了cpu使用率,内存使用率,交换内存,缓存大小,缓冲区大小,进程pid,用户,命令等等。它也展示了运行进程的高cpu利用率和内存利用率。top命令对系统管理员监视和在需要的时候采取正确的行动是非常的重要。
top命令使用方法:
格式:top [-] [d] [p] [q] [c] [C] [S] [s] [n]
参数说明:
- d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
- p:通过指定监控进程ID来仅仅监控某个进程的状态。
- q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
- S:指定累计模式。
- s:使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
- i:使top不显示任何闲置或者僵死进程。
- c:显示整个命令行而不只是显示命令名。
top的内部命令:
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出 top
s – 改变画面更新周期
示例1:
https://www.cnblogs.com/sunshuhai/p/6250514.html
https://www.cnblogs.com/zk47/p/4261288.html
https://www.cnblogs.com/zhoug2020/p/6336453.html
1.2、htop
htop 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses。与Linux传统的top相比,htop更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。
htop相比较top的优势:
可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
在启动上比top 更快。
杀进程时不需要输入进程号。
htop 支持鼠标选中操作(反应不太快)。
top 已不再维护。
示例1:
示例2:
https://www.cnblogs.com/zangfans/p/8595000.html
https://blog.csdn.net/u011327981/article/details/78201208
https://www.sogou.com/link?url=hedJjaC291NVm6BbIVBZ6EkewZMrPH_RI_FFzAicPRHyNSHDNjHtute0NqN3DoLN0ztd7q5nl6o.
1.2、vmstat
vmstat 统计虚拟内存信息,可以对操作系统的proc、memory、CPU、IO等信息进行统计以呈现给用户。
vmstat语法:
- vmstat [-a] [-n] [delay [ count]]
- vmstat [-f] [-s] [-m]
- vmstat [-S unit]
- vmstat [-d]
- vmstat [-p disk_partition]
- vmstat [-V]
参数说明:
- [ -a ] 显示 活动(active)和 非活动(inactive)的内存。
- [ -n ] 只显示头信息,不周期性显示。这里没有测试出-n的作用,貌似有和没有,结果都一样。
- [ -f ] 显示自开机以来forks的总数,包括fork、vfork和clone system calls,总数和tasks创建的数量是一致的。
- [ -s ]显示各种事件计数器表和内存统计信息,这显示不重复。
- [ -m ]显示slabinfo,好像是缓存相关的,对这个完全不懂。可以对比一下/proc/slabinfo的内容。
- [ -V ]显示版本信息。
- [ -d ]显示磁盘数据(disk statistics)
- [ -D ]显示磁盘统计表(disk table)
- [ -S 单位 ]
k:1000
K:1024 (默认为K)
m:1000000
M:1048576
比较:k和K
- [ -p 分区 ]显示磁盘分区数据(disk partition statistics )
- [ delay [ count ] ] delay是间隔,count显示多少次信息。可以和上面的某些参数结合使用。
示例1:
示例2:
https://www.cnblogs.com/chenwenbiao/archive/2011/10/26/2224733.html
https://blog.csdn.net/frankarmstrong/article/details/54313727
http://blog.chinaunix.net/uid-25505925-id-191966.html
https://www.cnblogs.com/tommyli/p/3746187.html
1.3、tcpdump
tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。 tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuy4yKaqZiSHtWC8ug8Cuw59om3Pojx-sH_OBXJDiYuRkTiYSK4ioE2I4.
https://www.cnblogs.com/maifengqiang/p/3863168.html
https://www.runoob.com/linux/linux-comm-tcpdump.html
1.4、netstat
Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
netstat常见参数:
- -a (all) 显示所有选项,默认不显示LISTEN相关。
- -t (tcp) 仅显示tcp相关选项。
- -u (udp) 仅显示udp相关选项。
- -n 拒绝显示别名,能显示数字的全部转化成数字。
- -l 仅列出有在 Listen (监听) 的服务状态。
- -p 显示建立相关链接的程序名
- -r 显示路由信息,路由表
- -e 显示扩展信息,例如uid等
- -s 按各个协议进行统计
- -c 每隔一个固定时间,执行该netstat命令。
LISTEN和LISTENING的状态只有用-a或者-l才能看到。
netstat网络状态详解:
一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手。
- SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
- ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
- FIN:(结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
- LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN, The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 。
- SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接,之后状态置为SYN_SENT,The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求。
- SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN, 之后状态置为SYN_RECV ,
- A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 。
- ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了, The socket has an established connection. 代表一个打开的连接,数据可以传送给用户。
- FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态。 The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认。
- CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT, The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 。
- FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 , Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求。
- LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK , The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认。
- TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。 The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认。
- CLOSING:比较少见, Both sockets are shut down but we still don’t have all our data sent. 等待远程TCP对连接中断的确认。
- CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束, The socket is not being used. 没有任何连接状态。
- TIME_WAIT状态的形成只发生在主动关闭连接的一方。
- 主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT,而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。