解决CPU负载过高问题

/ 操作系统 / 70浏览

背景

在flink standalone集群中,向集群提交5个flink任务,会遇到cpu负载过高问题。

带着前一篇介绍的CPU上下文切换,来追踪一下当前遇到的场景。一方面是对cpu上下文切换的一个理论实战,另一方面也是解决当前遇到的问题。

CPU上下文切换实战

前面介绍了那么多理论,那么在出现cpu负载过高的时候,如何来定位呢?

查看系统中进程的上下文切换

vmstat是一个常用的系统性能分析工具,主要用来分析系统系统内存的使用情况,也常用来分析CPU上下文切换和中断的次数。

在不提交flink任务时,我们先查看系统上下文切换情况。

# 每隔5秒打印一次
vmstat 5
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  11152 6118068 548932 6175248    0    0    37    58    2    1  6  2 91  0  0
 0  0  11152 6118036 548932 6175484    0    0     0    33  923 1706  1  0 99  0  0
 1  0  11152 6117820 548932 6175648    0    0     0    59  922 1728  1  0 99  0  0

我们目前关注的只是CPU部分,其他字段可以私下了解。

字段 含义
cs:context switch 每秒上下文切换的次数
in:interrupt 每秒中断的次数
us:user time 用户进程执行时间
sy:system time 系统进程执行时间
r:running or runnable 就绪队列的长度。也就是正在运行和等待cpu的进程数
b:blocked 处于不可中断睡眠状态的进程数

结论

从控制台打印结果中可以看到,在没有Flink任务提交时,cs值大约在1700左右。即每秒切换1700多次。

现在将flink任务提交,再来查看系统中,cpu的上下文切换情况。

vmstat 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0  11152 4166952 551124 6712052    0    0    37    58    0    2  6  2 91  0  0
 0  0  11152 4169904 551136 6712208    0    0     0    61 4283 14612 15  3 82  0  0
 0  0  11152 4163520 551144 6712384    0    0     0    46 4269 14721 14  3 83  0  0
 3  0  11152 4162072 551152 6712568    0    0     0    10 4342 14645 14  3 83  0  0
 0  0  11152 4157612 551160 6712760    0    0     0    14 4387 14623 15  3 82  0  0
 0  0  11152 4157124 551168 6712924    0    0     0    14 4095 14557 13  3 84  0  0

结论

从打印结果中看到,cs值由原来的1700提高到了14000,差不多提高了10倍左右。

此时通过top命令查看cpu平均负载:

1598521003249

可以看出,cpu load average 达到了4左右。我当前的虚拟机是4核cpu。说明已经完全占用了cpu所有的核。

为了进一步追查flink内部究竟是什么在占用cpu,下面介绍一个新的工具。

查看进程内线程的上下文切换

vmstat 只给出了系统总体的上下文切换情况,要想查看每个进程的详细情况,需要使用pidstat。

检查进程间上下文切换

pidstat -w 5
03:13:02 PM       PID   cswch/s nvcswch/s  Command
03:13:07 PM         3      0.40      0.00  migration/0
03:13:07 PM         4      0.60      0.00  ksoftirqd/0
03:13:07 PM         9      0.40      0.00  ksoftirqd/1
03:13:07 PM        11      0.60      0.00  migration/2
03:13:07 PM        17      0.20      0.00  ksoftirqd/3
03:13:07 PM        19      1.00      0.00  events/0
03:13:07 PM        20      1.20      0.00  events/1
03:13:07 PM        21      1.00      0.00  events/2
03:13:07 PM        22      2.99      0.00  events/3
字段 说明
cswch 表示时间段内,每秒自愿上下文切换的速率。
自愿上下文切换是指进程无法获取资源导致的上下文切换。比如说I/O、内存等系统资源不足时,就会发生自愿上下文切换。
nvcswch 表示非自愿上下文切换,是指进程由于事件片已到等原因,被系统强制调度,进而发生的上下文切换,比如大量进程在争抢cpu的时候,就容易发生非自愿上下文切换

细心的你会发现,cswch/s 的总和也没打到14000。是不是检测工具的bug呢?

其实不是,pidstat - w 用来检测的是进程间的上下文切换。而vmstat检查的是所有的上下文切换。

我们当前的任务是追踪flink内部线程的上下文切换情况,而不是进程间的上下文切换情况。所以,在pidstat中加入-t参数,即可监控某个进程中线程的情况。

