数据库运行所需CPU数量如何衡量? (数据库需要多少cpu)

数据库是当代信息系统中最关键的组件之一,它是数据管理、处理和交换的核心部分。由于现代数据库系统的复杂性和性能需求的挑战,一个关键的问题是如何有效地评估数据库系统的资源需求,尤其是CPU资源。在本文中,我们将讨论如何衡量数据库运行所需的CPU数量。

之一部分:CPU运行原理

CPU是计算机的核心部件,它是一种集成电路芯片,负责处理计算机的指令和运算。它由控制单元、算术逻辑单元、高速缓存和寄存器等组成。当操作系统启动时,它会将一些核心程序和相应的资源加载到内存中,这些程序需要利用CPU处理器的能力进行计算和操作。

在数据库应用程序运行时,CPU是数据库系统中的一个重要组件。它执行的操作包括SQL查询语句解析、索引查找、排序、连接、聚集等,其处理速度会直接影响数据库的响应速度和性能。因此,正确地衡量和配置CPU资源对于提高数据库效率至关重要。

第二部分:CPU利用率

在计算机系统中,CPU利用率(或CPU负载)是衡量系统性能的一个重要指标。它通常以百分比的形式呈现,并表示CPU正在运行进程的时间百分比。当CPU利用率接近100%时,表示该CPU正处于高负载状态,它可能会出现瓶颈问题。

在数据库系统中,CPU负载通常受到以下几个因素的影响:

1. 数据库的访问模式:不同的数据访问模式会产生不同的CPU负载水平。例如,当运行有大量的写操作(如插入、更新、删除)时,CPU的利用率通常较高。相反,只读操作(如查询)通常对CPU负载产生较小的影响。

2. 数据库的复杂度:复杂的查询或计算操作需要更多的CPU处理能力,因此会增加CPU的利用率。如大量的连接查询、复杂的聚合查询、排序和分页等。

3. 数据库系统的规模:规模更大的数据库系统通常需要更多的CPU资源来支持运行。因此,随着数据库规模的扩大,需要增加CPU数量来满足要求。

第三部分:确定CPU数量

确定CPU数量是一个复杂的过程,需要考虑多个因素,包括以下几个方面:

1. 应用程序性能需求:当前的应用程序是否需要更高的性能?如果是,增加CPU数量可能是一个解决方案。但需要注意的是,增加CPU不一定会带来线性的性能提升,并且需要投入更多的成本。

2. 现有硬件资源:在增加CPU数量之前,需要评估现有硬件资源的使用情况,以确保系统的其他组件(如内存、存储)也能支持增加CPU数量。

3. 预算:增加CPU数量需要投入更多的成本,包括硬件成本、部署成本、成本效益等。在确定CPU数量之前需要全面评估预算,并考虑采用云计算等技术来提高成本效益。

4. 负载均衡:在增加CPU数量之前,需要考虑负载均衡的问题,确保增加的CPU资源能够被充分利用。这需要根据负载的性质和数据库系统架构进行调整。

综上所述,确定数据库运行所需的CPU数量是一个复杂的问题,需要全面考虑多个因素。根据数据库的访问模式、复杂度和系统规模等因素,我们可以初步估算所需的CPU数量,然后进行实验测试和性能监控,最终确定更优CPU数量。这样可以确保数据库系统能够充分利用CPU资源,提高系统的性能,优化资源的利用,进而提高数据库应用的质量和效率。

相关问题拓展阅读:

如何选择数据库服务器硬件配置!急

这个….你有没有钱?

按你这么说性能需要提升30倍啊!

需要目前45nm四核至强CPU

不少于2GB的DDRECQ内存(更好能买到低周期的CL)

主板买的,这个牌子的服务器主板还是做的不错的!

显卡,用上面主板集成的就行了

硬盘你需要买个上万转的!推荐的!性能不错!

买机箱一定返旅要注意!牢渗世派固!结实!

电源买的节能静音的型号,这牌子稳定!省丛贺电!

数据库消耗内存大还是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 的一些特性或者特点,逐步理清楚表象背后的原因。

Cpu消耗大,主要看编写什么样的程序了。

简单的程序如果代码不是很多,速度追求也不是很高,通用的CPU和内存就可以了。

大型程序的话就得考虑CPU指令集的丰富程度了,复杂指令的效率比较高,可以减少代码执行时间。 内存自然是越大越好,要配合操作系统的寻址范围和管理方式。

比如大型的有丰富画面的游戏软件,不仅要求cpu、内存高,还对显卡要求高。

而数据量很大的连接数据库的管理软件编写,主要要求高内存

数据库需要多少cpu的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库需要多少cpu,数据库运行所需CPU数量如何衡量?,如何选择数据库服务器硬件配置!急,数据库消耗内存大还是cpu大的信息别忘了在本站进行查找喔。


数据运维技术 » 数据库运行所需CPU数量如何衡量? (数据库需要多少cpu)