前言
对于服务端应用,我们常会遇到机器load过高,服务无响应,磁盘打满,网络堵塞等等问题,对于这些问题,我们需要从服务器本身找出根源所在,然后再着手解决,本文主要介绍了用于定位这一系列问题的命令。
内存占用比例
通过top命令,我们可以查看目前内存使用比例,其中,每一行就是一个进程的状态,具体字段解释如下
| PID | 进程ID |
|---|---|
| VIRT | 申请的虚拟内存总量 |
| RES | 使用的物理内存总和 |
| SHR | 占用共享内存大小 |
关于虚拟内存和物理内存的解释,可以看这里。
关于top命令的底层实现,可以看这里
如上图所示,通过top命令,我们就能够看到PID为1的进程占用了1.6G的物理内存。在进程多的情况下,如果我们需要进行排序,还可以通过shift + f进行如下选择页面,然后选择指定的项目进行排序展示。
此外,我们还可以通过free命令,来查看系统当前空闲和已用内存。另外,可以通过free -m,free -g来控制其展示的单位。
CPU占用时间查询
查询CPU时间的时候,我们主要使用的仍然是top命令。通过top命令,选择CPU时间排序,就可以得到占用CPU最长的进程PID。但还有另外一个场景,我们需要查询进程中的子线程中最耗时的,这个时候就需要加参数适用top命令了。
top -H -p <pid> 通过这个命令,我们可以看到这个进程底下占用CPU时间最多的线程。
展示的pid就是线程id,如果是java程序应用中需要进行排查的话,我们还需要通过printf '%x\n' <tid>来将其转换为16进制。转换成16进制后,我们只需要 通过jstack <pid> | grep nid=0x<16进制的tid> -A 50就能够查看到具体占用cpu的堆栈信息。
网络查询
对于微服务应用,偶尔会出现不可达(健康检查失败)的情况,这有两种可能,第一种可能就是应用已经崩溃了,第二种情况则是流量过大导致应用线程耗尽,无法处理新的http请求,针对第二种情况,我们就需要对应用的网络状态进行排查。
常用的命令为netstat,关于其参数的描述,可以参见这篇博客。
通过netstat -nat|grep 8080 -c我们可以查看有多少个连接是建立在8080端口上的(包含inbound和outbound),如果想要进一步查看有多少inbound请求,我们可以通过netstat -nat|tr -s ' '|cut -f4 -d ' '|grep 8080 -c来进行查询。其实就是对netstat的结果进行了处理(将多个空格合并为一个,然后取第n列数据,再进行计数),如果想要查询有多少个ip在对服务进行访问,则可以使用uniq命令。
磁盘占用
查看磁盘占用的主要命令则为ls和du
通过ls -lh -s,我们可以获取当前文件夹下所有文件的大小,如果遇到文件夹的时候,展示的就是目录所分配的块大小。
如果想查看具体目录占用情况,我们可以用du --max-depth=1 -h来进行查看。
小结
这里主要总结了对于linux服务器的四个物理信息的查询方式,包含内存、CPU、网络以及磁盘。用到的命令主要有top, free,grep,netstat,ls,du。