检查进程中线程上下文切换

# flink TaskManager 进程PID为22149,检测每秒线程的切换情况
pidstat -w -t -p 22149 1
04:59:48 PM      TGID       TID   cswch/s nvcswch/s  Command
04:59:49 PM     22149         -      0.00      0.00  java
04:59:49 PM         -     22149      0.00      0.00  |__java
04:59:49 PM         -     22153      0.00      0.00  |__java
04:59:49 PM         -     22154      0.00      0.00  |__java
04:59:49 PM         -     22155      0.00      0.00  |__java
04:59:49 PM         -     22156      0.00      0.00  |__java
04:59:49 PM         -     22157      0.00      0.00  |__java
04:59:49 PM         -     22158      6.00      0.00  |__java
04:59:49 PM         -     22159      0.00      0.00  |__java
04:59:49 PM         -     22160      0.00      0.00  |__java
04:59:49 PM         -     22161      0.00      0.00  |__java
04:59:49 PM         -     22162      0.00      0.00  |__java
04:59:49 PM         -     22163      0.00      0.00  |__java
04:59:49 PM         -     22164      0.00      0.00  |__java
04:59:49 PM         -     22165      0.00      0.00  |__java
04:59:49 PM         -     22177      0.00      0.00  |__java
04:59:49 PM         -     22178      0.00      0.00  |__java
04:59:49 PM         -     22179      0.00      0.00  |__java
04:59:49 PM         -     22180     20.00      0.00  |__java
04:59:49 PM         -     22195    100.00      2.00  |__java
04:59:49 PM         -     22201      2.00      0.00  |__java
04:59:49 PM         -     22202      0.00      0.00  |__java
04:59:49 PM         -     22203      1.00      0.00  |__java
04:59:49 PM         -     22205     12.00      0.00  |__java
04:59:49 PM         -     22206     13.00      0.00  |__java
04:59:49 PM         -     22207      4.00      0.00  |__java
04:59:49 PM         -     22208      2.00      0.00  |__java
04:59:49 PM         -     22209      2.00      0.00  |__java
04:59:49 PM         -     22210      2.00      0.00  |__java
04:59:49 PM         -     22211      2.00      0.00  |__java
04:59:49 PM         -     22212      0.00      0.00  |__java
04:59:49 PM         -     22214    100.00      0.00  |__java
04:59:49 PM         -     22216      9.00      0.00  |__java
04:59:49 PM         -     22217      9.00      0.00  |__java
04:59:49 PM         -     22218      2.00      0.00  |__java
04:59:49 PM         -     22219      2.00      0.00  |__java
04:59:49 PM         -     22220      2.00      0.00  |__java
04:59:49 PM         -     22221      2.00      0.00  |__java
04:59:49 PM         -     22222      2.00      0.00  |__java
04:59:49 PM         -     22223      0.00      0.00  |__java
04:59:49 PM         -     22224      0.00      0.00  |__java
04:59:49 PM         -     22225      0.00      0.00  |__java
04:59:49 PM         -     22226      0.00      0.00  |__java
04:59:49 PM         -     22227      0.00      0.00  |__java
04:59:49 PM         -     22229      1.00      0.00  |__java
04:59:49 PM         -     22230     10.00      0.00  |__java
04:59:49 PM         -      2325      0.00      0.00  |__java
04:59:49 PM         -     17607      0.00      0.00  |__java
04:59:49 PM         -     17608      0.00      0.00  |__java
04:59:49 PM         -     17611      0.00      0.00  |__java
04:59:49 PM         -     17612      5.00      0.00  |__java
04:59:49 PM         -     17613      0.00      0.00  |__java
04:59:49 PM         -     17615      0.00      0.00  |__java
04:59:49 PM         -     17616      5.00      0.00  |__java
04:59:49 PM         -     17617      5.00      0.00  |__java
04:59:49 PM         -     17618      5.00      0.00  |__java
04:59:49 PM         -     17619      5.00      0.00  |__java
04:59:49 PM         -     17620      5.00      0.00  |__java
04:59:49 PM         -     17621      5.00      0.00  |__java
04:59:49 PM         -     17623      5.00      0.00  |__java
04:59:49 PM         -     17624      5.00      0.00  |__java
04:59:49 PM         -     17625      0.00      0.00  |__java
04:59:49 PM         -     17626    195.00      0.00  |__java
04:59:49 PM         -     17627    195.00      0.00  |__java
04:59:49 PM         -     17628    195.00      0.00  |__java
04:59:49 PM         -     17629    195.00      0.00  |__java
04:59:49 PM         -     17630    195.00      0.00  |__java
04:59:49 PM         -     17631    195.00      0.00  |__java
04:59:49 PM         -     17632    195.00      0.00  |__java
04:59:49 PM         -     17633    195.00      0.00  |__java
04:59:49 PM         -     17634    195.00      0.00  |__java
04:59:49 PM         -     17635    195.00      0.00  |__java
04:59:49 PM         -     17636    195.00      0.00  |__java
04:59:49 PM         -     17637    195.00      0.00  |__java
04:59:49 PM         -     17638    195.00      0.00  |__java
04:59:49 PM         -     17639    195.00      0.00  |__java
04:59:49 PM         -     17640    195.00      0.00  |__java
04:59:49 PM         -     17642     10.00      0.00  |__java
04:59:49 PM         -     17643     10.00      0.00  |__java
04:59:49 PM         -     17644      1.00      0.00  |__java
04:59:49 PM         -     17645      0.00      0.00  |__java
04:59:49 PM         -     17646      0.00      0.00  |__java
04:59:49 PM         -     17647      0.00      0.00  |__java
04:59:49 PM         -     17649      1.00      0.00  |__java
04:59:49 PM         -     17650      0.00      0.00  |__java
04:59:49 PM         -     17651      1.00      0.00  |__java
04:59:49 PM         -     17652      1.00      0.00  |__java
04:59:49 PM         -     17653      0.00      0.00  |__java
04:59:49 PM         -     17654      0.00      0.00  |__java
04:59:49 PM         -     17656      0.00      0.00  |__java
04:59:49 PM         -     17658      0.00      0.00  |__java
04:59:49 PM         -     17659      0.00      0.00  |__java
04:59:49 PM         -     17660      0.00      0.00  |__java
04:59:49 PM         -     17661      0.00      0.00  |__java
04:59:49 PM         -     17662      0.00      0.00  |__java
04:59:49 PM         -     17663      0.00      0.00  |__java
04:59:49 PM         -     17664      0.00      0.00  |__java
04:59:49 PM         -     17665      0.00      0.00  |__java
04:59:49 PM         -     18028      0.00      0.00  |__java
04:59:49 PM         -     18033      0.00      0.00  |__java
04:59:49 PM         -     19865     27.00     14.00  |__java
04:59:49 PM         -     20468      5.00      0.00  |__java
04:59:49 PM         -     20469      5.00      0.00  |__java
04:59:49 PM         -     20470      5.00      0.00  |__java
04:59:49 PM         -     20472      5.00      0.00  |__java
04:59:49 PM         -     20473      5.00      0.00  |__java
04:59:49 PM         -     20474      5.00      0.00  |__java
04:59:49 PM         -     20475      5.00      0.00  |__java
04:59:49 PM         -     20476      5.00      0.00  |__java
04:59:49 PM         -     20477      5.00      0.00  |__java
04:59:49 PM         -     20478      0.00      0.00  |__java
04:59:49 PM         -     20479      0.00      0.00  |__java
04:59:49 PM         -     20480      0.00      0.00  |__java
04:59:49 PM         -     20481      0.00      0.00  |__java
04:59:49 PM         -     20482    195.00      0.00  |__java
04:59:49 PM         -     20483      0.00      0.00  |__java
04:59:49 PM         -     20484    195.00      0.00  |__java
04:59:49 PM         -     20485    195.00      0.00  |__java
04:59:49 PM         -     20486    195.00      0.00  |__java
04:59:49 PM         -     20487    195.00      0.00  |__java
04:59:49 PM         -     20488    195.00      0.00  |__java
04:59:49 PM         -     20489    195.00      0.00  |__java
04:59:49 PM         -     20490    195.00      0.00  |__java
04:59:49 PM         -     20491      0.00      0.00  |__java
04:59:49 PM         -     20492    195.00      0.00  |__java
04:59:49 PM         -     20493      0.00      0.00  |__java
04:59:49 PM         -     20494    195.00      1.00  |__java
04:59:49 PM         -     20495    195.00      0.00  |__java
04:59:49 PM         -     20496    195.00      0.00  |__java
04:59:49 PM         -     20497      0.00      0.00  |__java
04:59:49 PM         -     20498    195.00      0.00  |__java
04:59:49 PM         -     20499    195.00      0.00  |__java
04:59:49 PM         -     20500     10.00      0.00  |__java
04:59:49 PM         -     20501     10.00      0.00  |__java
04:59:49 PM         -     20502      0.00      0.00  |__java
04:59:49 PM         -     20503      1.00      0.00  |__java
04:59:49 PM         -     20504      0.00      0.00  |__java
04:59:49 PM         -     20505      0.00      0.00  |__java
04:59:49 PM         -     20507      0.00      0.00  |__java
04:59:49 PM         -     20508      0.00      0.00  |__java
04:59:49 PM         -     20509      0.00      0.00  |__java
04:59:49 PM         -     20510      0.00      0.00  |__java
04:59:49 PM         -     20511      0.00      0.00  |__java
04:59:49 PM         -     20512      0.00      0.00  |__java
04:59:49 PM         -     20514      0.00      0.00  |__java
04:59:49 PM         -     20515      0.00      0.00  |__java
04:59:49 PM         -     20516      0.00      0.00  |__java
04:59:49 PM         -     20517      0.00      0.00  |__java
04:59:49 PM         -     20518      0.00      0.00  |__java
04:59:49 PM         -     20519      0.00      0.00  |__java
04:59:49 PM         -     20520      0.00      0.00  |__java
04:59:49 PM         -     20521      0.00      0.00  |__java
04:59:49 PM         -     20523      0.00      0.00  |__java
04:59:49 PM         -     20603      0.00      0.00  |__java
04:59:49 PM         -     20604      0.00      0.00  |__java
04:59:49 PM         -     20605      5.00      0.00  |__java
04:59:49 PM         -     20606      5.00      0.00  |__java
04:59:49 PM         -     20607      5.00      0.00  |__java
04:59:49 PM         -     20608      5.00      0.00  |__java
04:59:49 PM         -     20609      5.00      0.00  |__java
04:59:49 PM         -     20610      5.00      0.00  |__java
04:59:49 PM         -     20612      5.00      0.00  |__java
04:59:49 PM         -     20613      5.00      0.00  |__java
04:59:49 PM         -     20614      5.00      0.00  |__java
04:59:49 PM         -     20615      5.00      0.00  |__java
04:59:49 PM         -     20618      0.00      0.00  |__java
04:59:49 PM         -     20619      0.00      0.00  |__java
04:59:49 PM         -     20620      0.00      0.00  |__java
04:59:49 PM         -     20621      0.00      0.00  |__java
04:59:49 PM         -     20622      0.00      0.00  |__java
04:59:49 PM         -     20623    195.00      0.00  |__java
04:59:49 PM         -     20624    194.00      0.00  |__java
04:59:49 PM         -     20625    195.00      0.00  |__java
04:59:49 PM         -     20626    195.00      0.00  |__java
04:59:49 PM         -     20627      0.00      0.00  |__java
04:59:49 PM         -     20628      0.00      0.00  |__java
04:59:49 PM         -     20629    195.00      0.00  |__java
04:59:49 PM         -     20630      0.00      0.00  |__java
04:59:49 PM         -     20631    195.00      0.00  |__java
04:59:49 PM         -     20632    195.00      0.00  |__java
04:59:49 PM         -     20633      0.00      0.00  |__java
04:59:49 PM         -     20634    195.00      0.00  |__java
04:59:49 PM         -     20635    195.00      0.00  |__java
04:59:49 PM         -     20636    195.00      0.00  |__java
04:59:49 PM         -     20637    195.00      0.00  |__java
04:59:49 PM         -     20638    195.00      0.00  |__java
04:59:49 PM         -     20639    195.00      0.00  |__java
04:59:49 PM         -     20640    194.00      0.00  |__java
04:59:49 PM         -     20641      0.00      0.00  |__java
04:59:49 PM         -     20642    194.00      0.00  |__java
04:59:49 PM         -     20643    195.00      0.00  |__java
04:59:49 PM         -     20644     10.00      0.00  |__java
04:59:49 PM         -     20645     10.00      0.00  |__java
04:59:49 PM         -     20646      0.00      0.00  |__java
04:59:49 PM         -     20647      0.00      0.00  |__java
04:59:49 PM         -     20648      0.00      0.00  |__java
04:59:49 PM         -     20649      0.00      0.00  |__java
04:59:49 PM         -     20650      1.00      0.00  |__java
04:59:49 PM         -     20655      0.00      0.00  |__java
04:59:49 PM         -     20656      0.00      0.00  |__java
04:59:49 PM         -     20657      0.00      0.00  |__java
04:59:49 PM         -     20658      0.00      0.00  |__java
04:59:49 PM         -     20659      0.00      0.00  |__java
04:59:49 PM         -     20660      0.00      0.00  |__java
04:59:49 PM         -     20662      0.00      0.00  |__java
04:59:49 PM         -     20671      0.00      0.00  |__java
04:59:49 PM         -     20674      0.00      0.00  |__java
04:59:49 PM         -     20678      0.00      0.00  |__java
04:59:49 PM         -     20681      0.00      0.00  |__java
04:59:49 PM         -     20683      0.00      0.00  |__java
04:59:49 PM         -     20684      0.00      0.00  |__java
04:59:49 PM         -     20685      0.00      0.00  |__java
04:59:49 PM         -     21089      4.00      0.00  |__java
04:59:49 PM         -     21090      5.00      0.00  |__java
04:59:49 PM         -     21092      5.00      0.00  |__java
04:59:49 PM         -     21093      5.00      0.00  |__java
04:59:49 PM         -     21094      5.00      0.00  |__java
04:59:49 PM         -     21095      7.00      0.00  |__java
04:59:49 PM         -     21096      5.00      0.00  |__java
04:59:49 PM         -     21097      0.00      0.00  |__java
04:59:49 PM         -     21098    195.00      0.00  |__java
04:59:49 PM         -     21099      0.00      0.00  |__java
04:59:49 PM         -     21100      0.00      0.00  |__java
04:59:49 PM         -     21101      0.00      0.00  |__java
04:59:49 PM         -     21102    195.00      0.00  |__java
04:59:49 PM         -     21103      0.00      0.00  |__java
04:59:49 PM         -     21104      0.00      0.00  |__java
04:59:49 PM         -     21105      0.00      0.00  |__java
04:59:49 PM         -     21106    195.00      0.00  |__java
04:59:49 PM         -     21107      0.00      0.00  |__java
04:59:49 PM         -     21108    195.00      0.00  |__java
04:59:49 PM         -     21109    194.00      0.00  |__java
04:59:49 PM         -     21111    194.00      0.00  |__java
04:59:49 PM         -     21112    195.00      0.00  |__java
04:59:49 PM         -     21113    195.00      0.00  |__java
04:59:49 PM         -     21114    194.00      4.00  |__java
04:59:49 PM         -     21115    194.00      0.00  |__java
04:59:49 PM         -     21116     10.00      0.00  |__java
04:59:49 PM         -     21117      8.00      0.00  |__java
04:59:49 PM         -     21118      0.00      0.00  |__java
04:59:49 PM         -     21119      0.00      0.00  |__java
04:59:49 PM         -     21120      0.00      0.00  |__java
04:59:49 PM         -     21121      0.00      0.00  |__java
04:59:49 PM         -     21122      0.00      0.00  |__java
04:59:49 PM         -     21124      0.00      0.00  |__java
04:59:49 PM         -     21125      0.00      0.00  |__java
04:59:49 PM         -     21126      0.00      0.00  |__java
04:59:49 PM         -     21127      0.00      0.00  |__java
04:59:49 PM         -     21128      0.00      0.00  |__java
04:59:49 PM         -     21129      0.00      0.00  |__java
04:59:49 PM         -     21130      0.00      0.00  |__java
04:59:49 PM         -     21131      1.00      0.00  |__java
04:59:49 PM         -     21133      0.00      0.00  |__java
04:59:49 PM         -     21134      0.00      0.00  |__java
04:59:49 PM         -     21135      0.00      0.00  |__java
04:59:49 PM         -     21136      0.00      0.00  |__java
04:59:49 PM         -     23692      4.00      0.00  |__java

