소프트웨어 성능 테스트, 분석 및 튜닝 연습으로가는 길 _ 읽기 노트 (3)

 

2 장 서비스 성능 모니터링 및 분석

2.1 Linux 서버 성능 모니터링 및 분석

2.1.1 vmsat를 통해 서버 성능 문제 파기

vmstat는 가상 메모리 통계 (가상 메모리 통계)의 약어로 운영 체제의 가상 메모리, 프로세스 및 CPU 활동을 모니터링 할 수 있습니다. 시스템의 전반적인 상황에 대한 통계를 작성하는 것이지만, 특정 프로세스에 대한 심층 분석이 불가능하다는 단점이 있습니다.

가상 메모리의 원리 

물리적 메모리에서 직접 데이터를 읽고 쓰는 것이 하드 디스크에서 데이터를 읽고 쓰는 것보다 훨씬 빠르다는 것을 알고 있으므로 모든 데이터 읽기 및 쓰기가 메모리에서 완료되고 메모리가 제한되어 있습니다. 물리적 메모리와 가상 메모리의 개념.

물리적 메모리는 시스템 하드웨어에서 제공하는 메모리 크기입니다. 실제 메모리입니다. 물리적 메모리에 비해 Linux에서는 가상 메모리라는 개념이 있습니다. 가상 메모리는 물리적 메모리 부족을 해결하기 위해 제안 된 전략입니다. 디스크 공간을 사용합니다. . 논리적 메모리의 일부가 가상화되고 가상 메모리로 사용되는 디스크 공간을 스왑 공간 ( Swap Space )이라고합니다.

물리적 메모리의 확장으로 Linux는 물리적 메모리가 부족할 때 스왑 파티션의 가상 메모리를 사용합니다.보다 구체적으로 커널은 일시적으로 사용되지 않은 메모리 블록 정보를 스왑 공간에 기록합니다. 이 메모리는 다른 용도로 사용할 수 있습니다. 원본 콘텐츠가 필요할 때 정보는 스왑 공간에서 물리적 메모리로 다시 읽혀집니다.

Linux의 메모리 관리는 페이징 액세스 메커니즘을 채택합니다. 물리적 메모리를 최대한 활용할 수 있도록 커널은 물리적 메모리에서 자주 사용되지 않는 데이터 블록을 적절한 시간에 가상 메모리로 자동으로 스왑하고 데이터 블록을 자주 사용합니다. . 정보는 실제 메모리에 보관됩니다.

Linux 메모리의 작동 메커니즘을 이해하려면 다음 측면을 알아야합니다.

    우선, 리눅스 시스템은 가능한 한 많은 물리적 메모리를 확보하기 위해 수시로 페이지를 스왑 할 것이며, 메모리가 필요하지 않더라도 리눅스는 일시적으로 사용하지 않는 메모리 페이지를 스왑 할 것입니다. 이것은 교환을 기다리는 데 필요한 시간을 피할 수 있습니다.

    둘째, Linux 페이지 스와핑은 조건부입니다. 사용하지 않을 때 모든 페이지가 가상 메모리로 스왑되는 것은 아닙니다. Linux 커널은 "최근에 가장 자주 사용 된"알고리즘에 따라 자주 사용하지 않는 페이지 파일을 가상 메모리로만 스왑합니다. 현상 : Linux에는 많은 물리적 메모리가 있지만 스왑 공간도 많이 사용됩니다. 실제로 이것은 놀라운 일이 아닙니다. 예를 들어 많은 메모리를 차지하는 프로세스가 실행 중일 때 많은 메모리 리소스를 소모해야합니다. 이때 자주 사용하지 않는 페이지 파일은 가상 메모리로 스왑되지만 나중에 이것은 많은 메모리 리소스를 차지합니다. 프로세스가 종료되고 많은 메모리가 해제되면 방금 교체 된 페이징 파일이 물리적 메모리로 자동 교체되지 않습니다. 필요한 경우가 아니면 시스템 물리적 메모리가 이 순간에 많은 자유가 있고, 스왑 공간도 사용되고 있습니다. 방금 언급 한 현상이 나타났습니다. 이와 관련하여 무슨 일이 일어나고 있는지 아는 한 아무것도 걱정하지 마십시오.

    마지막으로 스왑 공간의 페이지는 사용 중일 때 먼저 물리적 메모리로 스왑됩니다. 이때 이러한 페이지를 수용 할 수있는 물리적 메모리가 충분하지 않으면 즉시 스왑됩니다. 그 이후로는 충분하지 않을 수 있습니다. 이러한 교환 된 페이지는 결국 Linux에 가짜 충돌 및 서비스 이상과 같은 문제를 유발합니다. Linux는 일정 시간 내에 자체적으로 복구 할 수 있지만 기본적으로 복구 된 시스템을 사용할 수 없습니다.

  따라서 Linux 메모리 사용을 합리적으로 계획하고 설계하는 것이 매우 중요합니다.

   시스템에서 실행되는 모든 프로세스는 메모리를 사용해야하지만 모든 프로세스가 항상 시스템에서 할당 한 메모리 공간을 사용해야하는 것은 아닙니다. 시스템 작동에 필요한 메모리가 실제 물리적 메모리를 초과하면 커널은 일부 프로세스가 차지했지만 사용되지 않은 물리적 메모리의 일부 또는 전체를 해제하고 다음 프로세스 호출까지 데이터의이 부분을 디스크에 저장합니다. 필요한 프로세스에 제공된 메모리를 해제합니다.

    Linux 메모리 관리에서 위에서 언급 한 메모리 스케줄링은 주로 "페이징"및 "스와핑"을 통해 수행됩니다. 페이징 알고리즘은 메모리에서 최근에 사용한 페이지를 디스크로 변경하고 프로세스가 사용할 수 있도록 메모리에 활성 페이지를 유지하는 것입니다. 스왑 기술은 페이지의 일부가 아닌 전체 프로세스를 디스크로 스왑하는 것입니다.

    디스크에 페이지를 쓰는 프로세스를 페이지 아웃이라고하고 디스크에서 메모리로 페이지를 반환하는 프로세스를 페이지 인이라고합니다. 커널에 페이지가 필요하지만 페이지가 물리적 메모리에없는 것을 발견하면 (Page-Out이 되었기 때문에) 이때 페이지 오류 (Page Fault)가 발생합니다.

    시스템 커널이 실행 가능한 메모리가 적어지면 Page-Out을 통해 실제 메모리의 일부를 해제합니다. Page-Out이 자주 발생하지는 않지만 Page-out이 자주 계속 발생하면 커널이 페이징을 관리하는 시간이 프로그램 실행 시간을 초과 할 때까지 시스템 성능이 급격히 떨어집니다. 이때 시스템이 매우 느리게 실행되었거나 스 래싱이라고도하는 일시 중지 상태에 들어갔습니다.

