阿里云RDS实例CPU超过100%的分析

客户问题描述:
阿里云RDS实例CPU超过100%的分析
阿里云技术回复:
关于阿里云数据库rds 实例cpu 超过100%,通常这种情况都是由于sql 性能问题导致的,下面我用一则案例来分析:
用户实例xxx反馈cpu 超过100%,实例偶尔出现卡住的现象
1.原理:cpu 消耗过大通常情况下都是有慢sql 造成的,这里的慢sql 包括全表扫描,扫描数据量过大,内存排序,磁盘排序,锁争用等待等;
2.表现现象:sql 执行状态为:sending data,Copying to tmp table,Copying to tmp
table on disk,Sorting result,locked;
3.解决方法:用户可以登录到阿里云rds,通过show processlist查看当前正在执行的sql,当执行完show processlist后出现大量的语句,通常其状态出现sending data,Copying to tmp table,Copying to tmp table on disk,Sorting result, Using filesort 都是sql有性能问题;
A.sending data表示:sql正在从表中查询数据,如果查询条件没有适当的索引,则会导致sql执行时间过长;
B.Copying to tmp table on disk:出现这种状态,通常情况下是由于临时结果集太大,超过了数据库规定的临时内存大小,需要拷贝临时结果集到磁盘上,这个时候需要用户对sql进行优化;
C.Sorting result, Using filesort:出现这种状态,表示sql正在执行排序操作,排序操作都会引起较多的cpu消耗,通常的优化方法会添加适当的索引来消除排序,或者缩小排序的结果集;

通过show processlist发现如下sql:
Sql A.
| 2815961 | sanwenba | 10.241.142.197:55190 | sanwenba |
Query | 0 | Sorting result | select z.aid,z.subject from
www_zuowen z right join www_zuowenaddviews za on za.aid=z.aid order by
za.viewnum desc limit 10;
性能sql:
select z.aid,z.subject from www_zuowen z right join www_zuowenaddviews za
on za.aid=z.aid order by za.viewnum desc limit 10;

用explain 查看执行计划:
sanwenba@3018 10:00:54>explain select z.aid,z.subject from www_zuowen z
right join www_zuowenaddviews za on za.aid=z.aid order by za.viewnum desc
limit 10;
+—-+————-+——-+——–+—————+———+———+—————–+——
| id | select_type | table | type | possible_keys | key | key_len | ref |
rows | Extra |
+—-+————-+——-+——–+—————+———+———+—————–+——
| 1 | SIMPLE | za | index | NULL | viewnum | 6 |
NULL | 537029 | Using index; Using filesort |
| 1 | SIMPLE | z | eq_ref | PRIMARY | PRIMARY | 3 |
sanwenba.za.aid | 1 | |

添加适当索引消除排序:
sanwenba@3018 10:02:33>alter table www_zuowenaddviews add index
ind_www_zuowenaddviews_viewnum(viewnum);
sanwenba@3018 10:03:27>explain select z.aid,z.subject from www_zuowen z
right join www_zuowenaddviews za on za.aid=z.aid order by za.viewnum desc
limit 10;
+—-+————-+——-+——–+—————+——————————–+———+-
| id | select_type | table | type | possible_keys | key |
key_len | ref | rows | Extra |
+—-+————-+——-+——–+—————+——————————–+———+-|
1 | SIMPLE | za | index | NULL |
ind_www_zuowenaddviews_viewnum | 3 | NULL | 10 | Using index |
| 1 | SIMPLE | z | eq_ref | PRIMARY PRIMARY | 3 | sanwenba.za.aid
| 1 | |
+—-+————-+——-+——–+—————+——————————–+———+-
Sql B:
| 2825321 | netzuowen | 10.200.120.41:44172 | netzuowen |
Query | 2 | Copying to tmp table on disk |
SELECT * FROM `www_article` WHERE 1=1 ORDER BY rand() LIMIT 0,30

这种sql order by rand()同样也会出现排序;
netzuowen@3018 10:23:55>explain SELECT * FROM `www_zuowensearch`
WHERE checked = 1 ORDER BY rand() LIMIT 0,10 ;
+—-+————-+——————+——+—————+——–+———+——-+——+
| id | select_type | table | type | possible_keys | key | key_len | ref |
rows | Extra |
+—-+————-+——————+——+—————+——–+———+——-+——+
| 1 | SIMPLE | www_zuowensearch | ref | newest | newest | 1 |
const | 1443 | Using temporary; Using filesort |
+—-+————-+——————+——+—————+——–+———+——-+——+

这种随机抽取一批记录的做法性能是很差的,表中的数据量越大,性能就越差:
解决方法如下:
http://www.piaoyi.org/php/MySQL-Order-By-Rand.html

第一种方案,即原始的Order By Rand() 方法:

$sql=”SELECT * FROM content ORDER BY rand() LIMIT 12″;
$result=mysql_query($sql,$conn);
$n=1;
$rnds=”;
while($row=mysql_fetch_array($result)){
$rnds=$rnds.$n.”.
href=’show”.$row[‘id’].”-“.strtolower(trim($row[‘title’])).”‘>”.$row[‘title’].”
/>\n”;
$n++;
}
3万条数据查12条随机记录,需要0.125秒,随着数据量的增大,效率越来越低。

