Python测开28期-偕行-Linux性能与统计命令

一、linux性能统计指标获取

image

1、cpu信息获取

  • 命令:直接查看系统文件cat /proc/cpuinfo

  • 结果字段说明:

    • processor :系统中逻辑处理核的编号。对于单核处理器,则可认为是其CPU编号,对于多核处理器则可以是物理核、或者使用超线程技术虚拟的逻辑核;
    • vendor_id :CPU制造商;
    • cpu family :CPU产品系列代号;
    • model :CPU属于其系列中的哪一代的代号;
    • model name:CPU属于的名字及其编号、标称主频;
    • stepping :CPU属于制作更新版本;
    • cpu MHz :CPU的实际使用主频;
    • cache size :CPU二级缓存大小;
    • physical id :单个CPU的标号;
    • siblings :单个CPU逻辑物理核数;
    • core id :当前物理核在其所处CPU中的编号,这个编号不一定连续;
    • cpu cores :该逻辑核所处CPU的物理核数;
    • apicid :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续;
    • fpu :是否具有浮点运算单元(Floating Point Unit);
    • fpu_exception :是否支持浮点计算异常;
    • cpuid level :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容;
    • wp :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection);
    • flags :当前CPU支持的功能;
    • bogomips :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second);
    • clflush size :每次刷新缓存的大小单位;
    • cache_alignment :缓存地址对齐单位;
    • address sizes :可访问地址空间位数;

相关说明:

  • 总核数 = 物理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

image

2、 系统负载与进程 cpu 占用–top命令

注意:ps命令的cpu是平均cpu利用率,不适合做性能分析;

top命令介绍

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

命令格式和参数

  • 格式:top 参数

  • 参数(man top):

    • -b 批处理

    • -c 显示完整的治命令

    • -s 保密模式

    • -S 累积模式

    • -i<时间> 设置间隔时间

    • -u<用户名> 指定用户名

    • -p<进程号> 指定进程

    • -n<次数> 循环显示的次数

image

结果说明

顶部top栏

image

  • 当前时间:19:34:57

  • 系统已运行的时间:1097days

  • 当前登录用户的数量:11 users

  • 相应最近5、10和15分钟内的平均负载。:load average: 0.05, 0.17, 0.20

Tasks任务

image

  • 一共有多少个进程: 149 total
  • 处于运行中的进程数:1 running,
  • 处于休眠的进程数:145 sleeping,
  • 停止状态进程数: 0 stopped,
  • 僵尸进程数: 3 zombie

CPU状态

image

  • us, user:运行(未调整优先级的) 用户进程的CPU时间

  • sy,system: 运行内核进程的CPU时间

  • ni,niced:运行已调整优先级的用户进程的CPU时间

  • id:空闲CPU百分比

  • wa,IO wait: 用于等待IO完成的CPU时间

  • hi:处理硬件中断的CPU时间

  • si: 处理软件中断的CPU时间

  • st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的

内存使用

image

  • Mem:无力内存使用情况;

    • 全部可用内存:3881920 total
    • 空闲内存: 137516 free
    • 已使用内存: 1158600 used
    • 缓冲内存: 2585804 buff/cache
  • Swap:虚拟内存 (交换空间) 使用情况;

    • 全部: 0 total,
    • 空闲: 0 free,
    • 已使用: 0 used.
    • 缓冲交换空间: 355836 avail Mem

各进程(任务)的状态监控

image

PID:进程ID,进程的唯一标识符

USER:进程所有者的实际用户名。

PR:进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。

NI: 进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级

VIRT: 进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR: SHR是进程使用的共享内存。共享内存大小,单位kb

S:这个是进程的状态。它有以下不同的值:

  • D - 不可中断的睡眠态。

  • R – 运行态

  • S – 睡眠态

  • T – 被跟踪或已停止

  • Z – 僵尸态

%CPU: 自从上一次更新时到现在任务所使用的CPU时间百分比。

%MEM: 进程使用的可用物理内存百分比。

TIME+: 任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。

COMMAND: 运行进程所使用的命令。进程名称(命令名/命令行)

还有许多在默认情况下不会显示的输出,它们可以显示进程的页错误、有效组和组ID和其他更多的信息。

