您的位置:首页 > 运维架构 > Linux

Linux系统下Java程序的基本监控

2015-08-20 10:53 435 查看
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 缓冲总量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: