Linux系统监控命令及定位Java线程

简介:

1.PID、TID的区分

uid是user id,即用户id,root用户的uid是0,0为最高权限,
gid是group id,用户组id,使用 id 命令可以很简单的通过用户名查看UID、GID:
~$ id bingyue
uid=1000(bingyue) gid=1000(bingyue) groups=1000(bingyue)
~$ id root
uid=0(root) gid=0(root) groups=0(root)
pid是process id,即进程id,可以通过pid找到这个进程的uid,
tid是thead id,可以理解为线程的id。

2.常用的系统监控命令

top查看活动进程信息
top 命令显示当前的活动进程,默认它是按占用CPU 的多少进行排序,每5秒钟刷新一次列表,
你也可以选择不同的排序方式,例如 m 是按内存占用方式进行排序的快捷键。

iostat命令查看磁盘读取情况
iostat 命令用来显示存储子系统的详细信息,通常用它来监控磁盘 I/O 的情况。
要特别注意 iostat 统计结果中的 %iowait 值,太大了表明你的系统存储子系统性能低下。

使用meminfo查看内存信息
meminfo 包含了内存的详细信息,可以使用 cat 和 grep 命令来显示 meminfo 信息:
cat /proc/meminfo

使用free命令动态查看内存信息
可以使用 free 命令来显示动态的内存使用信息,free 查看大概的内存信息,而 meminfo 提供的信息更加详细。

lsof命令查看打开文件和端口等的列表
lsof 命令对于很多 Linux/Unix 系统都可以使用,主要以列表的形式显示打开的文件和进程。
打开的文件主要包括磁盘文件、网络套接字、管道、设备和进程。
使用这个命令的主要原因是一个一个盘不能卸载并且显示文件正在使用或者打开的错误信息。这个命令很容易看出哪些文件正在使用。

使用mpstat查看cpu信息
mpstat mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。
默认可能没有安装,需要安装后使用。

在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。

使用pmap查看某进程的内存使用情况
pmap 命令用来报告每个进程占用内存的详细情况,可用来看是否有进程超支了,该命令需要进程 id 作为参数。
pmap pid

使用ps 和 pstree查看进程列表
ps 和 pstree 命令都可以用来列表展示正在运行的所有进程。ps 告诉你每个进程占用的内存和 CPU 处理时间,而 pstree 显示的信息没那么详细,但它以树形结构显示进程之间的依赖关系,包括子进程信息。一旦发现某个进程有问题,你可以使用 kill 来杀掉它。


netstat网络信息
Netstat 和 ps 命令类似,显示了大量跟网络相关的信息,例如 socket 的使用、路由、接口、协议、网络等等。

strace
strace 可以记录进程进行系统调用的详情,因此它也是一个非常好的诊断工具,例如你可以使用它来找出某个程序正在打开某个配置文件。
Strace 在跟踪某个进程时会让该进程的性能变得非常差,因此请谨慎使用。

vmstat
你可以使用 vmstat 来监控虚拟内存,一般 Linux 上的开发者喜欢使用虚拟内存来获得最佳的存储性能。该命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这些统计信息(所有的处理器中)都计算出以百分比表示的平均值,或者计算其总和。


uptime
uptime 命令告诉你这台服务器从开机启动到现在已经运行了多长时间了。同时也包含了从启动到现在服务器的平均负载情况

3.常用的监控工具

htop — 进程监控
htop 是一个更加先进的交互式的实时监控工具。htop 与 top 命令非常相似,但是他有一些非常丰富的功能,如用户友好界面管理进程、快捷键、横向和纵向进程等更多的。htop 是一个第三方工具并不包括在 Linux 系统中,你需要使用包管理工具进行安装。

iotop — 监控 Linux 磁盘 I/O
iotop 也是和 top 和 htop 命令相似,但是它会有一个报告功能去监控和显示实时的磁盘 I/O 输入和输出和程序进程。这个工具对于查找精确的高的磁盘读/写过程是非常有用的。

nmon即奈吉尔性能监视器 
Nmon是 Nigel's Monitor 的缩写,是一个使用很普遍的开源工具,用来监视 Linux 系统的所有资源包括:CPU、内存、磁盘使用率、网络上的进程、NFS、内核等等,并且提供了一个图形化的工具。

tcpdump — 网络数据包分析器

Tcpdump 是一个简单、可靠的网络监控工具,用来做基本的协议分析,看看那些进程在使用网络以及如何使用网络。
如果需要获取详细的信息,可以使用 Wireshark 。

4.Linux监控常用的操作

netstat -natp : 查看对应的网络链接
lsof -p pid : 查找对应pid的文件句柄
lsof -i : 80 : 查找对应端口被哪个进程占用
lsof /tmp/1.txt :查找对应文件被哪个进程占用

查看所有存在的线程:
ps xH
手册中说:H Show threads as if they were processes

查看一个进程起的线程数:
ps -mp <PID>
手册中说:m Show threads after processes

5.找到最耗CPU的Java线程

首先使用top等命令找到jvm进程的pid,
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3853 weblogic 18 0 9268m 4.1g 10m S 34.4 6.5 1301:04 java

当前jvm进程的pid是3853,通过jstack命令dump出当前的jvm进程的堆栈信息:
jstack 3853 >> /tmp/jstack0330.txt

然后使用下面的命令:
ps -mp pid -o THREAD,tid,time
或者
ps -Lfp pid
这个命令的作用,主要是可以获取到对应一个进程下的线程的一些信息:
$ ps -mp 3853 -o THREAD,tid,time
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
weblogic 29.3 - - - - - - 21:40:17
weblogic 10.7 24 - 184467 - - 13979 07:39:06

通过 printf "%x\n" 13979 可以将线程id转化成16进制表示, 
继续通过grep命令即可以查到对应16进制的线程id信息:
grep 369b /tmp/jstack0330.txt

堆栈信息中的nid对应的linux操作系统下的tid,就是线程id对应的16进制数字,
tid则是jvm的jmm内存规范中的唯一地址定位。

使用grep -A ,可以显示匹配行和之后的几行,
继续查看线程所在堆栈信息中前后的部分:
grep 369b /tmp/jstack0330.txt -A 10
就可以定位到相关的代码位置。

 


本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/3653452.html,如需转载请自行联系原作者

目录
打赏
0
0
0
0
49
分享
相关文章
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
133 67
调试技巧 - 用Linux命令排查Java问题
总的来说,使用Linux命令来排查Java问题,需要一定的实践经验和理论知识。然而,只要我们愿意花时间深入了解这些工具,我们就能够熟练地使用它们来分析和解决问题。此外,这些工具只是帮助我们定位问题,真正解决问题需要我们对Java和JVM有深入的理解,并能够读懂和分析代码。
65 13
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
175 30
|
3月前
|
Java中执行命令并使用指定配置文件的最佳实践
通过本文的介绍,您可以了解如何在Java中使用 `ProcessBuilder`执行系统命令,并通过指定配置文件、设置环境变量和重定向输入输出流来控制命令的行为。通过这些最佳实践,可以确保您的Java应用程序在执行系统命令时更加健壮和灵活。
62 7
|
3月前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
70 17
|
3月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
69 26
|
7月前
|
JAVA 常用的 DOS 命令
【10月更文挑战第15天】DOS 命令是 Java 开发中不可或缺的工具,掌握这些命令可以提高开发效率和操作便利性。
145 63
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
106 6

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等