将cswch/s中打印的结果进行求和,发现它的值到了11000之上。而系统总的上下文切换只有14000。说明flink占用了大量的cpu。

# 查看cpu占用情况
pidstat -u -p 22149 5
04:18:06 PM       PID    %usr %system  %guest    %CPU   CPU  Command
04:18:11 PM     22149   50.80   10.00    0.00   60.80     1  java
04:18:16 PM     22149   57.60   10.80    0.00   68.40     1  java
04:18:21 PM     22149   49.40    9.40    0.00   58.80     1  java
04:18:26 PM     22149   53.20    9.60    0.00   62.80     1  java
04:18:31 PM     22149   50.40   10.00    0.00   60.40     1  java

将%usr和%system进行相加,可以看出,flink TaskManager占用了60%的cpu。占用cpu高的原因是,flink taskmanager中线程上下文切换太频繁。

线程堆栈追踪

为了找到是什么线程在频繁的切换,我们将TaskManager的线程堆栈进行打印:

# jstack 进程id >> 进程id.log
jstack 22149 >> 22149.log

然后打开线程堆栈文件,会发现,文件里面的线程id都是16进制的,而我们通过pidstat看到的线程id是10进制的。通过以下命令,进行互相转换:

# printf "%X\n" 线程id
> printf "%X\n" 20623
> 508F

