linux的cpu和内存分析
内容解释:
cpu 占用率高的线程ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu
查看指定服务访问并发量
netstat -nat|grep -i "8002"|wc -l
查看向外暴露的端口 ss -tunl
第一行(top):
15:24:36 系统当前时刻
14 days 系统启动后到现在的运作时间
3 users 当前登录到系统的用户,更确切的说是登录到用户的终端数 -- 同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目
load average 当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过 CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程
第二行(Tasks):
288 total 当前系统进程总数
1 running 当前运行中的进程数
287 sleeping 当前处于等待状态中的进程数
0 stoped 被停止的系统进程数
0 zombie 僵尸进程数
第三行(Cpus):
7.3% us 用户空间占用CPU百分比
2.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
90.4% id 空闲CPU百分比
0.3% wa 等待输入输出的CPU时间百分比
0.0% hi
0.0% si
0.0% st
第四行(Mem):
2042616 total 物理内存总量
1770116 used 使用的物理内存总量
272500 free 空闲内存总量
163912 buffers 用作内核缓存的内存量
第五行(Swap):
表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。通常,交换分区(Swap)被频繁使用的情况,将被视作物理内存不足而造成的。
2094076 total 交换区总量
45052 used 使用的交换区总量
2049024 free 空闲交换区总量
346624 cached 缓冲的交换区总量
最下部分的进程列表栏:
以 PID 区分的进程列表将根据所设定的画面更新时间定期的更新。通过 top 内部命令可以控制此处的显示方式:
PID:进程的ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称
top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下表:
s- 改变画面更新频率
l - 关闭或开启第一部分第一行 top 信息的表示
t - 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m - 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N - 以 PID 的大小的顺序排列表示进程列表(第三部分后述)
P - 以 CPU 占用率大小的顺序排列进程列表 (第三部分后述)
M - 以内存占用率大小的顺序排列进程列表 (第三部分后述)
h - 显示帮助
n - 设置在进程列表所显示进程的数量
q - 退出 top
s -改变画面更新周期
shift+m对内存占用排序
---------------------------------------------------------------------pmap-----
top命令只能看个大概,于是就找到了pmap命令
pmap -d pid
ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ]
244 mapped: 3588968K writeable/private: 3141696K shared: 262172K
大部分内存都是被类似“00007fff50000000 131072 rw--- 0000000000000000 000:00000 [ anon ]” 这样的情况给占用的,看到程序总共使用了3G多的内存
既然是堆外内存就只关心是否申请了buff没有释放
堆外内存泄漏一般由堆内对象引用(最常见由NIO引起)
while true; do pmap -d pid | tail -1; sleep 2; done
查看线程数量jstack 1 |grep "Thread.State" |wc -l
查看是否有死锁jstack -m 1
查看线程数量及状态jstack 1 |grep "Thread.State"|awk '{print$2$3$4$5}'|uniq -c
vmstat 命令中 si、so 列的数值,如果数值大说明换入换出严重,这是内存不足的表现
iostat、vmstat、netstat、mpstat可观察
iostat-xdm 1
pidstat -urd 1
iotop
查看机器上跑了那些进程jps -m -l -v
jps -mvl ,m让他带上方法参数,v带上设置的jvm参数,l显示完整的运行main方法名称
查看对应应用所有启动参数jinfo -flags pid
对应java进程的有效性能计数器jcmd 1 PerfCounter.print
诊断命令的帮助信息jcmd 1 help(例如使用jcmd 1 GC.run)
显示JVM的参数信息
jcmd 9816 VM.flags
查看服务进程中的线程消耗情况top -Hp pid
得到线程的nid printf %x pid 这个是线程id在jstack等命令中的id
统计线程数jstack -l 28367 | grep 'java.lang.Thread.State' | wc -l
jstack pid打印栈信息
jstack工具查看线程状况jstack 1 |grep 1 -A 200
查看资源使用情况jstat -gcutil 1 2000 10//pid-频率-次数
查看资源使用情况jstat -gccause 1 2000 10
jmap查看heap存活对象jmap -histo:live pid | head -20
查看java.net包下的所有对象jmap -histo 5952 |findstr java.net.*
查看所有classloader jmap -clstats pid
jmp快照获取dump文件 jmap -dump:format=b,file=test.bin pid/导出file.dump可以用javavisual查看
使用strace -f -e"brk,mmap,munmap" -p pid追踪向OS申请内存请求
再次使用gdp -pid pid进入gdp,用dump memory mem.bin startAddress endAddress dump内存,之后去proc/pid/smaps查找
ps命令
s -aux | sort -k4nr | head -N k:关键字4:第四列n:按数字r:反过来
F 代表这个程序的旗标 (flag), 4 代表使用者为 super user;
S 代表这个程序的状态 (STAT);
PID 程序的 ID ;
CPU 使用的资源百分比
PRI 这个是 Priority (优先执行序) 的缩写;
NI 这个是 Nice 值。
ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running # 的程序,一般就是『 - 』
SZ 使用掉的内存大小;
WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;
TTY 登入者的终端机位置;
TIME 使用掉的 CPU 时间。
CMD 所下达的指令
pmap命令
pmap命令用于报告进程的内存映射关系
$ pmap -d 16613
free命令
free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。
下面是对这些数值的解释:
total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
--------------------------------springcloud放在centos在k8s上部署buff/cache大-
free -m查看可以内存指定单位m
free -h查看使用和剩余内存,buff/cache过大
执行sync然后执行如下命令
1清理pagecache(页面缓存)
echo 1 > /proc/sys/vm/drop_caches
2清理dentries(目录缓存)和inodes
echo 2 > /proc/sys/vm/drop_caches
3清理pagecache、dentries和inodes
echo 3 > /proc/sys/vm/drop_caches
可以通过脚本来自动触发
freemem.sh
! /bin/sh
used=free -m | awk 'NR==2' | awk '{print $3}'
free=free -m | awk 'NR==2' | awk '{print $4}'
echo "===========================" >> /app/memory/logs/mem.log
date >> /app/memory/logs/mem.log
echo "Memory usage before | [Use:{used}MB][Free:usedMB][Free:{free}MB]" >> /app/memory/logs/mem.log
if [ $free -le 4000 ] ; then
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches
used_ok=free -m | awk 'NR==2' | awk '{print $3}'
free_ok=free -m | awk 'NR==2' | awk '{print $4}'
echo "Memory usage after | [Use:{used_ok}MB][Free:{free_ok}MB]" >> /app/memory/logs/mem.log
echo "OK" >> /app/memory/logs/mem.log
else
echo "Not required" >> /app/memory/logs/mem.log
fi
exit 1
crontab -e命令编辑当前用户的crontab
0 6 * * * /usr/local/tomcat/sztFileFront/bin/freemem.sh
/sbin/service crond restart
查看cpu核数和线程数
cat /proc/cpuinfo | grep "physical id"
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
cat /proc/cpuinfo | grep "core id" | sort | uniq | wc -l
cat /proc/cpuinfo | grep "processer id" | sort | uniq | wc -l
lscpu可以直接查看
socket(s)是cpu个数 cpu是逻辑cpu
查看java程序进程的命令
pgrep -l java或者netstat -anp|grep java
查看指定应用的内存分析命令
----jstat -gcutil pid-----总垃圾回收统计
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
------jstat -class pid 2000---类加载统计
Loaded:加载class的数量
Bytes:所占用空间大小
Unloaded:未加载数量
Bytes:未加载占用空间
Time:时间
jstat -compiler 1 2000--------编译统计
Compiled:编译数量。
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败的方法
------jstat -gc 1 2000--------垃圾回收统计
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
------jstat -gccapacity 1 2000----堆内存统计
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数
------jstat -gcnew 1 2000---新生代垃圾回收统计
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
------jstat -gcold 1 2000------老年代垃圾回收统计
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
------jstat -gcoldcapacity 1 2000----老年代堆内存统计
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
-------jstat -gcmetacapacity 1 2000----元数据空间统计
MCMN: 最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
-------使用jinfo查看具体一项
jinfo -flag MetaspaceSize 1
jinfo -flag MaxMetaspaceSize pid
jmap 查看活跃对象
jmap -histo 1
jmap -histo:live 1
查看堆信息
jmap -dump:live,format=b,file=beap.bin 1