top交互式命令

  • 多核CPU, 在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况
    image

  • 高亮显示当前运行进程敲击键盘“b”(打开/关闭加亮效果)

    • 进程id为8393的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击“y”键关闭或打开运行态进程的加亮效果。
  • 敲击键盘“x”(打开/关闭排序列的加亮效果),默认进入top时,各进程是按照CPU的占用量来排序的;

  • 通过”shift + >”或”shift + <”可以向右或左改变排序列,配合“x”高量排序显示,通过切换可以更清晰的查看每个列的情况;
    image

  • 其他交互式命令, 如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。

    • h 显示帮助画面,给出一些简短的命令总结说明

    • k 终止一个进程。

    • i 忽略闲置和僵死进程。这是一个开关式命令。

    • q 退出程序

    • r 重新安排一个进程的优先级别

    • S 切换到累计模式

    • s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s

    • f或者F 从当前显示中添加或者删除项目

    • o或者O 改变显示项目的顺序

    • l 切换显示平均负载和启动时间信息

    • m 切换显示内存信息

    • t 切换显示进程和CPU状态信息

    • c 切换显示命令名称和完整命令行

    • M 根据驻留内存大小进行排序

    • P 根据CPU使用百分比大小进行排序

    • T 根据时间/累计时间进行排序

    • W 将当前设置写入~/.toprc文件中

3、内存占用统计

  • free
  • ps
  • top

查看系统内存数据 cat proc/meminfo

image

free命令

free 命令是一个显示系统中空闲和已用内存大小的工具。free 命令的输出和 top 命令相似。其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观。

命令格式: free options
参数说明:

  • -m:以兆为单位显示;
  • -g:以G为单位显示;
  • -h:结果很友好,比m和g都好用;
  • -s:实时观察,数据刷新的间隔时间;
    image

输出信息

一个进程的内存情况

image

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

1、VSS - Virtual Set Size (用处不大)

虚拟耗用内存(包含共享库占用的全部内存,以及分配但未使用内存)。其大小还包括了可能不在RAM中的内存(比如虽然malloc分配了空间,但尚未写入)。VSS 很少被用于判断一个进程的真实内存使用量。
image

2、RSS - Resident Set Size (用处不大)

实际使用物理内存(包含共享库占用的全部内存)。但是RSS还是可能会造成误导,因为它仅仅表示该进程所使用的所有共享库的大小,它不管有多少个进程使用该共享库,该共享库仅被加载到内存一次。所以RSS并不能准确反映单进程的内存占用情况。
image

3、PSS - Proportional Set Size (仅供参考)

实际使用的物理内存(比例分配共享库占用的内存,按照进程数等比例划分)。例如:如果有三个进程都使用了一个共享库,共占用了30页内存。那么PSS将认为每个进程分别占用该共享库10页的大小。 PSS是非常有用的数据,因为系统中所有进程的PSS都相加的话,就刚好反映了系统中的 总共占用的内存。 而当一个进程被销毁之后, 其占用的共享库那部分比例的PSS,将会再次按比例分配给余下使用该库的进程。这样PSS可能会造成一点的误导,因为当一个进程被销毁后, PSS不能准确地表示返回给全局系统的内存。
image

4、USS - Unique Set Size (非常有用)

进程独自占用的物理内存(不包含共享库占用的内存)。USS是非常非常有用的数据,因为它反映了运行一个特定进程真实的边际成本(增量成本)。当一个进程被销毁后,USS是真实返回给系统的内存。当进程中存在一个可疑的内存泄露时,USS是最佳观察数据。
image

进程级别的内存分析-ps命令

ps (英文全拼:process status )命令用于显示当前进程的状态,类似于 windows 的任务管理器。

ps -aux获取内存信息

结果:

描述 说明
USER 进程拥有者
PID 进程的ID
%CPU 占用的 CPU 使用率 平均CPU使用率,不适合做性能分析
%MEM 占用的内存使用率
VSZ 占用的虚拟内存大小
RSS 占用的内存大小
TTY 终端的次要装置号码 (minor device number of tty)
STAT 该进程的状态 D 不可中断 Uninterruptible(usually IO);R 正在运行,或在队列中的进程;S 处于休眠状态;T 停止或被追踪;Z 僵尸进程;W 进入内存交换(从内核2.6开始无效);X 死掉的进程
START 进程开始时间
TIME 进程执行的时间
COMMAND 所执行的指令

ps -e -o显示需要的信息并按照内存使用进行排序

ps -e -o uid,pid,ppid,pcpu,pmem,rss,vsz,comm  --sort -%mem | head -10

4、网络连接统计-netstat命令