在刚刚的线程堆栈文件中查找:0x508F。找到如下结果:

"OutputFlusher for Source: Stream-Controller-hd_smart8hd_smart8 -> Timestamps/Watermarks" #187 daemon prio=5 os_prio=0 tid=0x00007f340000d000 nid=0x508f sleeping[0x00007f33d4024000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at org.apache.flink.runtime.io.network.api.writer.RecordWriter$OutputFlusher.run(RecordWriter.java:308)

依次类推,通过随机抽查上下文切换比较高的线程ID,发现大部分都是flink在进行writer。

Flink任务优化,需要对Flink相当熟悉。通过上面的线程堆栈,我们可以看到,是由于flink进行writer导致的cpu负载过高。而我们的flink流,使用了大量的Collector.collect()函数。该函数的作用是,将上游的数据发往下游进行处理。Flink在全局环境变量中提供了将上游数据刷写到下游的一个频率设置。

streamExecutionEnvironment.setBufferTimeout(maxBufferTimeout);

该参数的作用是,提高刷写速度,从而提高flink的实时性。

为了提高flink的实时性,我们将该值设置的是5ms。而flink默认的值是100ms。

正是由于它太过频繁,且Collector.collect()过多,才导致了flink任务占用了大量的cpu。

因此,最终解决flink占用过高cpu负载的方式就是,增大BufferTimeout时间,调整flink任务,减少Collector.collect()数量。

