最近服务器总是由于内存占用问题,或者CPU占用问题导致缓慢甚至崩溃。因此不得不在Linux系统中监控几个重要的服务,查看CPU或者内存的使用情况,并跟踪可能出现的问题。之前对于在Linux查看进程的CPU和内存使用情况略知一二,但是完全达不到能深入调试的地步。大概就是使用top命令或者ps命令查看一下当前系统中占用CPU或者内存最高的进程是什么,但是这个是完全不够的。
top命令的简单用法
这里就不详细说明top了,百度上能搜到很多内容。使用top命令在终端显示CPU和内存的使用情况。在开启状态下,可以直接键入P(大写的P)和M(大写的M)分别按照CPU的占用排序或者按照内存的占用排序。另外直接键入数字1可以查看多核CPU中每一个核的使用情况。如图:
这里需要说明内存的问题。total是内存总量,free是空闲内存,used是使用内存,buff/cache是buff(在内存中准备写入磁盘的数据)和cache(在内存中从磁盘读出待CPU使用的数据)使用的内存总数。
ps命令的简单用法
ps命令是另一个非常常用的查看进程信息的命令。通常用法是:
ps -ef #UNIX格式 ps aux #BSD格式
ps命令自定义输出
只是简单查看某个进程的信息以上命令已经够了。但是各有各的利弊。比如-ef没有显示CPU和内存是使用情况,aux没有显示父进程的PID。我们可以自定义ps命令的输出格式,例如:
ps axo user,pid,ppid,pcpu,pmem,start_time,time,command
以上命令显示了进程的用户,PID,父进程的PID,CPU使用量,内存使用量,开始日期,cpu的累计使用时长,和完整的进程命令。
我们也可以设置默认的排序字段和排序方式,例如:
ps axo user,pid,ppid,pcpu,pmem,start_time,time,command --sort=-pcpu
以上命令会按照CPU的使用量降序排列。
使用ps命令查看进程间关系
ps可以显示一个进程的父进程。我们可以通过以下命令显示父进程的信息:
ps o user,pid,ppid,pcpu,pmem,start_time,time,command p 32654
以上是显示进程PID为32654的进程信息。
使用ps命令查看进程的子线程
一个进程可能有很多子线程,要了解一个进程的线程信息,可以使用以下命令:
ps o user,pid,ppid,pcpu,pmem,start_time,time,command p 32654 m
以上是显示进程PID为32654的进程和线程信息。
ps命令的高阶用法
ps命令除了显示进程信以外,可以使用管道做一些非常方便的日常操作。最基本的方式如下:
ps aux | more #不解释
使用ps命令批量终止进程
ps和awk合作可以批量关闭进程。比如在我的服务上跑了很多名为thomas的进程,我们可以使用以下命令批量删除:
ps aux | grep thomas| grep -v grep | awk '{print $2}'|xargs kill
使用ps命令显示CPU使用率大的进程
ps和awk合作也可以显示某些CPU使用率比较大的进程。比如显示所有CPU使用率大于5的进程,我们可以使用以下命令:
ps aux | grep thomas| grep -v grep | awk '{ if ($3 > 5) print $1, $2, $3, $4, $NF}'
以上命令可以显示CPU使用率大于5的所有名字中包含thomas的进程,并显示第1,2,3,4和最后一列。如果要显示所有列,修改print的参数为$0,如下:
ps aux | grep thomas| grep -v grep | awk '{ if ($3 > 5) print $0}'
使用ps命令显示多个进程总的CPU使用量
例如我们的服务器开了好几个名为thomas的进程,我们可以通过以下命令统计该进程总的CPU使用量:
ps aux | grep thomas | grep -v grep | awk '{cpu+=$3}END{print cpu}'
扫码联系船长