netstat -tlnp

  • t:tcp连接;
  • l:listen监听;
  • n:连接域名;
  • p:进程信息;

image

网络状态

  • ESTABLISHED 成功连接 The socket has an established connection
  • SYN_SENT The socket is actively attempting to establish a connection
  • SYN_RECV A connection request has been received from the network.
  • FIN_WAIT1 The socket is closed, and the connection is shutting down.
  • FIN_WAIT2 Connection is closed, and the socket is waiting for a shutdown from the remote end
  • TIME_WAIT 主动关闭 The socket is waiting after close to handle packets still in the network
  • CLOSE The socket is not being used
  • CLOSE_WAIT 被动关闭 The remote end has shut down, waiting for the socket to close.
  • LISTEN The socket is listening for incoming connections

状态数据统计:

netstat -tn | awk 'NR>2{print $NF}'| sort | uniq -c | sort -nr

二、linux常用统计命令

1、排序-sort 命令

说明:
1、排序时,默认是按每行/每个域的首字符排序,数字的优先级要大于字符的优先级
2、不指定升序还是降序时,默认是升序

image

  • -b:忽略开头的空白字符

  • -f:将小写字母看做大写字母

  • -h:根据存储容量排序(KB、MB、GB)
    image

  • -n:按数字排序
    image

  • -o:把结果写入文件

  • -r:以相反的顺序来排序

  • -t:指定分隔符,默认为空格
    image

  • -V:按照数字版本排序
    image

  • -k:指定排序的关键字(列数),与-t 参数配合使用
    image

2、去重-uniq 命令

uniq在去重的时候是对比上下两行是否重复,所以一般在使用之前需要先将内容进行排序,将内容相同的数据挨着放;

  • 以行为单位,进行行与行之间的字符串比较并进行去重;
  • 只能对有序的文本行进行有效去重,所以常与sort命令结合使用;

参数:

3、统计数量-wc 命令

wc 命令用来统计文件中的行数、单词数或字节数,然后将结果输出在终端上。我们可以使用 wc 命令来计算文件的Byte数、字数或是列数。
image

  • -c:统计字节数chars

  • -l:统计行数

  • -w:统计但单词数

  • -L:打印最长行的长度

image

三、进程与线程

1、进程与线程

进程

  • 可执行程序的运行态
  • 操作系统调度的基本单位
  • 线程容器
  • 进程本身包含指令、数据等资源

线程

  • 进程中被执行的最小单元
  • cpu 调度的基本单位
  • 线程带有指令、数据等资源
    image

2、进程生命周期

  • created :创建,系统已为其分配了PCB,但进程所需资源尚未分配,进程还未进入主存,即创建工作尚未完成,进程还不能被调度运行。
  • ready:就绪,进程已分配到除CPU以外打的所有必要资源,等待获得CPU。
  • running:执行,进程已获得CPU,程序正在执行。
  • waiting:阻塞,正在执行的进程由于某事件而暂时无法继续执行时,放弃处理机而自行阻塞。
  • terminated:终止,进程到达自然结束点或者因意外被终结,将进入终止状态,进入终止状态的进程不能再执行,但在操作系统中仍然保留着一个记录,其中保存状态码和一些计时统计数据,供其它进程收集。
    image

进程状态:
通过ps aux可以看到进程的状态。

  • O:进程正在处理器运行,这个状态从来没有见过.
  • S:休眠状态(sleeping)
  • R:等待运行(runable)R Running or runnable (on run queue) 进程处于运行或就绪状态
  • I:空闲状态(idle)
  • Z:僵尸状态(zombie)
  • T:跟踪状态(Traced)
  • B:进程正在等待更多的内存页
  • D: 不可中断的深度睡眠,一般由IO引起,同步IO在做读或写操作时,cpu不能做其它事情,只能等待,这时进程处于这种状态,如果程序采用异步IO,这种状态应该就很少见到了

3、常用进程管理命令

  • ps 进程列表快照
  • top 交互式进程观测
  • kill/ killall 结束进程
  • fg 进程切换到前台
  • bg 进程切换到后台
  • ctrl z 挂起进程,使用jobs命令查看挂起进程

ps命令

自定义输出指标: ps -o pid,ppid,psr,thcount,tid,cmd -M

image

  • PID:进程id;
  • PPID:父进程id;
  • PSR:进程对应运行的CPU核;
  • THCNT:线程数;
  • TID:线程id;
  • CMD:运行的命令;