linux cpu性能分析命令总结及cpu绑定方法

本文详细介绍了Linux系统中CPU的基本概念,包括处理器、核数、硬件线程数、缓存层次等,并探讨了CPU运行队列和调度器的工作原理。同时,文章列举了多种用于分析CPU性能的命令,如uptime、vmstat、mpstat等,并讲解了如何使用taskset进行CPU绑定以优化性能。此外,还提到了CPU组的概念,用于提升特定进程的执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cpu :

概念:

  1. 处理器
  2. 核数
  3. 硬件线程数
  4. cpu指令
  5. 逻辑cpu
  6. 调度器
  7. 运行队列

cpu内存缓存, 缓存有多级缓存, cpu寄存器,运行速度最快,成本最高,空间也最小

在寄存器下一般还会有多级缓存, 多级缓存(一级缓存,二级缓存等)的空间依然比较小,因此有主存,也就是常说的内存

cpu运行队列 有正在运行的, 排队的和就绪队列, 在cpu根据时钟分片,排队调度运行, 因此会出现一定的时延

对于多核处理系统, 内核通常会为每个cpu分配一个队列进行管理, 并尽量使得线程的每次都被放入同一个队列中,也就是运行在一个cpu上,这样,如果cpu缓存中保存了线程的相关信息,运行时将会减少延时, 如果被调度到其他cpu上,因为该cpu没有线程的相关信息,因此需要进行数据交换,从其他cpu获取信息,或者从其他缓存中加载对应的线程信息,会出现一定的延迟

时钟频率, 时钟分片

MMU 负责虚拟地址到物理地址的转换

