前言

对于服务端应用,我们常会遇到机器load过高,服务无响应,磁盘打满,网络堵塞等等问题,对于这些问题,我们需要从服务器本身找出根源所在,然后再着手解决,本文主要介绍了用于定位这一系列问题的命令。

内存占用比例

通过top命令,我们可以查看目前内存使用比例,其中,每一行就是一个进程的状态,具体字段解释如下

PID 进程ID
VIRT 申请的虚拟内存总量
RES 使用的物理内存总和
SHR 占用共享内存大小

关于虚拟内存和物理内存的解释,可以看这里

关于top命令的底层实现,可以看这里

从内存占用到CPU时间,后端问题排查必备linux命令

如上图所示,通过top命令,我们就能够看到PID为1的进程占用了1.6G的物理内存。在进程多的情况下,如果我们需要进行排序,还可以通过shift + f进行如下选择页面,然后选择指定的项目进行排序展示。
从内存占用到CPU时间,后端问题排查必备linux命令

此外,我们还可以通过free命令,来查看系统当前空闲和已用内存。另外,可以通过free -mfree -g来控制其展示的单位。

CPU占用时间查询

查询CPU时间的时候,我们主要使用的仍然是top命令。通过top命令,选择CPU时间排序,就可以得到占用CPU最长的进程PID。但还有另外一个场景,我们需要查询进程中的子线程中最耗时的,这个时候就需要加参数适用top命令了。

top -H -p <pid> 通过这个命令,我们可以看到这个进程底下占用CPU时间最多的线程。

从内存占用到CPU时间,后端问题排查必备linux命令

展示的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命令。

磁盘占用

查看磁盘占用的主要命令则为lsdu

通过ls -lh -s,我们可以获取当前文件夹下所有文件的大小,如果遇到文件夹的时候,展示的就是目录所分配的块大小。

如果想查看具体目录占用情况,我们可以用du --max-depth=1 -h来进行查看。

小结

这里主要总结了对于linux服务器的四个物理信息的查询方式,包含内存、CPU、网络以及磁盘。用到的命令主要有topfreegrepnetstatls,du

相关文章:

  • 2022-12-23
  • 2021-12-11
  • 2022-12-23
  • 2022-12-23
  • 2021-05-16
  • 2021-11-17
  • 2021-12-29
猜你喜欢
  • 2021-11-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-27
相关资源
相似解决方案