Open vieyahn2017 opened 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、真正的该程序要求的数据空间,是真正在运行中要使用的。
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名的程序
实例之:
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}')
#!/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
}
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