微信号:gh_73344087c371

介绍:做有态度有内涵的技术类文章分享,多为本人实际工作过程中技术总结、思考和学习,内容分享包括但不限于:测试技术、测试招聘、职场经验、业内奇闻趣事.

sys cpu占用非常高性能问题分析定位

2019-06-14 16:10 测试那点事儿
sys cpu占用非常高性能问题分析定位

一次公司项目中压测,发现cpu基本被打满,其中内核态CPU占比非常高

我们上课讲过,常见的sys高的原因有如下7个原因:


1.大量的中断

    中断分软中断(软中断是一种需要内核为正在运行的进程去做一些事情的请求)和硬中断(外设引起的),中断会伴随着上下文切换。


2.系统负载高

    负载高表示有很多程序等待调度运行(一般是Running状态和Disk Sleep状态的线程太多,进入Disk Sleep状态的线程是不能够被打断的,他们会一直睡眠直到等待的资源被释放时主动去唤醒他们,这些线程在等待什么资源,比如某个信号量,它就会被加入到这个信号量的等待队列里,然后其它的线程释放这个信号量的时候会去检查该信号量的等待队列,然后把队列里线程给唤醒),它会导致上下文切换频繁。


3.大量的tpcip连接超时,导致内核态spin


4.上下文切换过于频繁

    比如每秒超过200k,这样CPU用于执行进程代码的时间少.sys会上去(因为cpu寄存器和高速缓存中的缓存会随着切换全部失效)


5.大并发io操作

    一般 I/O 操作不会消耗太多的 CPU ,因为主要的时间消耗会在 I/O 操作的设备上。比如从磁盘读文件时,主要的时间在磁盘内部的操作上,而消耗的 CPU 时间只占 I/O 操作响应时间的一少部分。但在大量的并发的 I/O 时才可能会使得 SYS CPU 有所增加。


6.多线程抢占系统调度的资源

    对于多个线程抢占某一个系统调用的资源,会导致大量的线程等待->唤醒->抢占,未抢到->等待...,导致不断的切换线程耗费cpu


7.频繁的内存缺页导致的sys高


基于以上经验,开始着手分析,首先通过top获取到的数据信息排除中断问题。由于压测的是数据库服务,所以怀疑重点从io和内存缺页优先排查,首先通过sar命令查看内存缺页情况

我们看到04:10:38到04:10:57这个采样时间段CPU已经完全占满,相应的在这段时间内每秒钟产生的缺页异常(faults/s)超过二百七十万次,明显的系统缺页异常,我们一般情况下内存缺页不会超过5w,所以目前的重点就是找到缺页异常的原因然后解决。

在压测中我们发现在缺页异常数量超高的情况下,读取文件的操作也非常频繁,通过数据库原理我们知道可能触发磁盘操作读的地方发生在填充两块数据库维护的cache

一个是 Indexes and Bloom Filtes cache(主要为缓存相关的索引)

另一个是Block Cache(缓存解压后的数据文件块)

Indexes and Bloom Filtes cache的大小取决Index数量,Block Cache 的大小可以根据实际的需要由用户配置。

查看数据库的配置发现Block Cache配置的内存大小为1GB,memTable的大小为2GB,在出现缺页率超高的情况下,数据库文件一般都变得比较大(> 10GB), 所以问题极有可能是因为给Block Cache配置的内存太小,导致Block Cache miss 率过高,从而需要频繁从存储设备读取文件块来填充Block Cache.

我们调整Block Cache的大小到40G,再进行压测:

缺页从200多万下降到目前最高2w,效果非常明显,在看我们的cpu使用情况


伴随着缺页异常的下降,我们的sys cpu也下降得非常明显,优化效果显著。


本周日6.16高级性能测试实战班开课 内容如下,详情添加客服咨询




 
测试那点事儿 更多文章 Metaspace溢出性能实战 APP性能测试工具使用说明 Jmeter实时性能测试数据的监控 Java性能分析之线程栈详解(下) Java性能分析之线程栈详解与性能分析(上)
猜您喜欢 良好的书写规范提高PHP代码执行效率 阿里首次公开麒麟培育计划,将人类历史推进100年! Andrej Karpathy:你为什么应该理解反向传播 理解 iOS Core Audio 音频概念 第八十五讲 win32多线程(2)