Linux性能优化

4 篇文章 0 订阅

一、vmstat

1、简介

vmstat命令是一个查看虚拟内存的使用状况的工具,属于sysstat包。查看给定时间间隔的服务器的状态值,包括CPU使用率,内存、虚拟交换内存使用情况以及I/O读写情况;

2、使用

一般使用两个参数,第一个3表示每隔三秒采集一次服务器状态,第二个2表示总共采集两次;

[root@localhost ~]# vmstat 3 2
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 649216 161008     40 253496    0    1    21     2   46   13  0  0 100  0  0
 0  0 649216 160984     40 253496    0    0     0     0  323  600  0  0 100  0  0
3、字段含义
1、procs(进程)
  • r:就绪队列的长度,也就是正在运行或者等待的CPU进程数,当该指标值大于CPU数时,说明出现CPU瓶颈;

查看CPU核心数命令:cat /proc/cpuinfo|grep processor|wc -l

  • b:等待IO的进程数量(不可中断睡眠状态的进程数);
2、memory(内存)
  • swpd:使用虚拟内存的大小;若大于0,表示机器的物理内存不足(内存泄露或者物理内存不足以支持现在的程序)
  • free:空闲内存的大小;
  • buff:已经使用buff的大小,对块设备的读写进行缓冲;
  • cache:已经使用的cache大小,文件系统的cache
3、swap
  • si:每秒从交换区写到内存的大小,由磁盘到内存
  • so:每秒从内存写入交换区的大小,由内存到磁盘
    内存够用时,这两个值都为0,若这两值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。
4、IO
  • bi:每秒读取的块数(读磁盘),单位block
  • bo:每秒写入的块数(写磁盘),单位block
5、system
  • in:每秒中断数,包括时钟中断
  • cs:每秒上下问切换数
    这两个值越大,内核消耗的CPU时间sy会越大
6、CPU
  • us:用户进程消耗的CPU时间;该值较高,说明用户进程消耗时间多,如果长时间超过50%,需要考虑优化程序算法;
  • sy:系统进程消耗的CPU时间;该值较高,说明系统内核消耗CPU资源过多,若us+sy>80%说明可能存在CPU不足;
  • Id:CPU空闲时间,包括IO等待时间;一般us+sy+id=100;
  • wa:等待IO时间;该值过高,说明io等待比较严重,可能是由于磁盘大量随机访问造成的,也可能是磁盘出现瓶颈;

二、top

top,ps,pidstat等工具都可以查看CPU的使用率
top默认使用3s时间间隔,ps使用的是进程的整个声明周期
top显示系统总体CPU和内存的使用情况,以及各个进程的资源使用情况
ps只显示每个进程的资源使用情况;

[root@localhost ~]# top

top - 19:06:11 up 2 days,  4:09,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 277 total,   1 running, 259 sleeping,  17 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   995704 total,   115844 free,   608648 used,   271212 buff/cache
KiB Swap:  2097148 total,  1428988 free,   668160 used.   219420 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                  
  2146 root      20   0 4151620 135696  24988 S   1.0 13.6   6:39.54 gnome-shell                              
  1139 root      20   0  922376   5792    408 S   0.7  0.6  34:55.88 containerd                               
  1620 mysql     20   0 1993692      0      0 S   0.7  0.0  34:01.34 mysqld                                   
  2441 root      20   0  608644   2532    828 S   0.3  0.3   7:55.07 vmtoolsd    

字段解析

  • 第一行:当前时间,运行时间,登录终端数,系统负载(1分钟、5分钟、15分钟的平均负载);
  • 第二行:总进程数发、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数;
  • 第三行:用户占用CPU的时间、系统内核占用CPU的时间、改变过优先级进程占用CPU的时间、CPU空闲时间、IO等待时间、硬中断时间、软中时间;
  • 第四行:总物理内存、空闲内存、已使用内存、内核缓存的内存;
  • 第五行:总虚拟内存、空闲虚拟内存、已使用虚拟内存、缓冲的交换区总量
  • 后面是各个进程的详细信息
    • PID:进程ID
    • USER:进程所有者
    • PR:进程优先级(内核)
    • NI:nice值,表示用户层面优先级,NI=PR-20,-20到19,值越大,优先级越低
    • VIRT:进程使用的虚拟内存大小
    • RES:进程使用物理内存大小
    • SHR:共享内存大小
    • S:进程状态,D,不可中断;R,运行;S,睡眠;T,跟踪/停止;Z,僵尸进程
    • %CPU:进程使用CPU总量
    • %MEM:进程使用物理内总量
    • TIME+:进程使用CPU时间总计
    • COMMAND:命令名
      常用参数
  • -i<时间>:设置刷新使时间
  • -n<次数>:循环显示次数
  • -p<进程号>:指定进程
  • -u<用户名>:指定用户
    交互命令
  • 1:展开多核CPU显示
  • P:根据CPU使用率排序(默认)
  • M:根据内存使用大小排序
  • T:根据时间/累计时间进行排序
  • m:切换显示内存信息
  • t:切换显示命令和CPU状态信息
  • q:退出

