服务器一直都是用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高,可以用top -c ,然后按大些P,来降序排列。这里-c参数意义是,显示这条进程服务的详细信息,例如你机器上有好几个java服务,不加c的时候,TOP中COMMAND一栏只会看到 java 这4个字母,加了c后,就可以看到java命令的启动参数等详细信息,方便定位服务。
top -Hp 进程号命令可以帮助我们查看这个进程下产生的所有线程的详细top信息,例如cpu,内存占用,运行时间等。
如果是java服务,我们通过上面命令,发现某个进程下的线程的cpu消耗过高,这时候我们可以用jstack 进程号|grep "16进制线程id" 来进一步获取这个线程的详细信息,定位到底是什么原因导致其cpu过高。
对了,我们用top -Hp 看到的线程号是10进制的,但jstack中是16进制,所以除了用心算外,还可以直接在shell下运行printf "%x\n" 十进制线程id %x就是结果用小写字母来表示16进制,\n就是换行。
例如要看下最耗内存的对象,可运行jmap -histo:live 13212 |more ,但该命令会导致一次FullGC,所以可别写进什么任务脚本中了,平时手动触发运行一两次到不碍事。
另外要看jvm堆栈配置信息可以用jmap -heap 123456,因为有些虚拟机参数但凭ps 是看不出来的。
有些命令参数实在没必要记,用的时候查看下Linux上的命令手册就行,方法man 命令。q是退出