[root@1a01vlb9935zzzz ~]# vmstat 1 10
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 6227816   5272 1458356    0    0     0     1    1    2  1  1 99  0  0
 0  0      0 6227772   5272 1458356    0    0     0     0 1463  296  0  0 100  0  1
 0  0      0 6227676   5272 1458356    0    0     0    37  484  331  0  0 100  0  0
 0  0      0 6227040   5272 1458356    0    0     0    20  753  433  3  1 95  0  1
 0  0      0 6226216   5272 1458356    0    0     0     0  494  374  0  0 99  0  0
 0  0      0 6225752   5272 1458356    0    0     0     0  925  336  1  0 99  0  0
 0  0      0 6226556   5272 1458360    0    0     0     0  626  464  2  1 97  0  1
 0  0      0 6225280   5272 1458372    0    0     0     0  775  384  1  1 99  0  0
 0  0      0 6226692   5272 1458372    0    0     0    52 1526  458  1  1 97  0  1
 0  0      0 6226840   5272 1458384    0    0     0     0  790  459  1  1 98  0  0

vmstat 1 10, 매개 변수 1은 몇 초마다 서버 데이터를 가져 오는 것을 의미하고 매개 변수 2는 여러 번 가져 오는 것을 의미합니다.

매개 변수 설명 :

데이터 카테고리 데이터 항목  기술
프록  아르 자형 실제 실행중인 명령 대기열에서 현재 실행중인 명령 수, CPU에서 실행해야하는 작업 수를 나타냅니다.이 데이터가 CPU 코어 수를 초과하는 것으로 확인되면 CPU 병목 현상이있을 수 있습니다 (와 결합해야 함). CPU 사용량 데이터 인덱스 분석), 일반적으로이 데이터 CPU 코어 수가 3 개를 초과하면 상대적으로 높고, 5 개를 초과하면 매우 높습니다 .10 개를 초과하면 매우 비정상이며 서버 상태가 매우 높습니다. 위험한. 실행 대기열이 CPU 코어 수를 너무 많이 초과하면 CPU 사용량이 매우 많아 일반적으로 CPU 사용량이 높아진다는 의미입니다.
I / O, 메모리 스왑, CPU 및 기타 리소스가 블로킹을 유발하기를 기다리는 등 리소스 대기로 인해 현재 차단 된 명령어 수를 나타냅니다. 값이 너무 높으면 I / O, 메모리가 있는지 확인해야합니다. , CPU 및 서버의 기타 리소스가 차단되었습니다. 병목 현상이 발생했습니다.
기억 swpd 사용 된 가상 메모리 (스왑) 크기를 나타냅니다. 스왑은 서버의 실제 메모리가 충분하지 않을 때 서버의 실제 메모리 공간의 일부가 실행을 위해 실제 메모리가 긴급하게 필요한 프로그램에서 사용하기 위해 해제되고 실제 메모리에서 해제되는 콘텐츠를 의미합니다. 실제로 실행중인 프로그램은 이러한 내용이 스왑에 저장되고 이러한 프로그램이 실제로 실행되면 스왑에서 실제 메모리로 복원됩니다. 스왑은 일반적으로 디스크 공간을 사용하며 디스크 I / O 읽기 및 쓰기는 일반적으로 물리적 메모리보다 훨씬 느립니다. 스왑 읽기 및 쓰기가 많은 경우 프로그램 성능에 큰 영향을 미칩니다. 가상 메모리의 사용 크기는 물리적 메모리에서 전환 된 콘텐츠의 크기 (단위 : k)입니다. swpd의 값이 0보다 크다고해서 서버의 물리적 메모리가 충분하지 않다는 의미는 아니며 일반적으로 si 등의 두 데이터 표시기를 결합해야합니다. 여전히 약 0으로 유지되면 서버의 실제 메모리 메모리는 여전히 충분합니다.
비어 있는 사용 가능한 물리적 메모리의 크기 (k), 즉 사용되지 않는 물리적 메모리의 양을 나타냅니다. 사용 가능한 데이터에는 buff 및 cache의 두 열 값이 포함되지 않습니다.
버프 Linux 시스템 버퍼의 메모리 크기를 나타냅니다 (단위는 k). 일반적으로 블록 디바이스의 읽기 및 쓰기를 위해 버퍼가 필요합니다. 일반적으로 메모리가 큰 서버는 더 큰 값을 가지며 운영 체제에서 자동으로 조정합니다. 서버의 물리적 메모리에 따라 읽기 및 쓰기 속도를 향상시키기 위해 버퍼 영역에서 사용하는 메모리 크기
은닉처 열린 파일을 캐시하는 데 사용되는 메모리의 크기를 나타냅니다. 캐시는 우리가 연 파일을 캐시하는 데 직접 사용되며 물리적 메모리의 일부는 파일 및 디렉토리의 캐시로 사용됩니다. 이는 프로그램 실행 성능을 향상시키기위한 것입니다. . 프로그램 사용시 메모리를 사용하면 버퍼 / 캐시가 빠르게 사용되며, 사용 가능한 물리적 메모리가 부족하면 (사용 가능한 메모리가 부족할 경우) 캐시 된 메모리가 해제됩니다.
가상 메모리 스왑  가상 메모리 (스왑)에서 메모리로 읽어 들인 데이터 또는 콘텐츠의 초당 크기를 나타냅니다.이 값이 오랫동안 0보다 크면 실제 메모리가 충분하지 않을 수 있음을 의미합니다.
그래서  초당 실제 메모리에서 가상 메모리로 기록 된 데이터 또는 콘텐츠의 크기를 나타냅니다.
디스크 IO 와 함께 데이터 블록 장치가 초당 읽은 블록 수를 나타냅니다. 디스크에서 데이터를 읽는 값은 초당 디스크에서 읽는 블록 수를 나타냅니다. 여기서 블록 장치는 시스템의 모든 디스크 및 기타 블록 장치를 나타냅니다. Linux 기본 블록 크기는 1024 바이트 (바이트)입니다.
 초당 기록되는 블록 장치의 빠른 수를 나타내며 데이터는 디스크에 기록됩니다.이 값은 초당 디스크에 기록되는 블록 수를 나타냅니다. bi 및 bo의 값이 클수록 (예 : 1024K 이상) ), CPU가 대기 중입니다. I / O 값이 커집니다.
