如何找到进程申请CPU得不到满足的物理CPU

如何查看Linux服务器中的CPU信息 | 操作系统
如何查看Linux服务器中的CPU信息
在windows系统下我们需要查看一些硬件信息很方便,那么在Linux系统下这些信息要怎么才能查看到呢?本文教你如何查看Linux服务器中的CPU信息。
我们都知道top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面我们就详细介绍它的使用方法。
  top - 02:53:32 up 16 days,& 6:34, 17 users,& load average: 0.24, 0.21, 0.24
  Tasks: 481 total,&& 3 running, 474 sleeping,&& 0 stopped,&& 4 zombie
  Cpu(s): 10.3%us,& 1.8%sy,& 0.0%ni, 86.6%id,& 0.5%wa,& 0.2%hi,& 0.6%si,& 0.0%st
  Mem:&& 4042764k total,& 4001096k used,&&& 41668k free,&& 383536k buffers
  Swap:& 2104472k total,&&&& 7900k used,& 2096572k free,& 1557040k cached
  PID USER&&&&& PR& NI& VIRT& RES& SHR S %CPU %MEM&&& TIME+& COMMAND
  32497 jacky&&&& 20&& 0& 669m 222m& 31m R&& 10& 5.6&&&&&& 29:27.62 firefox
  4788 yiuwing&& 20&& 0& 257m& 18m& 13m S&&& 5& 0.5&&&&&&&&& 5:42.44 konsole
  5657 Liuxiaof& 20&& 0& 585m 159m& 30m S&&& 4& 4.0&&&&&&&&& 5:25.06 firefox
  4455 xiefc&&&&& 20&& 0& 542m& 124m& 30m R&&& 4& 3.1&&&&&&&& 7:23.03 firefox
  6188 Liuxiaof& 20&& 0& 191m&& 17m& 13m S&&& 4& 0.5&&&&&&&&& 0:01.16 konsole
  统计信息区前五行是系统整体的统计信息。第一行是任务队列信息,同 uptime& 命令的执行结果。其内容如下:
  01:06:48& 当前时间
  up 1:22& 系统运行时间,格式为时:分
  1 user& 当前登录用户数
  load average: 0.06, 0.60, 0.48& 系统负载,即任务队列的平均长度。
  三个数值分别为& 1分钟、5分钟、15分钟前到现在的平均值。
  第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:
  Tasks: 29 total& 进程总数
  1 running& 正在运行的进程数
  28 sleeping& 睡眠的进程数
  0 stopped& 停止的进程数
  0 zombie& 僵尸进程数
  Cpu(s): 0.3% us& 用户空间占用CPU百分比
  1.0% sy& 内核空间占用CPU百分比
  0.0% ni& 用户进程空间内改变过优先级的进程占用CPU百分比
  98.7% id& 空闲CPU百分比
  0.0% wa& 等待输入输出的CPU时间百分比
  0.0% hi
  0.0% si
  最后两行为内存信息。内容如下:
  Mem: 191272k total& 物理内存总量
  173656k used& 使用的物理内存总量
  17616k free& 空闲内存总量
  22052k buffers& 用作内核缓存的内存量
  Swap: 192772k total& 交换区总量
  0k used& 使用的交换区总量
  192772k free& 空闲交换区总量
  123988k cached& 缓冲的交换区总量。
  内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
  该数值即为这些内容已存在于内存中的交换区的大小。
  相应的内存再次被换出时可不必再对交换区写入。
  进程信息区统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
  序号& 列名& 含义
  a&& PID& 进程id
  b& PPID& 父进程id
  c& RUSER& Real user name
  d& UID& 进程所有者的用户id
  e& USER& 进程所有者的用户名
  f& GROUP& 进程所有者的组名
  g& TTY& 启动进程的终端名。不是从终端启动的进程则显示为 ?
  h& PR& 优先级
  i& NI& nice值。负值表示高优先级,正值表示低优先级
  j& P& 最后使用的CPU,仅在多CPU环境下有意义
  k& %CPU& 上次更新到现在的CPU时间占用百分比
  l& TIME& 进程使用的CPU时间总计,单位秒
  m& TIME+& 进程使用的CPU时间总计,单位1/100秒
  n& %MEM& 进程使用的物理内存百分比
  o& VIRT& 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
  p& SWAP& 进程使用的虚拟内存中,被换出的大小,单位kb。
  q& RES& 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
  r& CODE& 可执行代码占用的物理内存大小,单位kb
  s& DATA& 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
  t& SHR& 共享内存大小,单位kb
  u& nFLT& 页面错误次数
  v& nDRT& 最后一次写入到现在,被修改过的页面数。
  w& S& 进程状态。
  D=不可中断的睡眠状态
  R=运行
  S=睡眠
  T=跟踪/停止
  Z=僵尸进程
  x& COMMAND& 命令名/命令行
  y& WCHAN& 若该进程在睡眠,则显示睡眠中的系统函数名
  z& Flags& 任务标志,参考 sched.h
  默认情况下仅显示比较重要的& PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND& 列。可以通过下面的快捷键来更改显示内容。
  更改显示内容通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z& 即可显示或隐藏对应的列,最后按回车键确定。
  按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z& 可以将相应的列向左移动。最后按回车键确定。
  按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的& R 键可以将当前的排序倒转。
  ==============================
  top命令使用过程中,还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。
  <空格>:立刻刷新。
  P:根据CPU使用大小进行排序。
  T:根据时间、累计时间排序。
  q:退出top命令。
  m:切换显示内存信息。
  t:切换显示进程和CPU状态信息。
  c:切换显示命令名称和完整命令行。
  M:根据使用内存大小进行排序。
  W:将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
  可以看到,top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗很多系统资源。
  应用实例
  使用top命令可以监视指定用户,缺省情况是监视所有用户的进程。如果想查看指定用户的情况,在终端中按&U&键,然后输入用户名,系统就会切换为指定用户的进程运行界面。
  a.作用
  free命令用来显示内存的使用情况,使用权限是所有用户。
  b.格式
  free [-b -k -m] [-o] [-s delay] [-t] [-V]
  c.主要参数
  -b -k -m:分别以字节(KB、MB)为单位显示内存使用情况。
  -s delay:显示每隔多少秒数来显示一次内存使用情况。
  -t:显示内存总和列。
  -o:不显示缓冲区调节列。
  d.应用实例
  free命令是用来查看内存使用情况的主要命令。和top命令相比,它的优点是使用简单,并且只占用很少的系统资源。通过-S参数可以使用free命令不间断地监视有多少内存在使用,这样可以把它当作一个方便实时监控器。
  #free -b -s5
  使用这个命令后终端会连续不断地报告内存使用情况(以字节为单位),每5秒更新一次linux如何查看当前占用CPU或存储空间最多的5个进程