信息分析工具:

  1. uptime

    可以查看平均负载

    ]# uptime
     23:50:37 up 1 day,  2:44,  3 users,  load average: 0.02, 0.02, 0.05
    
  2. vmstat 包括系统范围的cpu平均负载

    # 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
     3  0   1272 146700      0 444548    0    0     5    22   47  210  0  0 99  0  0
     0  0   1272 146660      0 444548    0    0     0     0   43   83  0  1 99  0  0
     0  0   1272 146660      0 444548    0    0     0     0   35   68  0  0 100  0  0
     0  0   1272 146660      0 444548    0    0     0     0   43   77  0  0 100  0  0
    

    最后几行为cpu信息

    第一行为系统启动以来的总结信息

    r运行队列长度 - 可运行线程的总数

    us 用户态时间

    sy 内核态时间 也就是系统时间

    id 空闲时间

    wa 等待IO

    st 偷取, cpu在虚拟化环境下其他租户上的开销,这个可以在宿主机上通过分配给虚拟机的使用占比来进行分配,防止可以防止一个虚拟机占满全部cpu的情况

  3. mpstat 单个cpu的统计信息

    mpstat
    Linux 3.10.0-123.el7.x86_64 (mirror)    07/06/2019      _x86_64_        (1 CPU)
    
    11:59:37 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    11:59:37 PM  all    0.34    0.00    0.25    0.01    0.00    0.04    0.00    0.00    0.00   99.36
    

    user 用户态时间

    nice 以nice优先级运行的进程用户态时间

    sys 内核态时间

    iowait 等待IO时间

    irq 硬件中断cpu用量

    soft 软件中断cpu用量

    steal 耗费在服务其他租户的时间 根据宿主机调度比例获得

    guest 访问虚拟机的时间

    idle 空闲

  4. sar 历史统计信息

  5. ps

    ps aux |sort -rnk3 |head -10
    
    
    [root@dev ~]# ps aux |sort -rnk3 |head -10
    root      50073  0.3  4.5 992184 45584 ?        Sl   09:52   0:05 mongod -f /data/mongodb/conf/mongodb.cfg
    root       6166  0.1  0.7 136916  7572 ?        Ssl  Jul19   1:17 /root/redis/src/redis-server 0.0.0.0:6379
    root       2408  0.1  0.7 249944  7744 ?        Sl   Jul19   1:58 /usr/sbin/vmtoolsd
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         99  0.0  0.0      0     0 ?        S    Jul19   0:00 [rcuob/90]
    root         98  0.0  0.0      0     0 ?        S    Jul19   0:00 [rcuob/89]
    root         97  0.0  0.0      0     0 ?        S    Jul19   0:00 [rcuob/88]
    

    查看僵尸进程:

    [root@dev ~]# ps -ef|grep defunct
    root      52570  51535  0 10:30 pts/0    00:00:00 grep --color=auto defunct
    
    

    查看D进程:

    D进程是不可中断的, D Uninterruptible sleep (usually IO)

    ps aux | awk '($8=="Z" || $8=="Zs" || $8=="D"){print}'
    
    
  6. top

  7. pidstat 每个进程/线程 cpu用量分解

    # pidstat
    Linux 3.10.0-123.el7.x86_64 (mirror)    07/07/2019      _x86_64_        (1 CPU)
    
    12:05:04 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
    12:05:04 AM     0         1    0.00    0.01    0.00    0.01     0  systemd
    12:05:04 AM     0         2    0.00    0.00    0.00    0.00     0  kthreadd
    12:05:04 AM     0         3    0.00    0.00    0.00    0.00     0  ksoftirqd/0
    12:05:04 AM     0       137    0.00    0.01    0.00    0.01     0  rcu_sched
    12:05:04 AM     0       138    0.00    0.01    0.00    0.01     0  rcuos/0
    
    
    # pidstat -p 46552
    Linux 3.10.0-123.el7.x86_64 (mirror)    07/07/2019      _x86_64_        (1 CPU)
    
    12:06:21 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
    12:06:21 AM   994     46552    0.00    0.00    0.00    0.00     0  epmd
    
    [root@dev ~]# pidstat -p 50073 1
    Linux 3.10.0-123.el7.x86_64 (dev)       07/20/2019      _x86_64_        (1 CPU)
    
    10:18:50 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
    10:18:51 AM     0     50073    0.00    0.00    0.00    0.00     0  mongod
    10:18:52 AM     0     50073    0.00    1.01    0.00    1.01     0  mongod
    10:18:53 AM     0     50073    0.00    0.00    0.00    0.00     0  mongod
    10:18:54 AM     0     50073    1.01    0.00    0.00    1.01     0  mongod
    10:18:55 AM     0     50073    0.00    0.00    0.00    0.00     0  mongod
    
  8. time 个一个命令指示,带cpu用量分解

  9. Dtrace

  10. perf cpu剖析与跟踪, cpu性能计数, 可以分析调用路径

  11. lsof -i |grep 3255 查找对应进程

  12. 线程: ps -eLF |awk ‘{print $3}’|uniq -c|sort -rnk 1 |sed -n ‘1,10p’

    查找线程异常

    第一列为线程个数,第二列为进程号

    [root@dev ~]# ps -eLF |awk '{print $3}'|uniq -c|sort -rnk 1 |sed -n '1,10p'
        303 2
         29 1
         23 1
         19 2844
          5 51535
          5 1
          4 2
          4 2
          3 2
          3 2
    

进程绑定:

一个进程可以绑定在一个或者多个cpu上。 这样可以提高性能

命令 taskset

# taskset  -h
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]

Options:
 -a, --all-tasks         operate on all the tasks (threads) for a given pid
 -p, --pid               operate on existing given pid
 -c, --cpu-list          display and specify cpus in list format
 -h, --help              display this help
 -V, --version           output version information

The default behavior is to run a new command:
    taskset 03 sshd -b 1024
You can retrieve the mask of an existing task:
    taskset -p 700
Or set it:
    taskset -p 03 700
List format uses a comma-separated list instead of a mask:
    taskset -pc 0,3,7-11 700
Ranges in list format can take a stride argument:
    e.g. 0-31:2 is equivalent to mask 0x55555555

For more information see taskset(1).

例如:

taskset  -pc 5-7 10889

将进程10889绑定到5-7cpu上

独占cpu组

Linux提供了cpu组,允许编组cpu并为其分配进程, 可以提高性能, 但同时也会减少其他进程的可调用cpu

mkdir /dev/cpuset; cd /dev/cpuset
mount -t cpuset cpuset /dev/cpuset
 
mkdir prodset; cd prodset
 
echo 7-10 > cpus      
echo 1 > cpu_exclusive 
echo 11111 > tasks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值