第二种方案,改进后的JOIN 方法:

for($n=1;$n<=12;$n++){
$sql=”SELECT * FROM `content` AS t1
JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `content`)) AS id) AS t2
WHERE t1.id >= t2.id ORDER BY t1.id ASC LIMIT 1″;
$result=mysql_query($sql,$conn);
$yi=mysql_fetch_array($result);
$rnds = $rnds.$n.”.
href=’show”.$yi[‘id’].”-“.strtolower(trim($yi[‘title’])).”‘>”.$yi[‘title’].”
\n”;
}
3万条数据查12条随机记录,需要0.004秒,效率大幅提升,比第一种方案提升
了约30倍。缺点:多次select查询,IO开销大。

第三种方案,SQL语句先随机好ID序列,用IN 查询(推荐这个用法,IO
开销小,速度最快):

$sql=”SELECT MAX(id),MIN(id) FROM content”;
$result=mysql_query($sql,$conn);
$yi=mysql_fetch_array($result);
$idmax=$yi[0];
$idmin=$yi[1];
$idlist=”;
for($i=1;$i<=20;$i++){
if($i==1){ $idlist=mt_rand($idmin,$idmax); }
else{ $idlist=$idlist.’,’.mt_rand($idmin,$idmax); }
}
$idlist2=”id,”.$idlist;
$sql=”select * from content where id in ($idlist) order by field($idlist2) LIMIT
0,12″;
$result=mysql_query($sql,$conn);
$n=1;
$rnds=”;
while($row=mysql_fetch_array($result)){
$rnds=$rnds.$n.”.
href=’show”.$row[‘id’].”-“.strtolower(trim($row[‘title’])).”‘>”.$row[‘title’].”
/>\n”;
$n++;
}
3万条数据查12条随机记录,需要0.001秒,效率比第二种方法又提升了4倍左右,比第一种方法提升120倍。注,这里使用了order by field($idlist2) 是为了不排序,否则IN 是自动会排序的。缺点:有可能遇到ID被删除的情况,所以需要多选几个ID。

C.出现sending data的情况:
| 2833185 | sanwenba | 10.241.91.81:45964 | sanwenba | Query
| 1 | Sending data | SELECT * FROM `www_article` WHERE
CONCAT(subject,description) like ‘%??%’ ORDER BY aid desc LIMIT 75,15
性能sql:
SELECT * FROM `www_article` WHERE CONCAT(subject,description) like
‘%??%’ ORDER BY aid desc LIMIT 75,15
这种sql是典型的sql分页写法不规范的情况,需要将sql进行改写:
select * from www_article t1,(select aid from www_article where
CONCAT(subject,description) like ‘%??%’ ORDER BY aid desc LIMIT 75,15)t2 where t1.aid=t2.aid;
注意这里的索引需要改用覆盖索引:aid+ subject+description

总结:

Sql优化是性能优化的最后一步,虽然位于塔顶,他最直影响用户的使用,但也是最容易优化的步骤,往往效果最直接。RDS-mysql由于有资源的隔离,不同的实例规格拥有的iops能力不同,比如新1型提供的iops为150个,也就是每秒能够提供150次的随机磁盘io操作,所以如果用户的数据量很大,内存很小,由于iops的限制,一条慢sql就很有可能消耗掉所有的io资源,而影响其他的sql查询,对于数据库来说就是所有的sql需要执行很长的时间才能返回结果,对于应用来说就会造成整体响应的变慢。

本文适用于:
阿里云RDS实例CPU超过100%的分析

不知道如何办理开通阿里云服务器?让凯铧互联专业的工程师帮您。我们提供免费的技术咨询,方案建议,让您的企业上云变得更容易,更有效,更安全!

看完上述说明如果您还有疑问,或者是需要咨询阿里云产品相关折扣、优惠或者是技术问题,请加下面的微信!我们是阿里云/腾讯云/华为云代理商联系我更有折上折优惠,新老用户均有!微信(电话):158-0160-3153。

为什么选择凯铧互联:北京凯铧互联科技有限公司(简称凯铧互联)由多名前阿里云资深技术专家创立,核心员工来自阿里巴巴、腾讯服务器运维团队,公司90%成员均是超过10年具备专业运维经验的精英。作为阿里云,腾讯云,百度云,金山云,华为云重要的合作伙伴,专业从事互联网应用服务、云计算、大数据、人工智能、企业信息化建设,为企业用户提供基于大数据的企业上云解决方案。公司总部设在北京,并在内蒙设有办事处,服务全国各地企业,与互联网专业公司及主流服务商建立了良好合作关系。公司官网:www.bjkaihua.com; 腾讯云网站www.bjkaihua.net.cn; 阿里云业务网站:www.alibjyun.com。

目前像阿里云、腾讯云、华为云之类的云计算厂家后期续费,复购,升级是很贵的。而且推出的很多活动都是要求新用户购买的。推荐大家从节省成本考虑,尽量买的配置高一点的云服务器,时长尽量选3年。你现在选择高配,选择3年的差价比不过到时候续费、升级、复购时一半的费用。