체계  클럭 인터럽트를 포함하여 초당 CPU 인터럽트 (인터럽트) 수를 나타냅니다.
cs  초당 CPU 컨텍스트 전환 수를 나타냅니다. 시스템 함수가 호출되면 스레드 전환 및 프로세스 컨텍스트 전환을 포함한 컨텍스트 전환이 발생합니다. 이 값은 가능한 한 작아야합니다. 너무 크면 스레드 또는 프로세스 수를 줄이는 것이 좋습니다. 예를 들어 Nginx 및 Tomcat과 같은 웹 서비스에 구성되는 스레드 및 프로세스 수는?
일반적으로 성능 스트레스 테스트 중에 수천 또는 수만 개의 동시 호출이 수행됩니다. 웹 서버를 구성하는 프로세스 수는 성능 스트레스 테스트에서 cs가 발견 될 때까지 프로세스 또는 스레드 수의 최고치에서 천천히 줄일 수 있습니다. 상대적으로 작은 값에 도달합니다. 이때 스레드와 프로세스의 수는 더 적절한 값입니다. 시스템 호출의 경우도 마찬가지입니다. 시스템 함수가 호출 될 때마다 코드가 커널 공간에 들어가 컨텍스트 전환이 발생합니다. 이로 인해 리소스가 소모되므로 시스템 함수를 자주 호출하지 않도록해야합니다. 컨텍스트 전환 시간이 너무 많으면 대부분의 CPU 시간이 컨텍스트 전환 작업에 낭비되어 CPU가 심각한 업무 (CPU 사용자 모드)를 수행하는 시간이 줄어들고 CPU가 완전히 활용되지 않음을 의미합니다. 이는 권장되지 않습니다. in 및 cs가 관찰됩니다.이 두 지표는 매우 높으므로 시스템 성능을 조정해야합니다.
CPU  우리  사용자 모드 CPU 사용 시간의 백분율을 나타냅니다. 일반적으로 값이 높을수록 일반적으로 CPU를 더 잘 사용합니다.
그의  시스템 커널 프로세스 실행이 차지하는 CPU 시간의 백분율을 나타냅니다. sy 값이 높으면 커널이 많은 CPU 리소스를 소비 함을 나타냅니다. 일반적으로 잦은 in, cs 및 I / O 작업이 너무 높아서 sy 인덱스가 발생합니다. 너무 높다.
신분증  유휴 CPU 시간의 백분율을 나타냅니다. 일반적으로 cs + us + sy = 100입니다. 일반적으로 id는 공간 cpu의 사용률, us는 사용자 cpu 사용률, sy는 시스템 CPU 사용률로 간주 할 수 있습니다.
wa  表示I/O 等待时间百分比,wa的值高时,说明I/O 等待比较严重,这可能是由于磁盘大量进行随机访问所造成的,也可能是磁盘出现了瓶颈(块操作非常频繁)
st  表示CPU等待虚拟机调度的时间占比,这个指标在虚拟机中才会有,在物理机中,该值一般维持0。

vmstat的其他参数 :

[root@1a01vlb9935zzzz ~]# vmstat --help

Usage:
 vmstat [options] [delay [count]]

