Linux系统下Java程序的监控
当一个程序部署到linux系统中后,除了我们常用的单元测试,系统测试来确保系统正确运行之外,我们还需要一些有效的方式能够实时监控系统运行的状态,及时的发现可能出现的问题,下文中总结了个人常用的一些系统命令。
进程监控流程如下:
获取进程的PID
1. PS命令
PS命令报告系统当前所有线程的一个镜像。常用选项为:
-e | -a :显示所有线程
-u: 按用户名和启动时间来显示进程
-x: 显示无控制终端的进程
-f:按树状格式来显示线程
这里只是使用ps的一个简单用法来获取pid :
ps –ef
输出内容为:
UID PID PPID C STIME TTY TIME CMD
比如我们查看hadoop namenode进程的结果如下:
这里看到了3个输出结果,依次是namenode,SecondaryNamenode,grep
当然我们感兴趣的是namenode ,所有pid是2113
获取了PID后,我们就可以对该进程的详细信息就行分析了:
l 进程内存使用情况
Top 命令:
本人机器默认输出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
其中和内存相关的选项为:
%MEM: 进程使用的物理内存百分比
VIRT:进程使用的虚拟内存总量
RES:进程是用的,未被换出的物理内存大小
Top命令最主要的系统监控命令,整个服务器的详细状态都可以在此获取,默认选项中已经可以满足日常使用了,在top输出界面上按f 可以进入显示项的选择界面,可以自定义输出的选项。在这个界面下需要选择什么选项择按对应字符则可,如p对应SWAP,标*号位当前显示的。
通过top的观察获取hadoop namenode进程(进程号2113)的内存使用情况
l 进程的CPU状况,同样从top命令的输出获取。
查看进程网络端口的打开情况
Netstat命令,常用选项为:
-a 显示所有,默认不显示LISTEN相关
-u 仅显示udp相关
-t 仅显示tcp相关
-l 仅列出Listen的服务
-p 显示相关的程序
如果我们确定的是某一个端口的情况的话,可以简单的netstat –a | grep 即可
这里主要是要使用-p选项将进程相关的连接都显示出来,判断进程的端口使用情况有没有异常:netstat –ap | grep 2113
显示了namenode 进程的网络连接情况
通过检查内存,CPU和网络状况也就能看出一个进程的健康状态了,如果出现异常,我们需要接下来针对Java程序的命令是进一步分析java应用的运行情况。
l 内存
Jmap 该命令能打印Java进程中对的配置,实用情况,对象信息。
Jmap –heap 2113 //打印namenode进程的队配置和使用情况
可以看到队的分配和新生代,老生代等分区的使用情况
我最常用的是-histo:live 选项,该选项会打印当前的活跃对象,可以检查内存中是否存在异常数量的对象。
。。。。。。。。。。。
最后会统计对象的个数,占用的空间。
结合持续观察top命令,发现内存的使用在持续增长或者居高不下的情况下使用jmap可以查看到究竟是什么对象占用了大量空间,或者得不到正确的释放。
l JVM线程
Jstack命令
该命令可以打印出Java程序当前的线程栈的信息。
。。。。。。。。
可以总体查看是否有异常的线程,或者是使用一些简单的命令来进行统计线程个数。如果程序出现异常的堵塞,也可以从线程的栈信息中查看出可能的阻塞操作,设置是死循环(啊!!)。
如: 统计IPC SERVER HANDLER的线程数量
另外再次强调下top命令的重要性,这里再把top命令的输出进行详细的描述。
top - 19:37:02 up 1:12, 2 users, load average: 0.00,0.00, 0.00
Tasks: 97 total, 1 running, 96 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 89.0%id, 11.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2071588k total, 500372kused, 1571216k free, 22912k buffers
Swap: 2064376k total, 0kused, 2064376k free, 169384k cached
Load average: 系统负载,任务队列的平均长度,三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。由输出可见当前并没有什么任务,如果值过高的话可能要考虑系统的承受能力或进行扩展了。
Tasks: 进程总数
1 running 正在运行的进程数
96 sleep 睡眠的进程数
0 stopped 停止数
0 zombie 僵尸数
CPU(s):
0.0%us, 用户占比
0.0%sy, 内核占比
0.0%ni, 进程空间内改变过优先级的进程的CPU占比
89.0%id, 空闲CPU占比
11.0%wa, 等待输入输出的CPU占比、这里可以看出系统的IO情况比较高
0.0%hi 硬中断, 0.0%si 软中断, 0.0%st 盗取时间
Mem:
2071588k total, 总物理内存
500372k used, 已用物理内存
1571216k free, 空闲内存
22912k buffers 内核缓存
Swap:
2064376ktotal, 交换区总量
0kused, 使用总量
2064376k free, 空闲总量
169384k cached 缓冲总量