为什么现在很多老用户都在想尽办法想买新用户活动下的云服务器,因为当他们业务起来了,环境熟悉了,想升级配置,想扩容业务,想续费云服务器结果发现再也买不到这么便宜的云服务器了。免费的才是最贵的就是这个道理。

阿里云ECSWindows服务器CPU占用高的处理办法

发布:凯铧互联小编

我们在使用阿里云服务器ECS实例时,有时候会遇到出现 CPU 占用高的情况,如果长期处于这种情况,会对正常访问服务器以及服务器上运行的应用产生一定的影响。下文阿里云代理商凯铧互联就为大家分析出现这种情况的原因以及解决办法:

Windows 实例出现 CPU 高利用率原因分析
在一些情况下出现 CPU 的高占用是正常的,假如购买了 Windows Server 2012 低规格实例(如实例规格为 1 核 1 GB),实例 CPU 有时突然飙高,排查后发现 Windows Update 服务在进行自动更新。其他情况,如:病毒木马、第三方杀毒软件、应用程序异常、驱动异常、高 I/O 或高中断处理的应用程序,也会造成 CPU 占用率高。

解决方法
1、CPU 飙高时,检查是否后台有执行 Windows Update 进程。
2、CPU 飙高时,检查杀毒软件是否在后台执行扫描操作。用户可以直接把杀毒软件的版本更新到最新,或者是直接删除杀毒软件
3、打开 运行 -> MSCONFIG 禁用所有非 Microsoft 自带服务驱动,然后检查问题是否再次发生。
4、使用商业版杀毒软件或 Microsoft 免费工具 Microsoft Safety Scanner 在安全模式下扫描杀毒。
5、运行 Windows Update 安装最新 Microsoft 安全补丁。
6、当 ECS 实例有大量的磁盘访问,网络访问,高计算需求时,CPU 高利用率是正常结果,您可以尝试升级实例规格以应对资源瓶颈问题。
7、更多解决方法可以直接通过本站客服咨询,阿里云代理商技术团队会为您提供一对一技术服务。

阿里云代理商 Windows 实例排查工具推荐
1】任务管理器
1、通过任务管理器能够直观的检查应用程序列表,从而定位占用CPU 较高的应用程序(如下图所示)
阿里云服务器,凯铧互联

在性能页面检查 CPU 占用率时,右击 CPU 使用率图示,单击将图形更改为 -> 逻辑处理器。如下图显示了 4 个逻辑 CPU 的利用率(如下图所示)
阿里云ECS,凯铧互联

2、如果某一个进程 CPU 飙升到接近100% ,其它的CPU 变化不是很大,这就可以能是网络 I/O 处理造成的

2】 资源监视器
用户能够直观的检查 CPU 使用率,同时还可以通过句柄和模块搜索对应的进程(如下图所示)
阿里云代理商,凯铧互联

3】Process Explorer
一款 Microsoft Sysinternals 工具,通过配置正确的 Symbols,检查对应应用程序的线程调用的 Call Stack,来定位可能的问题驱动

4】性能监视器
注:性能监视器(Performance Monitor)是 Microsoft 专业收集各个组件性能计数器的工具。对于系统CPU资源消耗,有多个Counter来检查。通过开始-> 运行-> perfmon 打开工具。
Performance 有三个核心参数:
\Processor(_Total)\% Processor Time
\Processor(*)\% User Time
\Processor(*)\% Privileged Time
其中,\Processor(_Total)\% Processor Time 是 \Processor(*)\% User Time 与 \Processor(*)\% Privileged Time使用之和

1、查看 \Processor(*)\% Privileged Time 数据。
\Processor(*)\% Privileged Time 是应用程序在内核中执行系统调用(例如驱动、IRP,上下文切换等)操作的时间。如果操作系统花费多余 30% 的时间在Privileged Time,如下图,意味着实例正在进行高 I/O 吞吐相关的操作
阿里云代理,凯铧互联

2、% Privileged Time 很高时,进一步检查 % DPC Time、% Interrupt Time 以及 Context Switches/sec的情况
高 % DPC Time、% Interrupt Time 意味着未知设备出现大量的操作或者很差的性能问题
高 Context Switches/sec 意味着有大量的线程处于 Ready 状态,需要减少线程的数量解决问题

3、% DPC Time、% Interrupt Time 很高时,使用 Microsoft Xperf 工具进一步分析

4、查看 \Processor(*)\% User Time 数据
上述如果没能够解决您的问题,可以直接联系阿里云代理商www.bjkaihua.com专业技术团队为您提供一对一服务,同时联系阿里云代理商客服还能够获得专属折扣优惠等。如果以上您还未解决您问题,请拨打我公司售后电话 136-5130-9831

阿里云代理商www.alibjyun.com凯铧互联温馨提醒:如果您还有其他的阿里云产品问题,可以直接联系阿里云代理商凯铧互联技术团队,专业技术人员为你提供一对一技术服务,同时还有在阿里云官网基础之上的折扣优惠,帮助您能够更好的云上发展。