Options:
 -a, --active           active/inactive memory  # 显示活跃和非活跃的内存
 -f, --forks            number of forks since boot  #显示操作系统从启动到至今的启动过的进程
 -m, --slabs            slabinfo   # 查看slab信息,slab是linux的内存管理的分配器
 -n, --one-header       do not redisplay header # 只显示头部第一行信息
 -s, --stats            event counter statistics #显示内存相关的统计信息及多种系统操作发生的次数
 -d, --disk             disk statistics # 显示每一块磁盘的I/O相关信息
 -D, --disk-sum         summarize disk statistics # 显示磁盘的I/O汇总信息
 -p, --partition <dev>  partition specific statistics # 显示磁盘中某个分区的I/O读写信息
 -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

操作实例 :

[root@1a01vlb9935zzzz ~]# vmstat -a 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 6224844 416788 1037276    0    0     0     1    2    3  1  1 99  0  0
 0  0      0 6224828 416788 1037400    0    0     0     0  364  277  0  0 100  0  0
 0  0      0 6224952 416788 1037428    0    0     0     0  510  334  0  0 100  0  0
 0  0      0 6224604 416788 1037440    0    0     0     6 1052  381  0  0 100  0  0
 0  0      0 6224704 416788 1037440    0    0     0     0  488  358  0  0 100  0  0
[root@1a01vlb9935zzzz ~]# vmstat -f
     18668995 forks
[root@1a01vlb9935zzzz ~]# vmstat -m
Cache                       Num  Total   Size  Pages
isofs_inode_cache           102    102    640     51
xfs_dqtrx                     0      0    528     31
xfs_dquot                     0      0    488     33
xfs_ili                   29760  29760    168     48
xfs_inode                 33898  33898    960     34
xfs_efd_item                390    390    416     39
xfs_log_ticket             1056   1276    184     44
bio-3                      1173   1428    320     51
.....
[root@1a01vlb9935zzzz ~]# vmstat -n
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 6224928   5272 1461004    0    0     0     1    2    3  1  1 99  0  0
[root@1a01vlb9935zzzz ~]# vmstat
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 6222468   5272 1461080    0    0     0     1    2    3  1  1 99  0  0
[root@1a01vlb9935zzzz ~]# vmstat -s
      7907324 K total memory
       216988 K used memory
      1037348 K active memory
       416792 K inactive memory
      6224032 K free memory
         5272 K buffer memory
      1461032 K swap cache
      4063228 K total swap
            0 K used swap
      4063228 K free swap
      3303852 non-nice user cpu ticks
          132 nice user cpu ticks
      3443801 system cpu ticks
    588923011 idle cpu ticks
        41817 IO-wait cpu ticks
            0 IRQ cpu ticks
        52761 softirq cpu ticks
       799968 stolen cpu ticks
       445298 pages paged in
      6840811 pages paged out
            0 pages swapped in
            0 pages swapped out
   1259940674 interrupts
    662750235 CPU context switches
   1607132237 boot time
     18669798 forks