三、pidstat

pidstat是sysstat工具的一个而命令,用于监控进程CPU、内存、线程、设备IO等系统资源占用情况。首次显示从系统启动的各项统计信息,之后显示的是上次执行pidstat到此次的统计信息。

[root@localhost ~]# pidstat --help
用法: pidstat [ 选项 ] [ <时间间隔> [ <次数> ] ]
Options are:
[ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ] [ -t ] [ -U [ <username> ] ] [ -u ]
[ -V ] [ -w ] [ -C <command> ] [ -p { <pid> [,...] | SELF | ALL } ]
[ -T { TASK | CHILD | ALL } ]

常用参数

  • -u:默认参数,显示各个进程的CPU统计情况
  • -r:显示各个进程的内存使用情况
  • -d:显示各个进程的IO使用情况
  • -p:指定进程号
  • -w:显示每个进程的上下问切换情况;
  • -t:显示选项任务的线程的统计信息外的额外信息
1、所有进程CPU使用情况
[root@localhost ~]# pidstat
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 	2021年03月25日 	_x86_64_	(8 CPU)

11时14分53秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
11时14分53秒     0         1    0.00    0.01    0.00    0.01     3  systemd
11时14分53秒     0         2    0.00    0.00    0.00    0.00     5  kthreadd
11时14分53秒     0         6    0.00    0.00    0.00    0.00     0  ksoftirqd/0
11时14分53秒     0         7    0.00    0.01    0.00    0.01     0  migration/0
......
  • PID:进程ID
  • %usr:进程在用户空间占用CPU的百分比
  • %system:进程在内核空间占用CPU的百分比
  • %guest:进程在虚拟机占用的CPU百分比
  • %CPU:进程占用CPU的百分比
  • CPU:处理进程的CPU编号
  • Command:当前进程对应的命令
2、内存使用情况(-r)
[root@localhost ~]# pidstat -r
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 	2021年03月25日 	_x86_64_	(8 CPU)

11时20分32秒   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
11时20分32秒     0         1      0.23      0.01  193924   3948   0.40  systemd
11时20分32秒     0       562      0.10      0.01   37476   1720   0.17  systemd-journal
11时20分32秒     0       585      0.01      0.00  192932   1404   0.14  lvmetad
11时20分32秒     0       604      0.03      0.00   50496    480   0.05  systemd-udevd
11时20分32秒     0       779      0.00      0.00   55532    240   0.02  auditd
11时20分32秒     0       781      0.00      0.00   84556    204   0.02  audispd
......
  • Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
  • Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
  • VSZ:虚拟地址大小,虚拟内存的使用KB
  • RSS:常驻集合大小,非交换区五里内存使用KB
3、进程IO使用情况(-d)
[root@localhost ~]# pidstat -d
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 	2021年03月25日 	_x86_64_	(8 CPU)

11时27分38秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
11时27分38秒     0         1     14.50      0.45      0.09  systemd
11时27分38秒     0        65      0.00      0.00      0.00  kswapd0
11时27分38秒     0       467      0.04      0.00      0.00  xfsaild/dm-0
11时27分38秒     0       562      0.09      0.00      0.00  systemd-journal
11时27分38秒     0       585      0.00      0.00      0.00  lvmetad
......
  • kB_rd/s:每秒从磁盘读取的KB
  • kB_wr/s:每秒写入磁盘KB
  • kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
4、进程上下文切换情况(-w)
[root@localhost ~]# pidstat -w -p 467
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 	2021年03月25日 	_x86_64_	(8 CPU)

11时29分45秒   UID       PID   cswch/s nvcswch/s  Command
11时29分45秒     0       467     19.86      0.00  xfsaild/dm-0
  • Cswch/s:每秒主动任务上下文切换数量
  • Nvcswch/s:每秒被动任务上下文切换数量

四、pref

perf是一个用来进行软件性能分析的工具;它可以分析指定应用程序的性能问题,也可以用来分析内核的性能问题;
Linux性能计数器是一个新的基于内核的子系统,他提供一个性能分析框架,包括硬件(CPU,PMU(Performance Monitoring Unit))功能和软件(软件计数器、trace point)功能。
可以通过一下命令安装perf工具

sudo apt update
sudo apt install linux-tools-common linux-tools-generic linux-tools-`uname -r`

perf常用的5 个命令

  • perf list:查看当前硬件环境支持的性能事件;
  • perf stat:分析指定程序的性能状况;
  • perf top:实时显示系统/进程的性能统计信息;
  • perf record:记录一段时间内系统/进程的性能时间;
  • perf report:读取perf record记录的perf.data文件,并显示分析数据;
