LinuxのCPUが100%を超えるのはなぜですか?

00. CPUとは何ですか?

中央処理装置(CPU、中央処理装置)は、コンピューターのコアおよび制御装置である超大規模集積回路です。その機能は、主にコンピュータの命令を解釈し、コンピュータソフトウェアでデータを処理することです。

実際、簡単に言えば、彼は脳であり、電子的な脳です。素人の言葉で言えば、コンピュータのCPUは人間の脳と同等であり、積極的に命令しているわけではありませんが、命令はコンピュータのメモリに配置された指示に従うことによって達成されます。また、加算、減算、乗算などの算術演算を実行し、決定と選択を行うことができます。

01.関連する概念

CPU物理番号:マザーボードに実際に挿入されているCPU数、カウントできるいくつかの物理IDがあります(物理ID)

[root@ufo ~]# grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
1

CPUあたりのコア数:デュアルコア、クアッドコアなど、単一のCPUでデータを処理できるチップセットの数(cpuコア)

[root@ufo ~]# grep 'cpu cores' /proc/cpuinfo|uniq|awk -F ':' '{print $2}'
4

論理CPUの:通常の状況では、論理CPUの数=物理CPUの数×各コアの数です。等しくない場合は、サーバーのCPUがハイパースレッドテクノロジ(簡単に言うとHT、それは一つのコアは2つのコアのようなオペレーティングシステムの役割を果たしているプロセッサを作ることができます。このように、オペレーティングシステムが利用可能な実行リソースが大幅にシステムの全体的なパフォーマンスが向上し、倍増している。このとき、数を論理CPU =物理CPUの数×各コアの数x2

[root@ufo ~]# cat /proc/cpuinfo| grep "processor"|wc -l
8

コアの総数= CPUの物理数xCPUあたりのコア数

論理CPUの総数=物理CPUの数x物理CPUあたりのコア数xハイパースレッドの数

関連スクリプト:

#!/bin/bash
physicalNumber=0
coreNumber=0
logicalNumber=0
HTNumber=0
logicalNumber=$(grep "processor" /proc/cpuinfo|sort -u|wc -l)
physicalNumber=$(grep "physical id" /proc/cpuinfo|sort -u|wc -l)
coreNumber=$(grep "cpu cores" /proc/cpuinfo|uniq|awk -F':' '{print $2}'|xargs)
HTNumber=$((logicalNumber / (physicalNumber * coreNumber)))
echo "****** CPU Information ******"
echo "Logical CPU Number  : ${logicalNumber}"
echo "Physical CPU Number : ${physicalNumber}"
echo "CPU Core Number     : ${coreNumber}"
echo "HT Number           : ${HTNumber}"
echo "*****************************"

****** CPU Information ******
Logical CPU Number  : 8
Physical CPU Number : 1
CPU Core Number     : 4
HT Number           : 2
*****************************

02. CPUが100%を超えるのはなぜですか?

topコマンドを使用して、プロセスのCPU使用率を表示します。特定のプロセスのCPU使用率が100%を超えることがある場合があります。例えば:

top - 10:12:55 up 3 days, 13:09,  1 user,  load average: 1.19, 0.87, 1.43
Tasks: 235 total,   1 running, 181 sleeping,   0 stopped,   1 zombie
%Cpu(s): 56.4 us,  2.6 sy,  0.0 ni, 40.5 id,  0.1 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem :  7868576 total,  1022508 free,  2635576 used,  4210492 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4484128 avail Mem 

  PID 	USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                    
15736 	root      20   0   31840   1564   1412 S 199.0  0.0   0:46.34 samples_test

ここでの%CPUが100%を超えるのはなぜですか?CPUが実行され続けても、最大で100%です。現時点では、このフィールドの具体的な意味を理解する必要があります。

$ man top
......
        1. %CPU  --  CPU Usage
           The task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.

           In a true SMP environment, if a process is multi-threaded and top is not operating in Threads mode, amounts greater than 100% may be reported.  You toggle Threads mode with the `H' inter‐
           active command.

           Also for multi-processor environments, if Irix mode is Off, top will operate in Solaris mode where a task's cpu usage will be divided by the total number of CPUs.  You toggle Irix/Solaris
           modes with the `I' interactive command.
......

ここにいくつかの概念があります

対称型マルチプロセッサ構造であるSMP(Symmetric Multi-Processing)は、それぞれが同じ構造を持ち、メモリとリソースを共有する複数のCPUで実行される1つのオペレーティングシステムインスタンスのみを特徴としています。

プロセスは実行中のプログラムです。つまり、プログラムがメモリにロードされて実行できるようになると、プロセスになります。プロセスは、リソース割り当ての基本概念、スケジューリング操作の基本単位、およびシステムでの同時実行の単位です。

スレッドは、各タスクがスレッドであるために単一のプロセスで実行されます。スレッドは、プロセスで操作を実行するための最小単位です。

プロセスとスレッドの関係スレッドは1つのプロセスにのみ属することができますが、プロセスは複数のスレッドを持つことができます。マルチスレッドとは、プロセス内で複数のタスクを同時に実行できるようにすることです。

説明してください:

topコマンドは、デフォルトでプロセスデータ(プロセスモード)を表示します。top-Hを使用すると、このオプションはすべてのLinuxスレッドを一覧表示します。topがすでに実行されている場合は、「H」キーを押してスレッドモードを切り替えることもでき、各スレッドの%cpuは最大100%です。

%CPUは、最後の更新から現在までのCPU時間のパーセンテージを表します。実際のSMP環境では、プロセスに複数のスレッドがあり、topコマンドのデフォルトモードを使用してクエリを実行すると、結果が100%を超える場合があります。

理論的には、CPUには合計N個のコアがあり、topのデフォルトのプロセスモードは上限N * 100%まで表示できますコアの総数N = CPUの物理数xCPUあたりのコア数(「1」を押して切り替えると、コアの総数ではなく論理CPUの数が表示されます。違いに注意してください。論理CPUの総数=物理CPUの数x物理CPUあたりのコアの数xハイパースレッドの数)

top -H、またはtopの実行後にHを押して、スレッドモードを開始します。sample_testにはCPU使用率の高いスレッドが少なくとも2つ含まれており、使用率は100%に近いですが、100%を超えることはありません。

top - 10:13:40 up 3 days, 13:10,  1 user,  load average: 1.88, 1.10, 1.49
Threads: 1018 total,   4 running, 961 sleeping,   0 stopped,   1 zombie
%Cpu(s): 56.8 us,  1.6 sy,  0.0 ni, 41.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7868576 total,  1009804 free,  2643240 used,  4215532 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4472252 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                     
15737 root      20   0   31840   1564   1412 R 99.3  0.0   1:07.91 samples_test                                                                
15738 root      20   0   31840   1564   1412 R 98.0  0.0   1:07.83 samples_test

top -H -p pid(トッププロセスモードで見つかったpid)を見ると、実際のsamples_testには合計3つのスレッドがあり、そのうち2つのCPU使用率が特に高く、1つが特に低いことがわかります。

$ top -H -p 15736
top - 10:40:41 up 3 days, 13:37,  1 user,  load average: 2.65, 2.75, 2.44
Threads:   3 total,   2 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s): 56.2 us,  2.2 sy,  0.0 ni, 41.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7868576 total,   332464 free,  3167324 used,  4368788 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  3846852 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                     
 15737 root      20   0   31840   1680   1528 R 99.3  0.0  17:27.23 samples_test                                                                
 15738 root      20   0   31840   1680   1528 R 99.0  0.0  17:26.73 samples_test                                                                
 15736 root      20   0   31840   1680   1528 S  0.0  0.0   0:00.00 samples_test

pstreeコマンドを使用して、プロセス内のスレッド間の関係をすばやく表示できます。

$ pstree -p 15736
samples_test(15736)─┬─{
    
    samples_test}(15737)
                    └─{
    
    samples_test}(15738)

スレッド番号15736のスレッドがメインスレッド(プロセスモードで最初に見られる)であり、CPU使用率が低いことがわかります。一方、15737および15738スレッドはサブスレッドです(スレッドモードで見られるように)。 、CPU使用率が高い。

03.CPU使用率が高いいくつかのケースへの参照

[mysqlがCPUの100%以上を占めるソリューションプロセス]
https://blog.csdn.net/jimshen/article/details/78706538

[mysqlが特に高いCPUを占有するソリューション]
https://yunwei365.blog.csdn.net/article/details/78835708?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute。 pc_relevant_t0 .none-task-blog-BlogCommendFromBaidu-1.control

おすすめ

転載: blog.csdn.net/qq_42226855/article/details/112785382