[root@1a01vlb9935zzzz ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
vda    19780     44  890340  133870 1135292 118893 13682292 31496860      0   4747
sr0       36      0     256      17      0      0       0       0      0      0
dm-0   19017      0  819440  132266 1140638      0 13674052 62533285      0   5865
dm-1     136      0    6520     111      0      0       0       0      0      0
dm-2     174      0    5183      88      4      0    4096      32      0      0
[root@1a01vlb9935zzzz ~]# vmstat -D
            5 disks
            4 partitions
        39143 total reads
           44 merged reads
      1721739 read sectors
       266352 milli reading
      2275934 writes
       118893 merged writes
     27360440 written sectors
     94030177 milli writing
            0 inprogress IO
        10612 milli spent IO
[root@1a01vlb9935zzzz ~]# df -h
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LVroot   76G  2.9G   73G   4% /
devtmpfs                       3.8G     0  3.8G   0% /dev
tmpfs                          3.8G  8.0K  3.8G   1% /dev/shm
tmpfs                          3.8G   17M  3.8G   1% /run
tmpfs                          3.8G     0  3.8G   0% /sys/fs/cgroup
/dev/vda1                      497M  294M  204M  60% /boot
/dev/mapper/VGapp-LVapp         50G   33M   50G   1% /app
tmpfs                          773M     0  773M   0% /run/user/0
[root@1a01vlb9935zzzz ~]# vmstat -p /dev/vda1
vda1          reads   read sectors  writes    requested writes
                 243      53061       2061       4144
[root@1a01vlb9935zzzz ~]# vmstat -w -t 1 10
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu-------- -----timestamp-----
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st                 CST
 1  0            0      6223760         5272      1461388    0    0     0     1    2    3   1   1  99   0   0 2020-12-22 16:36:23
 0  0            0      6224216         5272      1461388    0    0     0     0 1156  373   1   0  99   0   0 2020-12-22 16:36:24
 0  0            0      6219640         5272      1461392    0    0     0    16  718  452   1   1  98   0   0 2020-12-22 16:36:25
 0  0            0      6219524         5272      1461392    0    0     0     0  848  913   1   1  98   0   0 2020-12-22 16:36:26
 0  0            0      6224456         5272      1461400    0    0     0     0  560  495   1   0  99   0   0 2020-12-22 16:36:27
 0  0            0      6224584         5272      1461400    0    0     0     0 1549  280   0   0  99   0   0 2020-12-22 16:36:28
 0  0            0      6223716         5272      1461400    0    0     0     0  503  350   0   1  99   0   0 2020-12-22 16:36:29
 0  0            0      6223716         5272      1461400    0    0     0     0  316  259   0   0 100   0   0 2020-12-22 16:36:30
 0  0            0      6223468         5272      1461400    0    0     0     0  628  268   0   0 100   0   0 2020-12-22 16:36:31
 0  0            0      6223468         5272      1461400    0    0     0     0  373  242   0   0 100   0   0 2020-12-22 16:36:32

2.1.2 通过mpstat分析服务器性能指标

mpstat是 Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPU系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。

mpstat直接使用,输出为从系统启动以来的平均值,mpstat 1 10 表示每隔1s获取一次数据,获取10次。

[root@1a01vlb9935zzzz ~]# mpstat
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

05:10:46 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:10:46 PM  all    0.55    0.00    0.58    0.01    0.00    0.01    0.13    0.00    0.00   98.72
[root@1a01vlb9935zzzz ~]# mpstat 1 10
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

05:10:54 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:10:55 PM  all    1.25    0.00    1.25    0.00    0.00    0.25    0.75    0.00    0.00   96.51
05:10:56 PM  all    1.75    0.00    1.00    0.00    0.00    0.00    0.25    0.00    0.00   96.99
05:10:57 PM  all    0.76    0.00    0.25    0.00    0.00    0.00    0.00    0.00    0.00   98.99
05:10:58 PM  all    0.75    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   98.75
05:10:59 PM  all    1.50    0.00    1.50    0.25    0.00    0.00    0.25    0.00    0.00   96.50
05:11:00 PM  all    3.80    0.00    8.61    0.00    0.00    0.00    2.03    0.00    0.00   85.57
05:11:01 PM  all    6.60    0.00   14.21    0.00    0.00    0.25    2.54    0.00    0.00   76.40
05:11:02 PM  all    1.50    0.00    0.75    0.00    0.00    0.00    0.75    0.00    0.00   97.00
05:11:03 PM  all    0.75    0.00    0.50    0.00    0.00    0.00    0.50    0.00    0.00   98.25
05:11:04 PM  all    0.75    0.00    0.25    0.00    0.00    0.00    0.50    0.00    0.00   98.50
Average:     all    1.93    0.00    2.86    0.03    0.00    0.05    0.75    0.00    0.00   94.38
[root@1a01vlb9935zzzz ~]#

参数说明 :

  • %usr:表示的是用户模式下CPU使用时间的百分比。
  • %nice : 表示CPU在进程优先级调度下CPU占用时间的百分比。在操作系统中,进程的运行可以设置优先级的,优先级越高,获得CPU运行的机会越高,这个值一般都是0.00, 但是在系统中如果修改过默认优先级,%nice就会产生占用时间百分比,在linux中执行top或者ps命令时,通常会输出PRI/PR、NI、%ni/%nice这三个指标
[root@1a01vlb9935zzzz ~]# top
top - 17:21:11 up 17 days,  7:43,  1 user,  load average: 0.10, 0.07, 0.05
Tasks: 136 total,   1 running, 135 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.8 us,  0.4 sy,  0.0 ni, 98.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7907324 total,  6221880 free,   218764 used,  1466680 buff/cache
KiB Swap:  4063228 total,  4063228 free,        0 used.  7365952 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  1320 root      20   0  123684   9964   1404 S   2.0  0.1 175:13.39 OSWatcher7.sh
     9 root      20   0       0      0      0 S   0.3  0.0  17:08.33 rcu_sched
  1575 root      20   0  128272   5588   3444 S   0.3  0.1  35:02.15 YDService
     1 root      20   0  191000   3984   2600 S   0.0  0.1   0:19.46 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.17 kthreadd
     3 root      20   0       0      0      0 S   0.0  0.0   0:15.43 ksoftirqd/0
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     7 root      rt   0       0      0      0 S   0.0  0.0   0:54.57 migration/0
  1. PR:表示进程的优先级。值越小,优先级越高,会越早获得CPU的执行权
  2. NI : 这个表示进程的Nice值,表示进程可被执行的优先级修正数值,PRI值越小会越早被CPU执行,在加入Nice值后,新的PR值= 旧的PR+Nice值。Nice值越小,PR值就会越小,就会越早被CPU执行。在linux操作系统中,如果Nice的值相同,进程uid为root用户进程的执行优先级会更高,通常情况下,子进程会继承父进程的Nice值,在操作系统启动时init进程会被赋予0,其他进程会自动继承这个Nice值。
  3. %ni:表示改变过优先级的进程占用CPU的时间百分比,即可理解为Nice值影响了内核分配给进程的CPU时间片的多少。
  • %sys : 表示系统内核进程执行时间百分比,该值越高,说明系统内核消耗CPU资源越多,和vmstat中的sy数据基本一致。
  • %iowait :表示I/O等待时间百分比,该值越高,说明等待越严重,和vmstat的wa数据基本一致。
  • %irq:表示用于处理系统中断的CPU百分比,硬中断时间,和vmstat的in数据类似,
  • %soft:表示用户软件中断的CPU百分比,软中断时间,
  • %steal:表示CPU等待虚拟机调用的时间占比,这个指标在虚拟机中才会用,在物理机中该值一般维持为0
  • %guest:表示运行vCPU(虚拟处理器)时所消耗的CPU时间百分比
  • %gnice:表示运行降级虚拟程序所使用的CPU占比
  • %idle : 表示空闲CPU时间的占比。

vmstat和mpstat 命令的差别:mpstat 可以显示每个处理器的统计,而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题。

其他使用方式 : 

   - P : 指定某个CPU查看资源使用情况,ALL表示显示单个和所有的平均,也可指定CPU数字查看单个资源使用情况。

[root@1a01vlb9935zzzz ~]# mpstat -P ALL 2 5
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

05:48:36 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:48:38 PM  all    1.75    0.00    0.75    0.00    0.00    0.00    0.13    0.00    0.00   97.37
05:48:38 PM    0    1.01    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   98.49
05:48:38 PM    1    2.01    0.00    1.01    0.00    0.00    0.00    0.00    0.00    0.00   96.98
05:48:38 PM    2    1.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   98.00
05:48:38 PM    3    2.97    0.00    1.49    0.00    0.00    0.00    0.50    0.00    0.00   95.05
[root@1a01vlb9935zzzz ~]# mpstat -P 2  2 5
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

05:49:33 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:49:35 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
05:49:37 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
05:49:39 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
05:49:41 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
05:49:43 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

2.1.3 通过pidstat发现性能问题

pidstat 是linux操作系统中某个进程进行资源监控的一个常用命令,使用命令可以列出每个进程id占用的资源情况,如CPU,内存、设备IO、任务切换、线程等。

pidstat 直接执行显示系统所有进程的资源使用情况

[root@1a01vlb9935zzzz ~]# pidstat
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

08:20:29 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
08:20:29 PM     0         1    0.00    0.00    0.00    0.00     0  systemd
08:20:29 PM     0         2    0.00    0.00    0.00    0.00     2  kthreadd
08:20:29 PM     0        11    0.00    0.00    0.00    0.00     0  watchdog/0
08:20:29 PM     0       719    0.00    0.00    0.00    0.00     0  irqbalance
08:20:29 PM    81       729    0.00    0.00    0.00    0.00     0  dbus-daemon
08:20:29 PM     0       740    0.00    0.00    0.00    0.00     0  systemd-logind
08:20:29 PM   997       742    0.00    0.00    0.00    0.00     0  polkitd
08:20:29 PM     0       747    0.00    0.01    0.00    0.01     0  watchdog
08:20:29 PM     0       934    0.00    0.00    0.00    0.00     1  atd
08:20:29 PM     0       937    0.00    0.00    0.00    0.00     3  crond
08:20:29 PM     0      1010    0.01    0.00    0.00    0.01     2  tuned
08:20:29 PM     0      1014    0.00    0.00    0.00    0.00     1  rsyslogd
08:20:29 PM     0      1320    0.65    0.05    0.00    0.70     1  OSWatcher7.sh
08:20:29 PM   996      1390    0.00    0.00    0.00    0.00     2  chronyd
08:20:29 PM     0      1511    0.01    0.01    0.00    0.01     2  OSWatcherFM7.sh
08:20:29 PM     0      1575    0.07    0.07    0.00    0.14     3  YDService
08:20:29 PM     0      1632    0.00    0.01    0.00    0.01     3  YDLive
08:20:29 PM     0      2072    0.00    0.00    0.00    0.00     1  sshd
08:20:29 PM     0      2978    0.00    0.00    0.00    0.00     2  python
08:20:29 PM     0      2993    0.09    0.24    0.00    0.34     2  python
... ... ...
  • UID:用户ID
  • PID:进程ID
  • %usr : 进程对用户模式CPU使用时间的百分比
  • %system : 进程对系统模式CPU使用时间的百分比
  • %guest:进程在虚拟机(运行虚拟机处理器)中占用时间的CPU百分比
  • %CPU :指定进程使用CPU时间的百分比
  • CPU : 执行指定进程的CPU编号
  • Command : 当前进程运行的命令

pidstat的其他使用方法 :

[root@1a01vlb9935zzzz ~]# 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 } ]
  • -d: 显示I/O的统计信息
  • -h: 显示所有的活动的任务
  • -l:  显示正在执行的命令以及该命令运行所有的参数 
  • -r: 显示每个进程的内存使用情况,主要是分页错误的内存使用率
  • -p <pid> : 显示指定进程id的资源使用情况
  • -d -p <pid> : 显示指定进程的I/O的使用情况
  • -u :与直接执行pidstat命令获取信息一致
  • -w:展示每个进程的cpu上下文切换次数
  • -t : 显示进程以及进程对应线程的资源使用情况
  • -s:显示每个进程的堆栈使用情况
[root@1a01vlb9935zzzz ~]# pidstat -d
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

09:13:44 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
09:13:44 PM     0         1      0.14      0.42      0.05  systemd
09:13:44 PM     0       531      0.00      0.00      0.00  systemd-journal
09:13:44 PM     0       560      0.00      0.00      0.00  lvmetad
09:13:44 PM     0       566      0.01      0.00      0.00  systemd-udevd
09:13:44 PM     0       695      0.00      0.01      0.00  auditd
09:13:44 PM     0       719      0.00      0.00      0.00  irqbalance
09:13:44 PM    81       729      0.00      0.00      0.00  dbus-daemon
09:13:44 PM     0       740      0.00      0.00      0.00  systemd-logind
09:13:44 PM   997       742      0.00      0.00      0.00  polkitd
09:13:44 PM     0       747      0.00      0.00      0.00  watchdog
....

# 指定进程的I/O使用情况
[root@1a01vlb9935zzzz ~]# pidstat -d -p 1
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

09:19:20 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
09:19:20 PM     0         1      0.14      0.42      0.05  systemd
  • kB_rd/s :进程每秒从磁盘读取的数据大小,单位为KB
  • kB_wr/s :进程每秒写入磁盘的数据大小,单位为KB
  • kB_ccwr/s :进程写入磁盘被取消的数据大小,单位为KB
[root@1a01vlb9935zzzz ~]# pidstat -r
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

09:21:24 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
09:21:24 PM     0         1      0.12      0.00  191000   3984   0.05  systemd
09:21:24 PM     0       531      0.05      0.00   55460  19820   0.25  systemd-journal
09:21:24 PM     0       560      0.00      0.00  337792   1480   0.02  lvmetad
09:21:24 PM     0       566      0.00      0.00   44848   2396   0.03  systemd-udevd
09:21:24 PM     0       695      0.00      0.00   55508    896   0.01  auditd
09:21:24 PM     0       719      0.20      0.00   21656   1232   0.02  irqbalance
09:21:24 PM    81       729      0.00      0.00   58064   2376   0.03  dbus-daemon
09:21:24 PM     0       740      0.02      0.00   26376   1768   0.02  systemd-logind
09:21:24 PM   997       742      0.00      0.00  538568  10220   0.13  polkitd
....

09:21:24 PM     0     77012      0.00      0.00  108352   1044   0.01  pidstat
[root@1a01vlb9935zzzz ~]# pidstat -r -p 1
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/22/2020      _x86_64_        (4 CPU)

09:21:33 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
09:21:33 PM     0         1      0.12      0.00  191000   3984   0.05  systemd
  • minflt/s:进程读取内存数据是,每秒出现的次要错误的数量。这些错误指的是不需要从磁盘载入内存的数据,一般是虚拟内存地址映射成物理内存地址所产生的page fault(页面数据错误)次数。
  • majflt/s:进程读取内存数据时,每秒出现的主要错误的数量,这些错误指的是需要从磁盘(或虚拟内存)载入到内存的数据,当虚拟内存地址映射成物理内存地址时,相应的page数据在swap中,这样的page fault(页面数据错误) 为major page fault(主要页面数据错误),一般在物理内存使用紧张时才会产生。
  • VSZ:进程占用虚拟内存大小,单位为KB
  • RSS:进程占用物理内存大小,单位为KB
  • %MEM:进程占用内存百分比
[root@1a01vlb9935zzzz ~]# pidstat -w
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/23/2020      _x86_64_        (4 CPU)

09:50:38 PM   UID       PID   cswch/s nvcswch/s  Command
09:50:38 PM     0         1      0.06      0.00  systemd
09:50:38 PM     0         2      0.00      0.00  kthreadd
09:50:38 PM     0         3      0.20      0.00  ksoftirqd/0
09:50:38 PM     0         5      0.00      0.00  kworker/0:0H
09:50:38 PM     0         7      2.83      0.00  migration/0
09:50:38 PM     0         8      0.00      0.00  rcu_bh
09:50:38 PM     0         9     67.92      0.00  rcu_sched
09:50:38 PM     0        10      0.00      0.00  lru-add-drain
09:50:38 PM     0        11      0.25      0.00  watchdog/0
... ...
[root@1a01vlb9935zzzz ~]# pidstat -w -p 9
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/23/2020      _x86_64_        (4 CPU)

09:50:53 PM   UID       PID   cswch/s nvcswch/s  Command
09:50:53 PM     0         9     67.92      0.00  rcu_sched
  • cswch/s : 每秒主动进行CPU上下文切换的数量,一般由于需要的资源不可用而发生阻塞时,会自愿主动进行上下文切换
  • nvcswch/s : 每秒被动进行CPU上下切换的数量,比如当进程在其CPU时间片内执行,然后由于CPU时间片调度被迫放弃CPU处理器时,会发生被动非自愿的上下文切换。
[root@1a01vlb9935zzzz ~]# pidstat -l
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/23/2020      _x86_64_        (4 CPU)

09:52:25 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
09:52:25 PM     0         1    0.00    0.00    0.00    0.00     1  /usr/lib/systemd/systemd --switched-root --system --deserialize 22
09:52:25 PM     0         2    0.00    0.00    0.00    0.00     3  kthreadd
09:52:25 PM     0         3    0.00    0.00    0.00    0.00     0  ksoftirqd/0
09:52:25 PM     0         7    0.00    0.00    0.00    0.00     0  migration/0

 

# 查看进程以及进程对应线程的资源使用情况

[appdeploy@x5-server-web-uat-6886ddc6d9-f2qkp deploy]$ pidstat -t
Linux 4.14.15-1.el7.elrepo.x86_64 (x5-server-web-uat-6886ddc6d9-f2qkp)  12/23/2020      _x86_64_        (48 CPU)

09:54:42 PM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
09:54:42 PM         1         -    0.00    0.00    0.00    0.00    17  sh
09:54:42 PM         -         1    0.00    0.00    0.00    0.00    17  |__sh
09:54:42 PM        17         -    0.97    0.38    0.00    1.35    24  java
09:54:42 PM         -        19    0.06    0.00    0.00    0.06    21  |__java
09:54:42 PM         -        20    0.01    0.00    0.00    0.01    31  |__java
09:54:42 PM         -        21    0.01    0.00    0.00    0.01    27  |__java
09:54:42 PM         -        22    0.01    0.00    0.00    0.01     3  |__java
09:54:42 PM         -        23    0.01    0.00    0.00    0.01    35  |__java
09:54:42 PM         -        24    0.01    0.00    0.00    0.01    11  |__java
09:54:42 PM         -        25    0.01    0.00    0.00    0.01    33  |__java
09:54:42 PM         -        26    0.01    0.00    0.00    0.01     8  |__java
09:54:42 PM         -        27    0.01    0.00    0.00    0.01    28  |__java
09:54:42 PM         -        28    0.01    0.00    0.00    0.01     9  |__java
09:54:42 PM         -        29    0.01    0.00    0.00    0.01     6  |__java
09:54:42 PM         -        30    0.01    0.00    0.00    0.01    31  |__java
......
# 查看指定pid的进程和线程的资源使用情况
[appdeploy@x5-server-web-uat-6886ddc6d9-f2qkp deploy]$ pidstat -t -p 17
Linux 4.14.15-1.el7.elrepo.x86_64 (x5-server-web-uat-6886ddc6d9-f2qkp)  12/23/2020      _x86_64_        (48 CPU)

10:00:15 PM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
10:00:15 PM        17         -    0.99    0.39    0.00    1.39    24  java
10:00:15 PM         -        17    0.00    0.00    0.00    0.00    24  |__java
10:00:15 PM         -        19    0.06    0.00    0.00    0.06    21  |__java
10:00:15 PM         -        20    0.01    0.00    0.00    0.01    30  |__java
10:00:15 PM         -        21    0.01    0.00    0.00    0.01    23  |__java
10:00:15 PM         -        22    0.01    0.00    0.00    0.01     3  |__java
10:00:15 PM         -        23    0.01    0.00    0.00    0.01     5  |__java
10:00:15 PM         -        24    0.01    0.00    0.00    0.01    33  |__java
10:00:15 PM         -        25    0.01    0.00    0.00    0.01    30  |__java

# 查看指定pid的进程和以及进程对应的线程的内存使用情况
[appdeploy@x5-server-web-uat-6886ddc6d9-f2qkp deploy]$ pidstat -r -t -p 17
Linux 4.14.15-1.el7.elrepo.x86_64 (x5-server-web-uat-6886ddc6d9-f2qkp)  12/23/2020      _x86_64_        (48 CPU)

10:04:09 PM      TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
10:04:09 PM        17         -     37.09      0.00 31764336 3800280   0.72  java
10:04:09 PM         -        17      0.00      0.00 31764336 3800280   0.72  |__java
10:04:09 PM         -        19      0.99      0.00 31764336 3800280   0.72  |__java
10:04:09 PM         -        20      0.14      0.00 31764336 3800280   0.72  |__java
10:04:09 PM         -        21      0.13      0.00 31764336 3800280   0.72  |__java
10:04:09 PM         -        22      0.10      0.00 31764336 3800280   0.72  |__java
10:04:09 PM         -        23      0.17      0.00 31764336 3800280   0.72  |__java
10:04:09 PM         -        24      0.16      0.00 31764336 3800280   0.72  |__java
10:04:09 PM         -        25      0.19      0.00 31764336 3800280   0.72  |__java
10:04:09 PM         -        26      0.17      0.00 31764336 3800280   0.72  |__java
  •  TGID : 对应是PID ,进程ID
  •  TID : 指的是进程ID对应的线程ID
# 查看每个进程的堆栈使用情况
[root@1a01vlb9935zzzz ~]# pidstat -s
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/23/2020      _x86_64_        (4 CPU)

10:06:06 PM   UID       PID StkSize  StkRef  Command
10:06:06 PM     0         1    132      56  systemd
10:06:06 PM     0       531    132      36  systemd-journal
10:06:06 PM     0       560    132      20  lvmetad
10:06:06 PM     0       566    132      44  systemd-udevd
10:06:06 PM     0       695    132      48  auditd
10:06:06 PM     0       719    132      20  irqbalance
10:06:06 PM    81       729    132      16  dbus-daemon
10:06:06 PM     0       740    132      32  systemd-logind
10:06:06 PM   997       742    132      24  polkitd
10:06:06 PM     0       747    132     132  watchdog
...
  • StkSize : 进程保留在内存中的堆栈占用的内存大小,单位为KB,这些堆栈数据并不一定会被进程使用。
  • StkRef :进程实际引用的用作堆栈的内存大小(即实际使用的堆栈空间大小),单位为KB。
[root@1a01vlb9935zzzz ~]# pidstat -U
Linux 3.10.0-957.21.3.el7.x86_64 (1a01vlb9935zzzz)      12/23/2020      _x86_64_        (4 CPU)

10:48:24 PM     USER       PID    %usr %system  %guest    %CPU   CPU  Command
10:48:24 PM     root         1    0.00    0.00    0.00    0.00     0  systemd
10:48:24 PM     root         2    0.00    0.00    0.00    0.00     3  kthreadd
10:48:24 PM     root         3    0.00    0.00    0.00    0.00     0  ksoftirqd/0
10:48:24 PM     root         7    0.00    0.00    0.00    0.00     0  migration/0
10:48:24 PM     root         9    0.00    0.07    0.00    0.07     2  rcu_sched
10:48:24 PM     root        11    0.00    0.00    0.00    0.00     0  watchdog/0
10:48:24 PM     root        12    0.00    0.00    0.00    0.00     1  watchdog/1
10:48:24 PM     root        13    0.00    0.00    0.00    0.00     1  migration/1
10:48:24 PM     root        14    0.00    0.00    0.00    0.00     1  ksoftirqd/1
....

 

추천

출처blog.csdn.net/LoveG_G/article/details/111542802