优化了flink任务之后,再将原来的flink任务提交到flink集群。此时通过top查看cpu负载情况

1598586467980

可以看到,cup负载明显降低,原来达到了4之上,现在在1左右。

通过visualVM可以监控到,cpu使用极低。

1598586569081

再查看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
 2  0  11152 3317480 650676 7778684    0    0    36    57    1    1  6  2 91  0  0
 0  0  11152 3317464 650680 7778684    0    0     0    24 1844 2904  7  1 92  0  0
 0  0  11152 3317464 650680 7778696    0    0     0   116 1437 2547  4  1 94  1  0
 0  0  11152 3317472 650680 7778708    0    0     0     0 1594 2694  3  1 96  0  0
 0  0  11152 3317472 650680 7778728    0    0     0     0 1628 2801  5  1 94  0  0

单独查询taskmanager进程,线程上下文切换总数为:1000以内。

总结

通过前面的理论及实战,那么肯定会有一个疑问:系统内,每秒多少次上下文切换才算正常?其实这个没有一个固定值,它的数值取决于系统cpu性能。如果cpu性能很高,每秒处理的任务将会很多。只要不超过对应的瓶颈都可以。最主要的是load average。它是一个很有价值的参考值。经验值是cpu核数*0.7。在它之下则任务基本正常。超过后则有一定的风险。也可以通过以下几点来参考。

1、自愿上下文切换(cswch/s)变多了,说明进程都在等待资源,有可能发生I/O问题
2、非自愿上下文切换(nvcswch/s)变多了,说明进程都在被强制调度,也就是都在争抢cpu,说明cpu的确成为瓶颈
3、中断次数变多,说明cpu被中断程序占用,还需要通过查看/proc/interrupts文件来分析具体的中断类型

参考:

https://www.jianshu.com/p/68ff81e2c084

https://www.jianshu.com/p/2abeb1bee1a6