A. 数据库消耗内存大还是cpu大
作者 王文安,腾讯CSIG数据库专项的数据库工程师,主要负责腾讯云数据库 MySQL 的相关的工作,热爱技术,欢迎留言进行交流。文章首发于腾讯云+社区的腾讯云数据库专家服务专栏。
在日常工作中,发现 MySQL 的状态不太对劲的时候,一般都会看看监控指标,很多时候会看到熟悉的一幕:CPU 使用率又爆了。本文将给大家介绍 MySQL 和 CPU 之间的关系,对此有一定的了解之后可以更准确的判断出问题的原因,也能够提前发现一些引发 CPU 问题的隐患。
怎么看懂CPU使用率
以 Linux 的 top 命令为例,效果如下:
Top 命令
在 %CPU 这一列就展示了 CPU 的使用情况,百分比指代的是总体上占用的时间百分比:
%us:表示用户进程的 CPU 使用时间(没有通过 nice 调度)
%sy:表示系统进程的 CPU 使用时间,主要是内核使用。
%ni:表示用户进程中,通过 CPU 调度(nice)过的使用时间。
%id:空闲的 CPU 时间
%wa:CPU 运行时在等待 IO 的时间
%hi:CPU 处理硬中断花费的时间
%si:CPU 处理软中断花费的时间
%st:被虚拟机偷走的 CPU 时间
通常情况下,我们讨论的 CPU 使用率过高,指的是 %us 这个指标,监控里面的 CPU 使用率通常也是这个值(也有用其他的方法计算出来的,不过简单起见,不考虑其他的情况 )。其他几个指标过高也代表出 MySQL 的状态异常,简单起见,这里主要还是指 %us 过高的场景。
MySQL和线程
MySQL 是单进程多线程的结构,意味着独占的 MySQL 服务器里面,只能用 top 命令看到一行数据。
TOP 命令效果
这里能看到的是 MySQL 的进程 ID,如果要看到线程的情况,需要用top -H
TOP 命令效果
在这里能看到的是 MySQL 各个线程的 ID,可以看到 MySQL 在启动之后,会创建非常多的内部线程来工作。
这些内部线程包括 MySQL 自己用来刷脏,读写数据等操作的系统线程,也包括处理用户 SQL 的线程,姑且叫做用户线程吧。用户线程有一个特殊的地方:程序端发送到 MySQL 端的 SQL,只会由一个用户线程来执行(one-thread-per-connection),所以 MySQL 在处理复杂查询的时候,会出现“一核有难,多核围观”的尴尬现象。
参考 %us 的定义,对于 Linux 系统来说,MySQL 进程和它启动的所有线程都不算内核进程,因此 MySQL 的系统线程和用户线程在繁忙的时候,都会体现在 CPU 使用率的 %us 指标上。
什么时候CPU会100%
MySQL 干什么的时候,CPU 会 100%?从前文的分析来看,MySQL 主要是两类线程占用 CPU:系统线程和用户线程。因此 MySQL 独占的服务器上,只需要留意一下这两类线程的情况,就能 Cover 住绝大部分的问题场景。
系统线程
在实际的环境中,系统线程遇到问题的情况会比较少,一般来说,多个系统线程很少会同时跑满,只要服务器的可用核心数大于等于 4 的话,一般也不会遇到 CPU 100%,当然有一些 bug 可能会有影响,比如这个:
MySQL BUG
虽然情况比较少,但是在面对问题的常规排查过程中,系统线程的问题也是需要关注的。
用户线程
提到用户线程繁忙,很多时候肯定会第一时间凭经验想到慢查询。确实 90% 以上的时候都是“慢查询”引起的,不过作为方法论,还是要根据分析再去得出结论的~
参考 us% 的定义,是指用户线程占用 CPU 的时间多少,这代表着用户线程占用了大量的时间。
一方面是在进行长时间的计算,例如:order by,group by,临时表,join 等。这一类问题可能是查询效率不高,导致单个 SQL 语句长时间占用 CPU 时间,也有可能是单纯的数据量比较多,导致计算量巨大。另一方面是单纯的 QPS 压力高,所以 CPU 的时间被用满了,比如 4 核的服务器用来支撑芹神 20k 到 30k 的点查询,每个 SQL 占用的 CPU 时间并不多,但是因为整体的 QPS 很高,所以 CPU 的时间被占满了。
问题的定位
分析完之后,就要开始实战了,这里根据前文的分析给出一些经典的 CPU 100% 场嫌源亏景,并给出简要的定位方法作为参考。
PS:系裂敏统线程的 bug 的场景 skip,以后有机会再作为详细的案例来分析。
慢查询
在 CPU 100% 这个问题已经发生之后,真实的慢查询和因为 CPU 100% 导致被影响的普通查询会混在一起,难以直观的看 processlist 或者 slowlog 来发现尊敬的大船,这时候就需要一些比较明确的特征来进行甄别。
从前文的简单分析可以看出来,查询效率不高的慢查询通常有以下几种情况:
全表扫描:Handler_read_rnd_next 这个值会大幅度突增,且这一类查询在 slowlog 中 row_examined 的值也会非常高。
索引效率不高,索引选错了:Handler_read_next 这个值会大幅度的突增,不过要注意这种情况也有可能是业务量突增引起的,需要结合 QPS/TPS 一起看。这一类查询在 slowlog 中找起来会比较麻烦,row_examined 的值一般在故障前后会有比较明显的不同,或者是不合理的偏高。
比如数据倾斜的场景,一个小范围的 range 查询在某个特定的范围内 row_examined 非常高,而其他的范围时 row_examined 比较低,那么就可能是这个索引效率不高。
排序比较多:order by,group by 这一类查询通常不太好从 Handler 的指标直接判断,如果没有索引或者索引不好,导致排序操作没有消除的话,那么在 processlist 和 slowlog 通常能看到这一类查询语句出现的比较多。
当然,不想详细的分析 MySQL 指标或者是情况比较紧急的话,可以直接在 slowlog 里面用 rows_sent 和 row_examined 做个简单的除法,比如 row_examined/rows_sent > 1000 的都可以拿出来作为“嫌疑人”处理。这类问题一般在索引方面做好优化就能解决。
PS:1000 只是个经验值,具体要根据实际业务情况来定。
计算量大
这一类问题通常是因为数据量比较大,即使索引没什么问题,执行计划也 OK,也会导致 CPU 100%,而且结合 MySQL one-thread-per-connection 的特性,并不需要太多的并发就能把 CPU 使用率跑满。这一类查询其实是是比较好查的,因为执行时间一般会比较久,在 processlist 里面就会非常显眼,反而是 slowlog 里面可能找不到,因为没有执行完的语句是不会记录的。
这一类问题一般来说有三种比较常规的解决方案:
读写分离,把这一类查询放到平时业务不怎么用的只读从库去。
在程序段拆分 SQL,把单个大查询拆分成多个小查询。
使用 HBASE,Spark 等 OLAP 的方案来支持。
高 QPS
这一类问题单纯的就是硬件资源的瓶颈,不论是 row_examined/rows_sent 的比值,还是 SQL 的索引、执行计划,或者是 SQL 的计算量都不会有什么明显问题,只是 QPS 指标会比较高,而且 processlist 里面可能什么内容都看不到,例如:
processlist
总结
实际上 CPU 100% 的问题其实不仅仅是单纯的 %us,还会有 %io,%sys 等,这些会涉及到 MySQL 与 Linux 相关联的一部分内容,展开来就会比较多了。本文仅从 %us 出发尝试梳理一下排查&定位的思路和方法,在分析 %io,%sys 等方面的问题时,也可以用类似的思路,从这些指标的意义开始,结合 MySQL 的一些特性或者特点,逐步理清楚表象背后的原因。
B. 服务器的CPU和内存, 哪个重要
把CPU减一个吧,应为你们数据量不算密集,甚至你们可以两个都削减来增加在硬盘上得投资,硬盘好很重要
C. cpu和内存哪个重要
总的来说CPU更重要,内存只要上了4G基本没有太大问题,肢判如CPU档次就很多了,不同的需求需要不同档次的CPU,价格也差的历启很多,从冲凯200块到20000块都有
D. 到底是CPU重要还是内存重要
这么比较不成唤配汪立呀,因为这是两种配件,运行机制不一样。CPU是核心运算功能,内存是传输数据功能,内存够大,CPU运算不过来也不行,CPU运算快,内存小数据传输慢也不行,两个是相辅相成的关系,任何一个配件是短板都会造成电脑卡、慢,所以谈不上哪个重要不重和仔要,两者同样重要。卖册
E. 按服务器来说 内存 CPU 带宽 哪个重要
问题太笼统了,服务器要看你的使用场景。如果你用服务器去做一个下载站或者图片站、视频站等对网络资源要求比较大的场景,内存和CPU都不重要,带宽是最重要的。
如果你用服务器里面运行着大量使用多线程或者多进程的项目,那内存和带宽又变的不重要了。
如果你服务器挂载站点需要经常读写数据库,网站访问并发很大需要加装Redis等缓存器,那么内存变的非常重要,其次是带宽,最后是CPU。
所以说的这么多,哪个重要还是需要看你用这个服务器的主要使用场景
F. 数据库吃内存还是cpu
数据库吃内存。根据查询相关资料信息显示,在读取慎棚效率上,从内存中读取数据肯灶毕定比从硬盘中读取数据要快。从写入效率上来看,当内存比较大隐孝芹的时候,我们需要往硬盘中写数据的时候,就不用每次都写,可以先缓存着,攒够了再一次性写入(延缓写入)。
G. 内存和CPU哪个更重要
CPU相对来说比内存稍微重要一些,毕竟CPU的计算能力是软件运行的保证,内存不够的话可以用虚拟内存来弥补,虽然效率要慢一些
H. 电脑的CPU重要还是内存重要
当然是CPU重要,CPU也叫中央处理器,是电脑的最核心配件,类似人的大脑。
下面我来普及下这两个配件的基本知识:
1. CPU: 中央处理器(CPU),是电子计算机的主要设备之一,电脑中的核心配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的核心部件。在计算机体系结构中,CPU 是对计算机的所有硬件资源(如存储器、输入输出单元) 进行控制调配、执行通用运算的核心硬件单元。CPU 是计算机的运算和控制核心。计算机系统中所有软件层的操作,最终都将通过指令集映射为CPU的操作。可以说,CPU甚称人体大脑功能,你就知道他的重要性。
2. 内存: 随机存取存储器(英语:Random Access Memory,缩写:RAM),俗称内存,内存条。是与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM(内存)工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。它与ROM(硬盘)的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。内存的大小,对性能有影响,但重要性与CPU比,还是其次。
总之,电脑对性能影响的最重要配件是CPU,其次显卡,其次内存,其次硬盘,最后其它。
两个都属于必不可少的配件,这两个小东西都必不可少。
CPU作为整台电袭友脑的中心,无疑更为重要,她主要提供了处理指令,执行操作,控制时间,拍租槐处理数据等功能。可以说一台电脑的性能主要由CPU提供。
也可以说CPU决定了一台电脑的上限型败
现在很多人往往过分注重CPU的高低往往忽略了内存的大小。
见过不少朋友的电脑往往都是I7-9900K之类的CPU搭配了一个8G的内存。
而内存决定了电脑的下限。
再高配置的电脑却搭配了一根巨小的内存,唯一结果就是电脑的运行会非常缓慢。
内存可以理解为一个淳朴与硬盘交换数据的中转站。如果内存太小就会导致程序加载非常缓慢,如现在Windows10操作系统只给安装4G内存的话,系统就占用60%以上的内存,开个Excel 开几个网页,基本就到内存的天花板了。当内存占用率超过95%这基本就没法使用了。
所以CPU 内存的关系中 内存更像是木桶理论里最短的那块木板。
所以尽量让自己电脑的内存不要变成最短的那块木板吧
cpu:就是中央处理器、相当于人的大脑、用来思考运算和处理问题的。
内存:就像是把刚刚看到、听到的东西,临时缓冲在内存、过一会儿可能就忘了,比如说复制文件到硬盘,其实不是直接到硬盘,而是经过内存---处理器---内存再到硬盘,所以复制数据的速度在某种意义上来说取决于内存。通常是CPU更重要,就好像你原来用的4代i3加8G内存,你再加一根8G内存上去,感觉没什么明显升级效果。而你把CPU换成新的10代i3再加8G内存,会明显感觉到升级后的效果。
完成一件事情,需要很多步骤,而cpu参与每一个步骤的策划,内存收到cpu指令后执行这些步骤,所以,都很重要!
请问你觉得手重要还是脚重要?
同为电脑必备硬件,一样重要
都重要。
I. 做数据分析到底是CPU重要还是内存重要,硬盘是PCL-E
多开文件、后台加载等对内存需求比较大。
处理速度、调用速度跟CPU和硬盘关系比较密切。
家用电脑,同样配置,机械硬盘跟仿型固态硬盘上网睁肢都有明显区别(随便SATA的都是明显悉大世对比)。