按时间排序
可以使用一下命令查使用内存最多的5个进程ps -aux | sort -k4nr | head 5或者top (然后按下M,注意大写)可以使用一下命令查使用CPU最多的5个进程ps -aux | sort -k3nr | head 5或者top (然后按下P,注意大写)
top -p 1009
使用top -t 10 记录每10秒数据或者用pidstat -t 10
1、查看物理CPU数[root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep &physical id&|sort |uniq|wc -l12、查看逻辑CPU数[root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep &processor&|wc -l43、查看CPU几核(即核数)[root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep &cores&|uniqcpu cores : 44、查看CPU主频[root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep MHz|uniqcpu MHz : 5、前操作系统内核信息[root@MysqlCluster01 ~]# uname -aLinux MysqlCluster01 2.6.32-431.20.3.el6.x86_64 #1 SMP Thu Jun 19 21:14:45 UTC
x86_64 x86_64 GNU/Linux6、前操作系统发行版信息[root@MysqlCluster01 ~]# cat /etc/issueCentOS release 6.4 (Final)Kernel \r on an \m7、内存使用情况[root@MysqlCluster01 ~]# free -mtotal used free shared buffers cachedMem: 25 0 141 835-/+ buffers/cache: Swap: 7
top 可以看看....ps -ef|grep PID 先查出进程名再用top去看
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?
请输入私信内容:如何将一个进程(线程)绑定到一个固定的CPU核上?
我的图书馆
如何将一个进程(线程)绑定到一个固定的CPU核上?
google一圈,能够实现的方式有两种:第一种:linux的shell命令行方式,命令名字为taskset。第二种就是代码实现级别的了,pthread_setaffinity_np和sched_setaffinity函数接口。
& & & & 第一种方式我已经验证过了,确实可行。同时验证了我心中的疑问:如果将某个线程绑定到某个物理核上之后,在此线程运行结束前,会不会有别的线程被调度到此物理核上执行? &写了一个死循环验证了下,发现绑定之后是不会调度别的线程在此核上运行的!(肉眼观察的,时不时观察下,没发现别的线程在此核上执行;对比了下没有绑定的情况,会发现过段时间此线程就会被调度到别的核心上执行)
& & & & 此种方式有个问题,就是只有线程运行起来后才会被绑定到某个核上,不够及时。
& & & & 具体的方式为:
& & & & & & 1.首先根据系统的差别运行如下安装命令:
& & & & & & & & & sudo apt-get install util-linux & & & &(Debian,Ubuntu or Linux Mint)
& & & & & & & & & sudo yum install util-linux & & & & & & (Fedora,CentOS or RHEL)
& & & & & & 2.相关命令的使用:
& & & & & & & & 2.1 使用命令 taskset &-p &&PID& 来获得此Process的 CPU affinity。
& & & & & & & & & & & &eg: taskset -p 2915 &------& pid 2915's current affinity mask:ff; ff=="",没一个1代表一个核,共8个核,能用的核数也为8个核。
& & & & & & & & 2.2 使用命令 taskset -cp &&PID& 可获得数字形式的CPU affinity。 &&
& & & & & & & & & & & &eg: taskset -cp 2915 ------& pid 2915's current affinity list: 0--7。
& & & & & & & & 接下来为将进程pin到某个核上的命令;
& & & & & & & & 2.3 taskset -p &COREMASK& &&PID&
& & & & & & & & & & & &eg:taskset -p 0x11 9030 &------&pid 9030's current affinity mask: ff , pid 9030's new affinity mask: 11 。意思就是将此进程绑定到了CPU core 0 and 4。
& & & & & & & & 2.4 taskset -cp &CORE-LIST& &&PID& &&
& & & & & & & & & & & & eg:taskset -cp 0,4 &9030 &------&the same as below.
& & & & & & & & & & & & &With "-c" option, you can specify a list of numeric CPU core IDs separated by commas, or even include ranges (e.g., 0,2,5,6-10).
& & & & & & & & 2.5 taskset &COREMASK& &&EXECUTABLE&
& & & & & & & & & & & & eg: taskset 0x1 xxxx & -----&"xxxx" represented the name of one program.
另外:参考文章最后的位置说到,绑定到此物理核之后,别的进程(线程)还可以调度到此核上执行,但是没说绑定的这个线程没执行完之前是否会被别的线程挤掉。根据我的观察是不会被挤掉,这我在文章的开头也有提到。
第二种方式还有待编码验证。
& & & & “待实践后,再补充此部分”
喜欢该文的人也喜欢如何查看进程中各线程的存储空间占用情况
按时间排序
  1、查看物理CPU的个数  [root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep “physical id”|sort |uniq|wc -l  1  2、查看逻辑CPU的个数  [root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep “processor”|wc -l  4  3、查看CPU是几核(即,核心数)  [root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep “cores”|uniq  cpu cores
: 4  4、查看CPU的主频  [root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep MHz|uniq  cpu MHz
:   5、当前操作系统内核信息  [root@MysqlCluster01 ~]# uname -a  Linux MysqlCluster01 2.6.32-431.20.3.el6.x86_64 #1 SMP Thu Jun 19 21:14:45 UTC
x86_64 x86_64 GNU/Linux  6、当前操作系统发行版信息  [root@MysqlCluster01 ~]# cat /etc/issue  CentOS release 6.4 (Final)  Kernel \r on an \m  7、内存使用情况  [root@MysqlCluster01 ~]# free -m  total
cached  Mem:
835  -/+ buffers/cache:
6102  Swap:
可以学习软件包 java.lang.management提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。ClassLoadingMXBean
用于 Java 虚拟机的类加载系统的管理接口。
CompilationMXBean
用于 Java 虚拟机的编译系统的管理接口。
GarbageCollectorMXBean
用于 Java 虚拟机的垃圾回收的管理接口。
MemoryManagerMXBean
内存管理器的管理接口。
MemoryMXBean
Java 虚拟机内存系统的管理接口。
MemoryPoolMXBean
内存池的管理接口。
OperatingSystemMXBean
用于操作系统的管理接口,Java 虚拟机在此操作系统上运行。
RuntimeMXBean
Java 虚拟机的运行时系统的管理接口。
ThreadMXBean
Java 虚拟机线程系统的管理接口。
更多请访问(bug315)
在键盘上按Ctrl+Alt+Delete打开“任务管理器”,然后选“性能”,“PF使用率”就是显示内存使用情况,同时旁边还有统计图显示占用百分比。
按住Ctrl+Alt+Del三个组合键。即可出现“任务管理器”,点“性能”,就可以看到物理内存的情况,上面有PF使用率、总数,可用数。如图所示:
从任务管理器查看CPU和内存使用状态。 在电脑下面任务栏单击鼠标右键“启动任务管理器”(快捷键Ctrl+Alt+Del),然后在“性能”栏目下查看。
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?
请输入私信内容:linux cpu数物理核逻辑核的查看方法及线程进程的绑定方法
cpu数,物理核,逻辑核的关系:
逻辑CPU个数 & 物理CPU个数 * CPU内核数
开启了超线程
逻辑CPU个数 = 物理CPU个数 * CPU内核数
没有开启超线程
cpu数,物理核,逻辑核的查看方法:
processor  : 0
vendor_id  :GenuineIntel
cpu family  :6
model    :26
model name :Intel(R) Xeon(R) CPU
stepping  
cpu MHz  
cache size  : 8192 KB
physical id  :0
siblings    :8
core id   
cpu cores   :4
apicid  
fpu     
fpu_exception :yes
cpuid level   : 11
wp      :yes
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx rdtscp lm constant_tsc ida nonstop_tsc pni monitor ds_cpl vmx est tm2 cx16 xtpr popcnt lahf_lm
bogomips   :4522.12
clflush size  :64
cache_alignment  : 64
address sizes    : 40 bits physical, 48 bits virtual
power management :
以上输出项的含义如下:
processor :系统中逻辑处理核的编号。对于单核处理器,则课认为是其CPU编号,对于多核处理器则可以是物理核、或者使用超线程技术虚拟的逻辑核
vendor_id :CPU制造商
cpu family :CPU产品系列代号
model   :CPU属于其系列中的哪一代的代号
model name:CPU属于的名字及其编号、标称主频
stepping 
:CPU属于制作更新版本
:CPU的实际使用主频
cache size
:CPU二级缓存大小
physical id
:单个CPU的标号
:单个CPU逻辑物理核数
:当前物理核在其所处CPU中的编号,这个编号不一定连续
:该逻辑核所处CPU的物理核数
:用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
:是否具有浮点运算单元(Floating Point Unit)
fpu_exception
:是否支持浮点计算异常
cpuid level
:执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容
:表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
:当前CPU支持的功能
:在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
clflush size
:每次刷新缓存的大小单位
cache_alignment :缓存地址对齐单位
address sizes
:可访问地址空间位数
power management :对能源管理的支持,有以下几个可选支持功能:
  ts:  temperature sensor
  fid: 
frequency id control
  vid:  voltage id control
  ttp:  thermal trip
  100mhzsteps:
  hwpstate:
processor:逻辑核的个数(逻辑核的id)
physical id:物理CPU的id
cpu cores:每个物理CPU的物理核个数
siblings:每个物理CPU上逻辑CPU个数
core id:每个CPU上的物理核的id
查看CPU(各个逻辑核)占用情况:
remark:在top命令下,点击"1"可以查看各个逻辑核的占用情况
进程绑定逻辑核:
#include &stdio.h&
void main(int argc, char** argv)
for(int i = 0; i&=00; i++)
printf("program is running!\n");
线程绑定逻辑核:
CPU亲合力就是指在Linux系统中能够将一个或多个进程绑定到一个或多个处理器上运行.
一个进程的CPU亲合力掩码决定了该进程将在哪个或哪几个CPU上运行.在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能.
一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
·CPU_ZERO() 清空一个集合
·CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉.
·CPU_ISSET()检查一个CPU号是否在这个集合中.
下面两个函数就是用来设置获取线程CPU亲和力状态:
·sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上.第二个参数cpusetsize是mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的进程此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行.
·sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值为0.也表示的是当前进程
cpu_set_t的定义
typedef unsigned long int __cpu_
typedef struct
__cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;
unsigned int __i; \
cpu_set_t *__arr = (cpusetp); \
for (__i = 0; __i & sizeof (cpu_set_t) / sizeof (__cpu_mask); ++__i) \
__arr-&__bits[__i] = 0; \
} while (0)
((cpusetp)-&__bits[__CPUELT (cpu)] |= __CPUMASK (cpu))
# define __CPU_CLR(cpu, cpusetp) \
((cpusetp)-&__bits[__CPUELT (cpu)] &= ~__CPUMASK (cpu))
# define __CPU_ISSET(cpu, cpusetp) \
(((cpusetp)-&__bits[__CPUELT (cpu)] & __CPUMASK (cpu)) != 0)
测试代码:
#include&stdlib.h&
#include&stdio.h&
#include&sys/types.h&
#include&sys/sysinfo.h&
#include&unistd.h&
#define __USE_GNU
#include&sched.h&
#include&ctype.h&
#include&string.h&
#include&pthread.h&
#define THREAD_MAX_NUM 100
int num=0;
void* threadFun(void* arg)
int *a = (int *)
printf("the a is:%d\n",*a);
CPU_ZERO(&mask);
CPU_SET(*a,&mask);
if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
printf("warning: could not set CPU affinity, continuing...\n");
CPU_ZERO(&get);
if (sched_getaffinity(0, sizeof(get), &get) == -1)
printf("warning: cound not get thread affinity, continuing...\n");
for (i = 0; i & i++)
if (CPU_ISSET(i, &get))
printf("this thread %d is running processor : %d\n", i,i);
return NULL;
int main(int argc, char* argv[])
num = sysconf(_SC_NPROCESSORS_CONF);
pthread_t thread[THREAD_MAX_NUM];
printf("system has %i processor(s). \n", num);
int tid[THREAD_MAX_NUM];
for(i=0;i&i++)
pthread_create(&thread[0],NULL,threadFun,(void*)&tid[i]);
for(i=0; i& i++)
pthread_join(thread[i],NULL);
编译命令:gcc bind.c -o bind -lpthread
执行:./bind
输出结果:略
特别注意:
#define __USE_GNU不要写成#define _USE_GNU
#include&pthread.h&必须写在#define __USE_GNU之后,否则编译会报错
查看你的线程情况可以在执行时在另一个窗口使用top -H来查看线程的情况,查看各个核上的情况请使用top命令然后按数字“1”来查看。
Linux下区分物理CPU、逻辑CPU和CPU核数
Linux查看对应的线程进程CPU问题
Linux系统下查看cpu、内存、进程、硬盘、网卡
Linux上如何查看物理CPU个数,核数,线程数
c++ 获取cpu逻辑核数
linux查看系统负载
Linux上如何查看某个进程的线程
KVM上如何绑定虚拟机vcpu与物理CPU?
linux服务器查看CPU物理颗数.内核数.线程数查看
linux 进程、内存、cpu等查看命令
没有更多推荐了,

我要回帖

更多关于 手机CPU进程 的文章

 

随机推荐