Skip to content

Latest commit

 

History

History
44 lines (30 loc) · 3.05 KB

File metadata and controls

44 lines (30 loc) · 3.05 KB

一些定位问题的命令

服务器一直都是用Linux系统,虽然每天都在使用,但由于命令繁多,命令的参数也繁多,遇到一些紧急问题时候一时半会记不起命令有那个参数,思路连接不到,或者几个命令思路串不起来了,一着急就用笨办法饶了几圈才解决。下面列出了一些定位问题时候常用到命令。


查看线程数

例如要查看某个java虚拟机进程下,有多少线程在运行,可以使用如下命令:

ps -eLF|grep -c 进程号

另外,jvm中栈空间是线程私有的,生命周期与线程一致,一个线程一份,参数-Xss 决定了每个线程分配空间大小。如果线程数过大,那么容易导致内存溢出,产生OutOfMemoryError. 例如,你没用线程池,来一个任务创建一个线程,当任务并行增多到1000个时候,若-Xss=1Mb,则这时候就会占用1000*1Mb内存。

统计计数

linux下经常会计算数量,例如从日志中访问最多的10个ip,或者某个端口的tcp连接数。

  • 例如要统计单个情况的数据,可以用:grep -c
  • 统计多个不同条件,可以用uniq -c
  • grep过滤时候,过滤条件的前后5行也显示出来grep -C5

查看网络流量

或许听过这样的话网卡被打满...流量太大了... 这时候可以用命令iostat -xm m表示以Mb来做单位。 ,有时候还需要看那个进程io最大,可以用iotop

占用cpu高进程

查看那个进程占用cpu高,可以用top -c ,然后按大些P,来降序排列。这里-c参数意义是,显示这条进程服务的详细信息,例如你机器上有好几个java服务,不加c的时候,TOP中COMMAND一栏只会看到 java 这4个字母,加了c后,就可以看到java命令的启动参数等详细信息,方便定位服务。

进程下线程的cpu信息

top -Hp 进程号命令可以帮助我们查看这个进程下产生的所有线程的详细top信息,例如cpu,内存占用,运行时间等。

java线程的堆栈信息

如果是java服务,我们通过上面命令,发现某个进程下的线程的cpu消耗过高,这时候我们可以用jstack 进程号|grep "16进制线程id" 来进一步获取这个线程的详细信息,定位到底是什么原因导致其cpu过高。

对了,我们用top -Hp 看到的线程号是10进制的,但jstack中是16进制,所以除了用心算外,还可以直接在shell下运行printf "%x\n" 十进制线程id %x就是结果用小写字母来表示16进制,\n就是换行。

java中查看内存快照时候注意:

例如要看下最耗内存的对象,可运行jmap -histo:live 13212 |more但该命令会导致一次FullGC,所以可别写进什么任务脚本中了,平时手动触发运行一两次到不碍事。 另外要看jvm堆栈配置信息可以用jmap -heap 123456,因为有些虚拟机参数但凭ps 是看不出来的。

man手册

有些命令参数实在没必要记,用的时候查看下Linux上的命令手册就行,方法man 命令q是退出