top命令补充

2024/7/15·1 views

top命令是Linux上进行系统监控的首选命令,但有时候却达不到我们的要求,比如当前这台服务器,top监控有很大的局限性。这台服务器运行着websphere集群,有两个节点服务,就是【top视图 01】中的老大、老二两个java进程,top命令的监控最小单位是进程,所以看不到我关心的java线程数和客户连接数,而这两个指标是java的web服务非常重要的指标,通常我用ps和netstate两个命令来补充top的不足。

监控java线程数:

ps -eLf | grep java | wc -l

监控网络客户连接数:

netstat -n | grep tcp | grep 侦听端口 | wc -l

上面两个命令,可改动grep的参数,来达到更细致的监控要求。

在Linux系统“一切都是文件”的思想贯彻指导下,所有进程的运行状态都可以用文件来获取。系统根目录/proc中,每一个数字子目录的名字都是运行中的进程的PID,进入任一个进程目录,可通过其中文件或目录来观察进程的各项运行指标,例如task目录就是用来描述进程中线程的,因此也可以通过下面的方法获取某进程中运行中的线程数量(PID指的是进程ID):

ls /proc/PID/task | wc -l
在linux中还有一个命令pmap,来输出进程内存的状况,可以用来分析线程堆栈:

pmap PID

大家都熟悉Linux下可以通过top命令来查看所有进程的内存,CPU等信息。除此之外,还有其他一些命令,可以得到更详细的信息,例如进程相关

cat /proc/your_PID/status

通过top或ps -ef | grep '进程名' 得到进程的PID。该命令可以提供进程状态、文件句柄数、内存使用情况等信息。
内存相关
vmstat -s -S M
该可以查看包含内存每个项目的报告,通过-S M或-S k可以指定查看的单位,默认为kb。结合watch命令就可以看到动态变化的报告了。

也可用 cat /proc/meminfo

要看cpu的配置信息可用

cat /proc/cpuinfo

它能显示诸如CPU核心数,时钟频率、CPU型号等信息。

要查看cpu波动情况的,尤其是多核机器上,可使用

mpstat -P ALL 10

该命令可间隔10秒钟采样一次CPU的使用情况,每个核的情况都会显示出来,例如,每个核的idle情况等。
只需查看均值的,可用
iostat -c
IO相关
iostat -P ALL
该命令可查看所有设备使用率、读写字节数等信息。

另外,htop ,有时间可以用一下。

Linux查看物理CPU个数、核数、逻辑CPU个数

总核数 = 物理CPU个数 X 每颗物理CPU的核数

总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

查看物理CPU个数

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

查看每个物理CPU中core的个数(即核数)

cat /proc/cpuinfo| grep "cpu cores"| uniq

查看逻辑CPU的个数

cat /proc/cpuinfo| grep "processor"| wc -l

查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

linux top命令看到的实存(RES)与虚存(VIRT)分析
近期在公司中解决程序使用的内存高问题,将一部分之前无法回收的内存进行了回收,实现降内存效果(降实存)。

在统计效果时, QA问是统计RES(实存)还是VIRT(虚存)。

在网上学习看了一些博客,这里自己总结一下RES和VIRT的区别。

  1. 概念

VIRT:

1
2
3
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;
2、假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。
3、VIRT = SWAP + RES
RES:

1
2
3
4
5
1、进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;
2、包含其他进程的共享;
3、如果申请10MB的内存,实际使用1MB,它只增长1MB,与VIRT相反;
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小。
5、RES = CODE + DATA
SHR:

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

(1) 使用堆分配内存, 进行测试:

复制代码
1 #include
2 #include <stdio.h>
3 #include <string.h>
4
5 int main()
6 {
7 int test = 0;
8 //分配512M, 未使用
9 char * p = new char [10241024512];
10 scanf("%d", &test); //等待输入
11
12 //使用10M
13 memset(p, 0, 1024 * 1024 * 10);
14 scanf("%d", &test); //等待输入
15
16 //使用50M
17 memset(p, 0, 1024 * 1024 * 50);
18 scanf("%d", &test); //等待输入
19 delete [] p;
20 return 0;
21 }
复制代码
执行:

new 512M后,VIRT/RES

使用10M后,VIRT/RES

使用50M后,VIRT/RES

(2) 使用栈分配内存进行测试:

复制代码
1 #include
2 #include <stdio.h>
3 #include <string.h>
4
5 int main()
6 {
7 int test = 0;
8 //20M栈, 未使用
9 char p[1024102420];
10 scanf("%d", &test); //等待输入
11
12 //使用10M
13 memset(p, 0, 1024 * 1024 * 10);
14 scanf("%d", &test); //等待输入
15 return 0;
16 }
复制代码
执行:

栈上申请20M

使用10M

  1. 总结

堆、栈分配的内存,如果没有使用是不会占用实存的,只会记录到虚存。

如果程序占用实存比较多,说明程序申请内存多,实际使用的空间也多。

如果程序占用虚存比较多,说明程序申请来很多空间,但是没有使用。

工作中,遇到过有的程序虚存300G+, 实存只有不到15G。

参考:

  1. https://www.cnblogs.com/zmlctt/p/3987181.html

  2. https://blog.csdn.net/huyiyang2010/article/details/7815491

快来和小猫聊天吧~