CPU 시스템의 수를보기 :
(1)grep 'model name' /proc/cpuinfo|wc -l
(2)grep 'core id' /proc/cpuinfo|wc -l
성능 도구 설치 :
(1)centos:yum install -y stress sysstat
(2)ubuntu:apt install stress sysstat
현실
시나리오 1 : CPU를 많이 사용하는 프로세스
(1) 압력 측정 CPU :stress --cpu 1 --timeout 600
(2) 평균 시스템 부하 변경을 참조하십시오 watch -d uptime
(-d 강조 표시된 영역의 변화를 나타냅니다)
변경 (3)은 CPU 사용률 시스템 참조 : mpstat -P ALL 5
동적 출력 (ALL -p를 모든 CPU를 모니터링 나타내고, 후자의 부호 5는 데이터 세트를 출력하는 5 초 간격을 나타낸다)
(4) 검사 시스템은 CPU 케이스를 처리 pidstat -u 5 2
(-u 5 초마다 출력을, 데이터의 세트, 두 개의 출력의 합계를 나타내는 평균값을 출력)
시나리오 2 : I / O 집약적 인 과정
-
압력 테스트 IO :
stress --io 1 --timeout 600
- 프로세스 장면 등
시나리오 3 : 프로세스 장면의 많은 수의
-
아날로그 8 개 공정 :
stress --cpu 8 --timeout 600
- 프로세스 장면 등
시나리오 사 : 시스템 컨텍스트 스위칭의 경우를 확인
- 문맥 전환 참조 :
vmstat 5
(5 초마다 출력을 데이터의 집합)
(1) cs(context switch)
이며 초당 문맥 전환
(2) in(interrupt)
초마다 인터럽트 수
(3) r(running or runnable)
수는 CPU를 실행하고, 처리를 기다리고 준비 큐의 길이를 나타낸다
(4) b(blocked)
공정에서 정전 잠의 수를 나타낸다
- 핸드 오버 콘텍스트의 세부 사항
pidstat -w 5
(1 데이터를 5 초마다 출력 세트 동적)
(1) cswch
초당 횟수 자발적 컨텍스트 스위치 (자발적 컨텍스트 스위치)를 나타낸다
(2) nvcswch
비 자발적 컨텍스트의 수로 표현은 (비 자발적 컨텍스트 스위치)의 초당 스위치
- 개념 컨텍스트 스위칭 :
(1) 자율 콘텍스트 스위치 : 문맥 전환의 결과로, 필요한 자원을 확보 할 수있는 프로세스를 의미한다. 예를 들어, 시간의 부족 I / O, 메모리 및 기타 시스템 리소스;
(2) 비 자발적 콘텍스트 스위치 : 기타 이유로, 시스템이 이렇게 문맥 전환의 발생을 예약 강제되고 의한 처리 시간 슬라이스를 말한다. 예를 들어, 프로세스의 많은 수의 CPU에 대한 경쟁에있을 때;
- 시뮬레이션 멀티 스레드 스케줄링 :
(1)centos:yum install -y sysbench
(2)ubuntu:apt install sysbench
- 테스트 :
(1)以10个线程运行5分钟的基准测试,模拟系统多线程切换的问题:sysbench --threads=10 --max-time=300 threads run
(2)观察上下文切换情况:vmstat 1
(3)查看cpu和上下文切换的进程和线程情况:pidstat -w -u 1
系统的就绪队列过长,也就是正在运行和等待cpu的进程数过多,导致大量的上下文切换,而上下文切换又导致了系统cpu的占用率升高。
(4)上图中pidstat 默认显示进程的指标数据,加上-t
参数后,才会输出线程的指标。
(5)查找源头,注意中断次数,是什么类型的中断上升呢:watch -d cat /proc/interrupts
会发现是RES(重调度中断),这个中断类型表示,唤醒空闲状态的CPU来调度新的任务运行。
情景五:查看CPU使用率
- 使用工具top和ps:
(1)top:显示系统总体的CPU和内存使用情况,以及各个进程的资源使用情况,默认每隔3秒刷新一次
空白行之后是进程的实时信息,每个进程都有一个%CPU列,表示进程的CPU使用率。
它是用户态和内核态CPU使用率总和,包括进程用户空间使用的CPU、通过系统调用执行的内核空间CPU、以及在就绪队列等待运行的CPU。在虚拟化环境中,它还包括了运行虚拟机占用的CPU。
Top并没有细分进程的用户态CPU和内核态CPU,那么怎么查看每个进程的详细情况呢:pidstat 1 5
(每隔1秒输出一组数据,共输出5组 )
(2)ps:只显示每个进程的资源使用情况
- CPU过高排查工具:想知道占用CPU的到底是代码里的哪个函数,找到它,才能更高效、更针对性地进行优化。
(1)GDB(the GNU Project Debugger)
功能强大的程序调试利器,但不适合在性能分析的早期应用,因为GDB调试程序过程会中断程序运行,这在线上环境往往是不允许的。
(2)perf(Linux2.6.31以后内置的性能分析工具)
,它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。如系统没有,请安装:yum install -y perf
- perf两种常见用法:
(1)perf top类似于top,它能够实时显示占用CPU时钟最多的函数或指令,因此可以用来查找热点函数,如下:
第一行包含三个数据,分别是:采样数(Samples)、事件类型(event)和事件总数量(Event count)
另外注意:如果采样数过少(比如直有十几个),那下面的排序和百分比就没有什么实际参考价值了。
再往下看是一个表格式样的数据,每一行包含四列,分别是:
第一列Overhead
,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列Shared
,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
第三列Object
,是动态共享对象的类型。比如[.]表示用户空间的可执行程序、或者动态链接库,而[k]则表示内核空间。
第四列Symbol
是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
(2)perf record和perf report
perf top
虽然实时展示了系统的性能信息,但它缺点是不能保存数据,也就是无法用于离线或者后续的分析。
perf record
则提供了保存数据的功能,保存后的数据,需要用perf report解析展示。
实际工作中,我们还经常为perf top和perf record加上-g
参数,开启调用关系的采样,方便我们根据调用链来分析性能问题。
比如:perf top -g -p 21515
(-g开启调用关系分析,-p指定服务的进程号是21515)
- HTTP服务性能测试工具:
ab(apache bench)
比如:ab -c 10 -n 1000 http://192.168.246.191:80/
(并发10个请求,总共测试1000个请求)
情景六:系统的CPU使用率很高,但是找不到高CPU的应用
pidstat -p 24344
(指定PID是24344的进程)
Pstree
用树状形式显示所有进程之间的关系
grep stress -r app/
(-r
目录递归)
execsnoop
:一个专门为段时进程设计的工具。它通过ftrace实时监控进程的exec()行为,并输出短时进程的基本信息,包括进程的PID、父进程PID、命令行参数以及执行的结果。
- 常规无法解释的CPU使用率情况,有可能是下面这两种情况:
(1)应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过top等工具不容易发现;
(2)应用本身在不停地奔溃重启,而启动过程的资源初始化,很可能会占用相当多的CPU;
对于这类进程,我们可以用pstree或者execsnoop找到它们的父进程,再从父进程所在的应用入手,排查问题的根源。
注意⚠️:当碰到无法解释的CPU使用率问题时,先要检查下是不是短时应用在捣鬼!
情景七:系统中出现大量不可中断进程和僵尸进程怎么办(上)
- 进程常见的五种状态:
(1)R
是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
(2)D
是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
注意⚠️:进程长时间处于不可中断状态,通常表示系统有 I/O 性能问题。
(3)Z
是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思。它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
(4)S
是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
(5)I
是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高,I 状态的进程却不会。
- 进程不常见的两种状态:
(1)T 或者 t
,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。
向一个进程发送 SIGSTOP 信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运行(如果进程是终端里直接启动的,则需要你用 fg 命令,恢复到前台运行)。
而当你用调试器(如 gdb)调试一个进程时,在使用断点中断进程后,进程就会变成跟踪状态,这其实也是一种特殊的暂停状态,只不过你可以用调试器来跟踪并按需要控制进程的运行。
(2)X
,也就是 Dead 的缩写,表示进程已经消亡,所以你不会在top 或者 ps 命令中看到它。
注意⚠️:Ss+
:S表示可中断睡眠状态,s表示这个进程是一个会话的领导进程,而+表示前台进程组。
- 进程组与会话:
它们是管理一组相互关联的进程,意思如下:
(1)进程组表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员;
(2)会话是指共享同一个控制端的一个或多个进程组;
比如,我们通过 SSH 登录服务器,就会打开一个控制终端(TTY),这个控制终端就对应一个会话。而我们在终端中运行的命令以及它们的子进程,就构成了一个个的进程组,,其中,在后台运行的命令,构成后台进程组;在前台运行的命令,构成前台进程组。
- 安装dstat
(1)CentOS:yum install -y dstat
(2)Ubuntu:apt install dstat
여기 도구 dstat, 새로운 성능입니다 그것은 몇 가지 도구 ifstat, iostat의, vmstat를 장점을 흡수 등이 있으며, 현재 시스템의 CPU, 디스크 I / O, 메모리 및 네트워크 사용량을 모니터링 할 수 있습니다.
시나리오 여덟 : 시스템 프로세스 및 수행하는 방법 좀비 프로세스의 큰 숫자를 방해 할 수 없습니다 (다음)
- 도구 :
(1) dstat 1 10
(출력 데이터의 1 개 초 간격으로 10 세트)
(2) pidstat -d -p 4344 1 3
(-d 디스플레이 I / O 통계 -p 처리가 지정되면, 간격 1 2 출력 데이터 군 3)
(3) strace -p 6082
(-p 프로세스 ID를 지정)
가장 일반적으로 사용되는 도구 strace를 추적 처리 시스템은 호출합니다.
(4) perf record -g
(단말 CTRL + C 후 약 15 분간 실행하고)
(5)perf report
- 처리 좀비
좀비 프로세스를 해결하기 위해, 식별하고 부모 프로세스에서 해결하기 위해 부모 프로세스 자사의 줄기를 찾을 필요가있다.
(1) pstree -aps 3084
(-a 명령 줄 옵션의 출력을 나타내고, P는 PID를 나타내고, S는 특정 프로세스의 부모를 나타냄)
작업 종료, 당신은 부모 프로세스가 응용 프로그램 응용 프로그램 프로세스 번호 3084 4009, 것을 발견 할 것이다.
(2) 다음 코드보기 응용 프로그램 프로세스는 서브 프로세스가 올바른지 끝나는 있는지, 예를 들어,도 ()) 또는 waitpid를가 (기다릴 호 없거나이다 SIGCHLD 대한 등록 처리가 없다.