perf stat
[root@localhost ~]# perf stat ls
anaconda-ks.cfg  docker    initial-setup-ks.cfg  pw_txt  useradd.sh    www   模板  图片  下载  桌面
conf		 dump.rdb  logs			 test	 user_add.txt  公共  视频  文档  音乐

 Performance counter stats for 'ls':

              7.31 msec task-clock                #    0.057 CPUs utilized          
                 3      context-switches          #    0.410 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               318      page-faults               #    0.043 M/sec                  
   <not supported>      cycles                                                      
   <not supported>      instructions                                                
   <not supported>      branches                                                    
   <not supported>      branch-misses                                               

       0.127432225 seconds time elapsed

       0.000000000 seconds user
       0.008797000 seconds sys
  • 1、tesk-clock:任务真正占用处理器的时间,单位ms;
  • 2、context-switches:上下文切换次数;
  • 3、CPU-migrations:处理器迁移次数;为了维持多个处理器负载均衡,在特定条件下会将一个任务冲=从一个CPU迁移到另一个CPU;
  • 4、page-faults:缺页异常次数。当前请求的页面尚未建立里、请求页面不在内存中,或物理地址和虚拟地址的映射关系尚未建立时,都会出发一次缺页异常。
  • 5、cycles:消耗的处理器周期数;
  • 6、instructions:执行了多少条指令;
  • 7、branches:遇到的分支指令数;
  • 8、branche-misses;预测错误的分支指令数;
perf top

常用参数:

  • -e:指定要分析的性能事件;
  • -p:分析目标进程以及其创建的的线程;
  • -k :待符号表的内核映像所在的路径
  • -K:不显示属于内核或模块的符号;
  • -U:不显示属于用户态程序的符号;
  • -d:刷新界面的周期,默认为2s;
  • -g:得到函数的调用关系图(一般都加此参数);

下面是指定进程的性能统计信息

[root@localhost ~]# perf top -g -p 1620 -d 5

Samples: 29  of event 'cpu-clock', 4000 Hz, Event count (approx.): 6875000 lost: 0/0 drop: 0/0                 
Overhead  Shared Object       Symbol                                                                           
  27.27%  [kernel]            [k] finish_task_switch
   7.27%  [kernel]            [k] unroll_tree_refs
   7.27%  mysqld              [.] pfs_start_mutex_wait_v1
   6.36%  [kernel]            [k] clockid_to_kclock
   3.64%  [kernel]            [k] __schedule
   ......
  • 第一列overhead:表示性能事件在所有采用中的比例;
  • 第二列Shared:该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等;
  • 第三列Object:动态共享对象的类型。[.]表示用户空间可执行程序或动态链接库,[k]表示内核空间;
  • 第四列Symbol:表示符号名,也就是函数名,当函数名未知时,用十六进制地址表示。
perf record

perf top只是实时显示,而perf record可以收集一段时间内性能信息到文件perf.data,之后可以perf report命令查看分析

[root@localhost ~]# perf record #ctrl+c结束采样

命令参数:

  • -p :指定待分析进程的 pid(可以是多个,用,分隔列表)
  • -t :指定待分析线程的 tid(可以是多个,用,分隔列表)
  • -u :指定收集的用户数据,uid为名称或数字
  • -a:从所有 CPU 收集系统数据
  • -g:开启 call-graph (stack chain/backtrace) 记录(一般都要加此参数)
  • -C :只统计指定 CPU 列表的数据,如:0,1,3或1-2
  • -r :perf 程序以SCHED_FIFO实时优先级RT priority运
  • 这里填入的数值越大,进程优先级越高(即 nice 值越小)
  • -c : 事件每发生 count 次采一次样
  • -F :每秒采样 n 次
  • -o <output.data>:指定输出文件output.data,默认输出到perf.data
perf report

显示分析之前perf record统计的性能信息;

[root@localhost ~]# perf report

Samples: 26K of event 'cpu-clock', Event count (approx.): 6556500000                                           
Overhead  Command          Shared Object               Symbol                                                  
  99.40%  swapper          [kernel.kallsyms]           [k] native_safe_halt
   0.04%  perf             [kernel.kallsyms]           [k] mem_cgroup_update_page_stat
   0.04%  pool             [kernel.kallsyms]           [k] mpt_put_msg_frame
   0.03%  pool             libc-2.17.so                [.] _int_malloc
   0.03%  swapper          [kernel.kallsyms]           [k] _raw_spin_unlock_irqrestore

相关链接:
https://zhuanlan.zhihu.com/p/141694060?from_voters_page=true
https://segmentfault.com/a/1190000021465563

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值