vieyahn2017 / shellv

shell command test and study
4 stars 1 forks source link

11.14 top命令详解 #76

Open vieyahn2017 opened 3 years ago

vieyahn2017 commented 3 years ago

Linux top命令用于实时显示 process 的动态。

使用权限:所有使用者。

语法 top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 参数说明:

d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行 c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来 s : 安全模式,将交谈式指令取消, 避免潜在的危机 i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程 n : 更新的次数,完成后将会退出 top b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内 实例 显示进程信息

top

显示完整命令

top -c

以批处理模式显示程序信息

top -b

以累积模式显示程序信息

top -S

设置信息更新次数

top -n 2

//表示更新两次后终止更新显示 设置信息更新时间

top -d 3

//表示更新周期为3秒 显示指定的进程信息

top -p 139

//显示进程号为139的进程信息,CPU、内存占用率等 显示更新十次后退出

top -n 10 使用者将不能利用交谈式指令来对行程下命令

top -s

vieyahn2017 commented 3 years ago

top中一些字段的含义:

VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES:resident memory usage 常驻内存 1、进程当前使用的内存大小,但不包括swap out 2、包含其他进程的共享 3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反 4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR:shared memory 共享内存 1、除了自身进程的共享内存,也包括其他进程的共享内存 2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小 3、计算某个进程所占的物理内存大小公式:RES – SHR 4、swap out后,它将会降下来

DATA 1、数据占用的内存。如果top没有显示,按f键可以显示出来。 2、真正的该程序要求的数据空间,是真正在运行中要使用的。

vieyahn2017 commented 3 years ago

Linux下查看某一进程所占用内存的方法

Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id

  

  可以看到是2913,现在可以使用如下命令查看内存:

top -p 2913   

  这样可以动态实时的看到CPU和内存的占用率,然后按q键回到命令行

  也可直接使用ps命令查看: ps -aux | grep kafka

  

  第一个标注的地方是CPU和内存占用率,后面的943100是物理内存使用量,单位是k,此时kafka大约占用943M内存

  还可以查看进程的status文件: cat /proc/2913/status

  

  VmRSS对应的值就是物理内存占用,大约为943M和刚才一致

  另外还可以通过 top 命令动态查看内存占用

  通过: ps aux | sort -k4,4nr | head -n 10 查看内存占用前10名的程序

vieyahn2017 commented 3 years ago

Linux top命令的用法详细详解

https://www.cnblogs.com/zhoug2020/p/6336453.html

vieyahn2017 commented 3 years ago

实例之:

top -p 7355 -b -n 1

获取某个进程的当前内存。 写shell脚本的时候用

  java_pid=$(ps -ef |grep xxxjava | grep -v grep | awk '{print $2}')
  RES=$(top -p ${java_pid} -b -n 1 | tail -n 1 | awk '{print $6}')
vieyahn2017 commented 3 years ago

#!/bin/bash

# 执行本脚本,会把本脚本加入定时任务中,每小时执行一次,自动检查java进程的运行情况,定时重启

RESTART_TIME=01:00
OUT_MEMORY_LIMIT=1024000
# 每日这个时刻重启
# 内存大于设置限制重启

function restart_service () {
  /home/xxx/bin/xxx.sh restart xxxx
}

function main () {
  if [ $(date "+%H:%M") == "$RESTART_TIME" ]; then
    restart_service
    return
  fi

  java_pid=$(ps -ef |grep xxxx.jar | grep -v grep | awk '{print $2}')
  RES=$(top -p ${java_pid} -b -n 1 | tail -n 1 | awk '{print $6}')
  if [[ "$RES" -gt "$OUT_MEMORY_LIMIT" ]]; then
    restart_service
  fi

}

function create_crond()
{
  for task in "$@"
  do
    echo "$task" >> /var/spool/cron/tabs/root
    echo add "$task" success, use [crontab -l] to see details.
  done
  crontab /var/spool/cron/tabs/root
}

function add_to_crond () {
  cron_task="*/60 * * * * sh `pwd`/$0 run"  # 运行
  create_crond "$cron_task"
}

if [ -z "$1" ] || [ "$1" == "init" ]; then
  add_to_crond
  exit
fi

if [ "$1" == "run" ]; then
  main
fi

exit

### unused

top -p 139 -b -n 1 
top -p 139

function test () {
  date >> /1.log
}

function create_crond_0()
{
  for task in "$@"
  do
    if [ -f "${task#*sh }" ];then
      if [ $(crontab -l | fgrep -c "$task") -eq 0 ];then
        echo "$task" >> /var/spool/cron/tabs/root
      fi
    else
      echo "${task#*sh } does not exist!" 
    fi
  done
  crontab /var/spool/cron/tabs/root
}