[转帖]Linux—CPU核数、上下文切换介绍及pidstat等命令详解
https://www.jianshu.com/p/0ae0c1153c34
关注:CodingTechWork,一起学习进步。
引言
并发编程
并发编程的目的是为了改善串行程序执行慢问题,但是,并不是启动更多线程就能够让程序执行更快。因为在并发时,容易受到软硬件资源等限制,从而导致上下文切换慢,频繁的上下文切换导致并发程序执行起来反而不如串行程序,违背了让程序运行得更快一些这个最初的梦想。
单核和多核CPU
在介绍上下文切换前,我们先来了解一下计算机CPU的单核和多核概念。
最开始的单核CPU比较死脑,在通电时CPU就执行存储块中的指定地址的指令,如果想要执行内存块其他地方的代码必须调整总线位置才可以执行,这就阻塞程序了,期间只能执行某一个程序。后来,英特尔演进了一种叫做时间轴的工作方式,增加晶体管,CPU工作效率提高,并基于时钟电路控制CPU跳转到指定地址,借助操作系统来利用时钟电路控制CPU的跳转。
多核集成在一个芯片里,由多个CPU组成,多核通过内部总线交互和共享数据,其中会有一个核专门分配给操作系统用,由操作系统分配资源及控制CPU执行程序。
windows查看核数
打开命令行模式,可以利用Win+r
键打开运行,然后输入cmd
。
除了直接使用systeminfo
命令,下面我们介绍wmic命令
来查看计算机相关信息。
- 输入
wmic
,进入命令行环境 cpu get Name
:查看计算机的cpu信息cpu get NumberOfCores
:查看计算机的cpu核数cpu get NumberOfLogicalProcessors
:查看计算机的cpu线程数
C:\Users\Lenovo>wmic
wmic:root\cli>cpu get Name
Name
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
wmic:root\cli>cpu get NumberOfCores
NumberOfCores
6
wmic:root\cli>cpu get NumberOfLogicalProcessors
NumberOfLogicalProcessors
12
wmic:root\cli>
linux查看核数
一般linux的CPU相关信息都是存储在/proc/cpuinfo
内,内存信息存储在/proc/meminfo
中。
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
:查看物理CPU个数cat /proc/cpuinfo| grep "cpu cores"| uniq
:查看单个CPU核数cat /proc/cpuinfo| grep "processor"| wc -l
:查看逻辑CPU个数cat /proc/meminfo| grep MemTotal
:查看内存大小
[linux@01 ~]$ cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 1
[linux@01 ~]$ cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
16
[linux@01 ~]$ cat /proc/cpuinfo| grep "processor"| wc -l
16
[linux@01 ~]$ cat /proc/meminfo| grep MemTotal
MemTotal: 32780412 kB
上下文切换
上下文切换的介绍
我们对于单核和多核不陌生了,自己的电脑或者使用的机器总是希望核数越多越好,毕竟多核能够支持更好的多线程并发。当然,单核处理器也支持多线程执行代码,CPU是通过给每个线程分配CPU时间片
来实现。
时间片就是CPU分配给各个线程的时间,那单核是如何实现多线程并发执行的呢?那是因为时间片非常短(一般是几十毫秒),CPU通过切换线程交替执行,给你一种错觉好像是多个线程同时执行了。
CPU通过时间片来执行多线程执行,当前任务执行一个时间片后切换到下一个任务继续执行,在切换任务前呢,其实CPU会保存该任务的状态,这样在下次切回该任务时,可以再加载这个任务的状态,继续执行(其实也就是保存当前线程的运行位置,同时呢,会加载需要恢复的线程环境相关信息。)。任务从保存到再加载的过程
,这就是一次上下文切换
的过程。
上下文切换一旦频繁,必定消耗CPU资源,必定耗时,并发的性能将会受到影响。如何减少?
上下文切换的减少
减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程方式。
无锁并发编程
:多线程竞争锁时,大量的任务交替执行,会引起上下文切换,在多线程处理数据时,我们可以使用一些无锁方式来处理共享数据,比如将数据的ID按照Hash算法取模进行分段,这样不同的线程去处理不同分段的数据。CAS算法
:JAVA的Atomic包就使用了CAS算法来更新数据,无需加锁。使用最少线程
:在程序开发过程中,要避免创建不必要的线程,如并发任务很少,若创建了很多线程来处理任务,可能在程序运行时,大部分线程都是出于等待闲置的状态。比如减少线上大量的WAITING线程
,我们可以通过jstack [pid] > dumpName
将某个进程的线程信息dump到dumpName
文件中,然后通过筛选(grep java.lang.Thread.State dumpName | awk '{print $2$3$4$5}' | sort | uniq -c
)出多少个线程处于WAITING状态。或者直接通过jstack -l [pid]| grep BLOCKED
、jstack -l [pid]| grep WAITING
等命令查看该进程的线程信息。协程
:在单线程里实现多个任务的调度,并在单个线程里面维持多个任务的切换。
上下文切换的查看
我们可以使用vmstat
命令和pidstat
命令查看上下文切换的次数等信息。
vmstat命令
vmstat
命令是Virtual Memory Statistics
虚拟内存统计的缩写,可以对操作系统的虚拟内存、进程、CPU活动等进行监控统计。
vmstat命令参数详解
[linux@01 ~]$ vmstat -help
Usage:
vmstat [options] [delay [count]]
Options:
-a, --active active/inactive memory
-f, --forks number of forks since boot
-m, --slabs slabinfo
-n, --one-header do not redisplay header
-s, --stats event counter statistics
-d, --disk disk statistics
-D, --disk-sum summarize disk statistics
-p, --partition <dev> partition specific statistics
-S, --unit <char> define display unit
-w, --wide wide output
-t, --timestamp show timestamp
-h, --help display this help and exit
-V, --version output version information and exit
For more details see vmstat(8).
比较常用的直接使用vmstat a
,其中a
代表的是多少秒实时显示。
vmstat 实时统计整体情况
语法:
vmstat [count]
参数说明:
count
:表示统计间隔。
示例:
[linux@01 ~]$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 13223320 146732 1982108 0 0 0 3 0 0 0 0 99 0 0
1 0 0 13222504 146732 1982108 0 0 0 172 747 1224 0 0 99 0 0
0 0 0 13222696 146732 1982108 0 0 0 44 1078 1464 0 0 99 0 0
0 0 0 13223492 146732 1982108 0 0 0 0 749 1189 0 0 100 0 0
0 0 0 13223260 146732 1982092 0 0 0 16 789 1272 0 0 100 0 0
0 0 0 13223620 146732 1981996 0 0 0 0 1359 1589 0 0 99 0 0
0 0 0 13224364 146732 1981996 0 0 0 156 817 1279 0 0 100 0 0
0 0 0 13222488 146732 1981996 0 0 0 32 792 1292 0 0 100 0 0
pidstat命令
vmstat
可以对操作系统进行整体情况统计,但是无法对某个进程进行统计分析,下面学习一下pidstat
命令,可以针对整体或者某个进程进行分析。
pidstat安装
pidstat命令
是对linux系统监控的一种命令,使用该命令可以对linux进程数据进行监控,可以输出每个受内核管理的任务相关信息,而pidstat是sysstat
软件套件的一部分,所以首先得安装该命令。
如果是centos系统,使用yum install sysstat
安装即可。
pidstat命令参数详解
[linux@01 ~]$ pidstat -help
Usage: pidstat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ] [ -t ] [ -U [ <username> ] ] [ -u ]
[ -V ] [ -w ] [ -C <command> ] [ -p { <pid> [,...] | SELF | ALL } ]
[ -T { TASK | CHILD | ALL } ]
其中:
interval
:表示间隔多久统计一次数据,可选的参数。count
:表示统计多少次,可选参数,若只传了interval,而无count,则默认无限次统计次数。
pidstat cpu统计
语法:
- 全量:
pidstat -u [interval] [count]
或者默认pidstat [interval] [count]
- 某个任务:
pidstat -p <pid> [interval] [count]
全量任务cpu统计示例
[linux@01 ~]$ pidstat
Linux 3.10.0-514.el7.x86_64 (01) 03/09/2021 _x86_64_ (16 CPU)
08:45:48 AM UID PID %usr %system %guest %CPU CPU Command
08:45:48 AM 0 1 0.00 0.00 0.00 0.00 14 systemd
08:45:48 AM 0 2 0.00 0.00 0.00 0.00 15 kthreadd
08:45:48 AM 0 3 0.00 0.00 0.00 0.00 0 ksoftirqd/0
08:45:48 AM 0 7 0.00 0.00 0.00 0.00 0 migration/0
08:45:48 AM 0 9 0.00 0.01 0.00 0.01 15 rcu_sched
08:45:48 AM 0 10 0.00 0.00 0.00 0.00 0 watchdog/0
08:45:48 AM 0 11 0.00 0.00 0.00 0.00 1 watchdog/1
08:45:48 AM 0 12 0.00 0.00 0.00 0.00 1 migration/1
08:45:48 AM 0 13 0.00 0.00 0.00 0.00 1 ksoftirqd/1
某个pid任务cpu统计示例
[linux@01 ~]$ pidstat -u -p 27680 1
Linux 3.10.0-514.el7.x86_64 (01) 03/09/2021 _x86_64_ (16 CPU)
09:14:19 AM UID PID %usr %system %guest %CPU CPU Command
09:14:20 AM 1000 27680 1.00 0.00 0.00 1.00 8 java
09:14:21 AM 1000 27680 0.00 0.00 0.00 0.00 8 java
09:14:22 AM 1000 27680 0.00 0.00 0.00 0.00 8 java
09:14:23 AM 1000 27680 0.00 0.00 0.00 0.00 8 java
统计参数详解:
UID
:表示监视任务的真实用户标识编号。PID
:表示被监控任务的进程号%usr
:表示该任务在用户态
应用程序执行时的CPU使用率,该字段的CPU计算时间不包括在虚拟处理器中花去的时间。(用户层面)%system
:表示该任务在内核态
执行时的CPU使用率。(系统层面)%guest
:表示该任务在虚拟机处理器
上执行时的CPU使用率。(虚拟层面)。%CPU
:表示该任务总的CPU使用率。在多处理器环境中,如果带上-I
参数,CPU使用率的计算会除以机器的CPU数量。CPU
:表示正在运行该任务的处理器编号。Command
:表示该任务的执行命令名称。
pidstat I/O统计
语法:
pidstat -d -p <pid>
示例:
[linux@01 ~]$ pidstat -d -p 27680
Linux 3.10.0-514.el7.x86_64 (01) 03/09/2021 _x86_64_ (16 CPU)
08:52:55 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
08:52:55 AM 1000 27680 0.00 0.01 0.00 java
统计参数详解:
UID
:表示监视任务的真实用户标识编号。PID
:表示被监控任务的进程号kB_rd/s
:表示该任务从硬盘上的读取速度,rd
表示read
。kB_wr/s
:表示该任务向硬盘中的写入速度,wr
表示write
。kB_ccwr/s
:表示该任务写入磁盘被取消的速度。ccwr
表示cancel write
。Command
:表示该任务的执行命令名称。
pidstat 内存统计
语法:
pidstat -r -p <pid>
示例:
[linux@01 ~]$ pidstat -r -p 27680
Linux 3.10.0-514.el7.x86_64 (01) 03/09/2021 _x86_64_ (16 CPU)
08:56:48 AM UID PID minflt/s majflt/s VSZ RSS %MEM Command
08:56:48 AM 1000 27680 0.01 0.00 13124360 2489432 7.59 java
统计参数详解:
UID
:表示监视任务的真实用户标识编号。PID
:表示被监控任务的进程号。minflt/s
:表示从内存中加载数据时每秒出现的较小错误数目,这些不要求从磁盘载入内存页面,其中minflt
表示minor fault
。majflt/s
:表示从内存中加载数据时每秒出现的较大错误数目,这些要求从磁盘载入内存页面,其中majflt
表示major fault
。VSZ
:表示虚拟容量,整个进程的虚拟内存使用(单位:kb)RSS
:表示长期内存使用,任务的不可交换物理内存的使用量(单位:kb)Command
:表示该任务的执行命令名称。
pidstat 间隔有限次数监控
语法:
pidstat -p <pid> [interval] [count]
示例
[linux@01 ~]$ pidstat -p 27680 1 5
Linux 3.10.0-514.el7.x86_64 (01) 03/09/2021 _x86_64_ (16 CPU)
09:03:55 AM UID PID %usr %system %guest %CPU CPU Command
09:03:56 AM 1000 27680 0.00 0.00 0.00 0.00 8 java
09:03:57 AM 1000 27680 0.00 0.00 0.00 0.00 8 java
09:03:58 AM 1000 27680 1.00 0.00 0.00 1.00 8 java
09:03:59 AM 1000 27680 0.00 0.00 0.00 0.00 8 java
09:04:00 AM 1000 27680 0.00 0.00 0.00 0.00 8 java
Average: 1000 27680 0.20 0.00 0.00 0.20 - java
pidstat 上下文切换统计
语法:
pidstat -w <pid> [interval] [count]
示例
[linux@01 ~]$ pidstat -w -p 27680
Linux 3.10.0-514.el7.x86_64 (01) 03/09/2021 _x86_64_ (16 CPU)
09:11:15 AM UID PID cswch/s nvcswch/s Command
09:11:15 AM 1000 27680 0.00 0.00 java
[linux@01 ~]$ pidstat -w -p 27680 1 10
Linux 3.10.0-514.el7.x86_64 (01) 03/09/2021 _x86_64_ (16 CPU)
09:11:39 AM UID PID cswch/s nvcswch/s Command
09:11:40 AM 1000 27680 0.00 0.00 java
09:11:41 AM 1000 27680 0.00 0.00 java
09:11:42 AM 1000 27680 0.00 0.00 java
09:11:43 AM 1000 27680 0.00 0.00 java
09:11:44 AM 1000 27680 0.00 0.00 java
09:11:45 AM 1000 27680 0.00 0.00 java
09:11:46 AM 1000 27680 0.00 0.00 java
09:11:47 AM 1000 27680 0.00 0.00 java
09:11:48 AM 1000 27680 0.00 0.00 java
09:11:49 AM 1000 27680 0.00 0.00 java
Average: 1000 27680 0.00 0.00 java
统计参数详解:
UID
:表示监视任务的真实用户标识编号。PID
:表示被监控任务的进程号。cswch/s
:表示该任务每秒自愿上下文切换次数,当某一任务处于阻塞等待时,将主动让出自己的CPU资源。其中cswch
表示context switch
。nvcswch/s
:表示该任务每秒非资源上下文切换次数,CPU分配给某一任务的时间片已经用完,因此将强迫该进程让出CPU的执行权。其中nvcswch
表示involuntary context switch
Command
:表示该任务的执行命令名称。
REF《Java并发编程的艺术》
[转帖]Linux—CPU核数、上下文切换介绍及pidstat等命令详解的更多相关文章
- Linux下查看CPU型号,内存大小,硬盘空间的命令(详解)
1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | wc -l 2 **uniq命令:删除重 ...
- Linux下的zip和tar压缩解压缩命令详解
一.zip压缩工具 zip的压缩包在windows和linux中都比较常用,它可以压缩目录和文件,压缩时录时,需要指定目录下的文件.zip后面先跟目标文件名,即压缩后得自定义压缩包名,然后跟要压缩的文 ...
- Linux下的crontab定时、执行任务命令详解 oracle 自动备份
在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为&qu ...
- (转)Linux 系统监控、诊断工具之 top命令详解
原文:https://www.linuxidc.com/Linux/2014-12/110563.htm 目录 (1)系统.任务统计信息:(2)进程. cpu 统计信息:(3)最后两行为内存信息:3. ...
- Linux Shell脚本编程--Head/Tail命令详解
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾,看看下面的范例:## ( ...
- [转帖]Linux的wget命令详解
Linux的wget命令详解 来源不明 找到的也是转帖的 https://www.cnblogs.com/cindy-cindy/p/6847502.html Linux wget是一个下载文件的工具 ...
- 【转帖】Linux定时任务Crontab命令详解
Linux定时任务Crontab命令详解 https://www.cnblogs.com/intval/p/5763929.html 知道有crontab 以及 at 命令 改天仔细学习一下 讲sys ...
- [转帖]Linux:cut命令详解
Linux:cut命令详解 https://www.cnblogs.com/Spiro-K/p/6361646.html cut -f cut -f -d cut -c1- 这三个命令好像最常见, 记 ...
- [转帖]Linux chattr 命令详解
Linux chattr 命令详解 https://www.cnblogs.com/ftl1012/p/chattr.html 常见命令参数 1 2 3 4 5 6 7 8 9 10 11 12 A: ...
- 【转帖】linux sort,uniq,cut,wc,tr,xargs命令详解
linux sort,uniq,cut,wc,tr,xargs命令详解 http://embeddedlinux.org.cn/emb-linux/entry-level/201607/21-5550 ...
随机推荐
- 2023-08-28:用go语言编写。给你一个正整数数组nums, 同时给你一个长度为 m 的整数数组 queries。 第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] 。
2023-08-28:用go语言编写.给你一个正整数数组nums, 同时给你一个长度为 m 的整数数组 queries. 第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] . ...
- vue全屏
<template> <div> <img src="../assets/fangda.png" @click="toggleFullscr ...
- Asp .Net Core系列:Exceptionless简介和部署(Windows、Linux、Docker)
目录 一.简介 二.版本 三.运行说明 1.Exceptionless 2.Elasticsearch 3.Exceptionless.UI 四.打包Exceptionless.UI 五.window ...
- 手动实现BERT
本文重点介绍了如何从零训练一个BERT模型的过程,包括整体上BERT模型架构.数据集如何做预处理.MASK替换策略.训练模型和保存.加载模型和测试等. 一.BERT架构 BERT设计初衷是作为 ...
- MySQL篇:第二章_初识MySQL
初始MySQL MySQL的背景 1.前身属于瑞典的一家公司,MySQL AB 2.08年被sun公司收购 3.09年sun被oracle收购 MySQL的优点 1.开源.免费.成本低 2.性能高.移 ...
- 第九部分_Shell脚本之case语句
case语句 关键词:确认过眼神,你是对的人 case语句为多重匹配语句 如果匹配成功,执行相匹配的命令 1. 语法结构 说明:pattern表示需要匹配的模式 case var in #定义变量;v ...
- 提升软件质量?为什么不试试华为云CodeArts Check
摘要:华为云CodeArts Check代码检查服务为用户提供包括代码风格.通用质量与代码安全风险等在内的检查能力,同时提供问题闭环处理.检查报告等功能,从而一站式完成代码检查作业. 本文分享自华为云 ...
- 列举GaussDB(DWS)常见的查询时索引失效场景
摘要:使用GaussDB(DWS)时,有时为了加快查询速度,需要对表建立索引.有时我们会遇到明明建立了索引,查询计划中却发现索引没有被使用的情况.本文将列举几种常见的场景和优化方法. 本文分享自华为云 ...
- XEngine:深度学习模型推理优化
摘要:从显存优化,计算优化两个方面来分析一下如何进行深度学习模型推理优化. 本文分享自华为云社区<XEngine-深度学习推理优化>,作者: ross.xw. 前言 深度学习模型的开发周期 ...
- iOS应用程序发布流程:从测试到上架的完整指南
目录 转载:iOS应用程序的签名.重签名和安装测试 前言 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 转载:iOS应用程序的签名.重签名和安装测试 前言 ipa ...