如何优化因 MYSQL 读写频繁,负载过高导致的CPU高占用率

如何优化因 MYSQL 读写频繁,负载过高导致的CPU高占用率,第1张

不要用SQL,用一般的查询语句即可。

查询对象是用来 *** 作数据库中的记录对象。利用它可以按照一定的条件或准则从几个表中筛选出需要 *** 作的字段,并可以把它们集中起来,形成动态数据集。用户可以浏览、查询、打印、甚至修改这个动态数据集中的数据。

通过查询,可以查找和检索满足指定条件的数据,包括几个表中的数据。也可以使用查询同时更新或删除几个记录,以及对数据执行预定义或自定义的计算。

使用查询可以回答有关数据的特定问题,而这些问题通过直接查看表数据很难解决。可以使用查询筛选数据,执行数据计算和汇总数据,还可以使用查询自动执行许多数据管理任务,并在提交数据更改之前查看这些更改。

查询是对数据结果、数据 *** 作或者这两者的请求。可以使用查询回答简单问题,执行计算、合并不同表中的数据,甚至添加、更改或删除表数据。用于从表中检索数据或进行计算的查询叫做选择查询,用于添加、更改或删除数据的查询叫做 *** 作查询。

ž还可以使用查询为窗体或报表提供数据。在设计良好的数据库中,要使用窗体或报表显示的数据通常位于几个不同的表中,通过使用查询,可以在设计窗体或报表之前组合要使用的数据。

输入mysql 进入mysql命令模式

use mysql进入mysql数据库

flush privileges;大概就是获取权限,要不他不让你改。

set password for 'root'@'localhost'=password('新密码'); 完成修改

我靠终于改完了。

系统mysql的进程数

查看 mysql buffer pool hit

ps -ef | grep "mysql" | grep -v "grep" | wc –l

2Slave_running

mysql > show status like 'Slave_running';

如果系统有一个从复务器,这个值指明了从服务器的健康度

3Threads_connected

mysql > show status like 'Threads_connected';

当前客户端已连接的数量。这个值会少于预设的值,但你也能监视到这个值较大,这可保证客户端是处在活跃状态。

4Threads_running

mysql > show status like 'Threads_running';

如果数据库超负荷了,你将会得到一个正在(查询的语句持续)增长的数值。这个值也可以少于预先设定的值。这个值在很短的时间内超过限定值是没问题的。当Threads_running值超过预设值时并且该值在5秒内没有回落时, 要同时监视其他的一些值。

5Aborted_clients

mysql > show status like 'Aborted_clients';

客户端被异常中断的数值,即连接到mysql服务器的客户端没有正常地断开或关闭。对于一些应用程序是没有影响的,但对于另一些应用程序可能你要跟踪该值,因为异常中断连接可能表明了一些应用程序有问题。

6Questions

mysql> show status like 'Questions';

每秒钟获得的查询数量,也可以是全部查询的数量,根据你输入不同的命令会得到你想要的不同的值。

7Handler_

mysql> show status like 'Handler_%';

如果你想监视底层(low-level)数据库负载,这些值是值得去跟踪的。

如果Handler_read_rnd_next值相对于你认为是正常值相差悬殊,可能会告诉你需要优化或索引出问题了。Handler_rollback表明事务被回滚的查询数量。你可能想调查一下原因。

8Opened_tables

mysql> show status like 'Opened_tables';

表缓存没有命中的数量。如果该值很大,你可能需要增加table_cache的数值。典型地,你可能想要这个值每秒打开的表数量少于1或2。

9Select_full_join

mysql> show status like 'Select_full_join';

没有主键(key)联合(Join)的执行。该值可能是零。这是捕获开发错误的好方法,因为一些这样的查询可能降低系统的性能。

10Select_scan

mysql> show status like 'Select_scan';

执行全表搜索查询的数量。在某些情况下是没问题的,但占总查询数量该比值应该是常量(即Select_scan/总查询数量商应该是常数)。如果你发现该值持续增长,说明需要优化,缺乏必要的索引或其他问题。

11Slow_queries

mysql> show status like 'Slow_queries';

超过该值(--long-query-time)的查询数量,或没有使用索引查询数量。对于全部查询会有小的冲突。如果该值增长,表明系统有性能问题。

12Threads_created

mysql> show status like 'Threads_created';

该值应该是低的。较高的值可能意味着你需要增加thread_cache的数值,或你遇到了持续增加的连接,表明了潜在的问题。

13客户端连接进程数

shell> mysqladmin processlist

mysql> show processlist;

你可以通过使用其他的统计信息得到已连接线程数量和正在运行线程的数量,检查正在运行的查询花了多长时间是一个好主意。如果有一些长时间的查询,管理员可以被通知。你可能也想了解多少个查询是在"Locked"的状态—---该值作为正在运行的查询不被计算在内而是作为非活跃的。一个用户正在等待一个数据库响应。

14innodb状态

mysql> show engine innodb status\G;

该语句产生很多信息,从中你可以得到你感兴趣的。首先你要检查的就是“从最近的XX秒计算出来的每秒的平均负载”。

(1)Pending normal aio reads: 该值是innodb io请求查询的大小(size)。如果该值大到超过了10—20,你可能有一些瓶颈。

(2)reads/s, avg bytes/read, writes/s, fsyncs/s:这些值是io统计。对于reads/writes大值意味着io子系统正在被装载。适当的值取决于你系统的配置。

(3)Buffer pool hit rate:这个命中率非常依赖于你的应用程序。当你觉得有问题时请检查你的命中率

(4)inserts/s, updates/s, deletes/s, reads/s:有一些Innodb的底层 *** 作。你可以用这些值检查你的负载情况查看是否是期待的数值范围。

我使用下面的Debian服务器,它们都在同一个网段(本例如:1921680x):

sql1testcom: 1921680101 MySQL 群集节点 1

sql2testcom: 1921680102 MySQL 群集节点 2

loadb1testcom: 1921680103 负载均衡 1 / MySQL 群集管理服务器

loadb2testcom: 1921680104 负载均衡 2

另外我们需要一个虚拟IP地址:1921680105。它会安排给这个MySQL群集的负载均衡,以便于

应用程序通过统一单独的IP地址来访问群集。

尽管我们想在MySQL群集中使用两个节点,但是我们仍然需要第三个节点,MySQL群集管理服务器

,主要的一个原因是:如果其中一个MySQL群集节点坏了,而MySQL群集管理服务器没有运行,那

么两个群集节点上的数据将会不一致(“split brain”)。我们需要它来配置MySQL群集

因此我们的安装一般需要五台机器:

2个MySQL群集节点 + 1个群集管理服务器 + 2个负载均衡 = 5

因为群集管理服务器没有使用多少资源,系统将会空着什么都不做,所以我们可以把我们的第一

个负载均衡和它一起放在同一台机器上,这样可以节约我们一台服务器,所以最好我们只需要四台

机器。

二 配置MySQL群集管理服务器

首先我们要下载MySQL 5019,并安装群集管理服务器(ndb_mgmd)和群集管理客户端 (ndb_mgm - 它

可以用来监控群集的运行情况) 下面的步骤是在loadb1testcom (1921680103)上进行的:

loadb1testcom:

mkdir /usr/src/mysql-mgm

cd /usr/src/mysql-mgm

wget devmysqlcom/get/Downloads/MySQL-50/mysql-max-5019-linux-i686-\

glibc23targz/from/mirrorserviceorg/sites/ftpmysqlcom/

tar xvfz mysql-max-5019-linux-i686-glibc23targz

cd mysql-max-5019-linux-i686-glibc23

mv bin/ndb_mgm /usr/bin

mv bin/ndb_mgmd /usr/bin

chmod 755 /usr/bin/ndb_mg

cd /usr/src

rm -rf /usr/src/mysql-mgm

下一步,我们必须创建群集的配置文件,/var/lib/mysql-cluster/configini:

loadb1testcom:

mkdir /var/lib/mysql-cluster

cd /var/lib/mysql-cluster

vi configini

———-

[NDBD DEFAULT]

NoOfReplicas=2

[MYSQLD DEFAULT]

[NDB_MGMD DEFAULT]

[TCP DEFAULT]

# Section for the cluster management node

[NDB_MGMD]

# IP address of the management node (this system)

HostName=1921680103

# Section for the storage nodes

[NDBD]

# IP address of the first storage node

HostName=1921680101

DataDir= /var/lib/mysql-cluster

[NDBD]

# IP address of the second storage node

HostName=1921680102

DataDir=/var/lib/mysql-cluster

# one [MYSQLD] per storage node

[MYSQLD]

[MYSQLD]

网络宽带也会有所影响。

网络是数据库基础架构的主要部分。但是,通常性能基准测试是在本地计算机上完成的,客户端和服务器并置在一起。这样做是为了简化结构并排除一个以上的变量(网络部分),但是我们也忽略了网络对性能的影响。对于像 MySQL Group Replication 这样的产品集群来说,网络更为重要。在这篇文章中,我将介绍网络设置。这些都是简单而微不足道的,但却是让我们更了解复杂网络设置效果的基石。

安装我将使用两台裸机服务器,通过专用的 10Gb 网络连接。我将通过使用 ethtool-s eth1 speed1000duplex full autoneg off 命令更改网络接口速度来模拟 1Gb 网络。

我将运行一个简单的基准:sysbench oltp_read_only --mysql-ssl=on --mysql-host=1721601 --tables=20 --table-size=10000000 --mysql-user=sbtest --mysql-password=sbtest --threads=$i --time=300 --report-interval=1 --rand-type=pareto

运行时线程数从 1 到 2048 不等。所有数据都适合内存 -innodb_buffer_pool_size 足够大。因此工作负载在内存中占用大量 CPU:没有 IO 开销。 *** 作系统:Ubuntu 1604

N1 基准-网络带宽在第一个实验中,我将比较 1Gb 网络和 10Gb 网络。显然,1Gb 网络性能是这里的瓶颈,如果我们迁移到 10Gb 网络,我们可以显着改善我们的结果。要查看 1Gb 网络是瓶颈,我们可以检查 PMM(percona 的数据库监控管理开源工具) 中的网络流量图表:

我们可以看到我们的吞吐量达到了 116 MiB/s(或 928 Mb/s),这非常接近网络带宽。但是,如果我们的网络基础设施仅限于 1Gb,我们可以做些什么?

N2 基准-协议压缩MySQL 协议中有一个功能,您可以看到客户端和服务器之间的网络交换压缩:--mysql-compression=on。让我们看看它将如何影响我们的结果。

这是一个有趣的结果。当我们使用所有可用的网络带宽时,协议压缩实际上有助于改善结果。

但是 10Gb 网络不是这种情况。压缩/解压缩所需的 CPU 资源是一个限制因素,通过压缩,吞吐量实际上只达到我们没有压缩的一半。现在让我们谈谈协议加密,以及如何使用 SSL 影响我们的结果。

N3基准-网络加密

对于 1Gb 网络,SSL 加密显示了一些损失 - 单线程约为 10% - 但是否则我们再次达到带宽限制。我们还看到了大量线程的可扩展性,这在 10Gb 网络案例中更为明显。使用 10Gb 时,SSL 协议在 32 个线程后不会扩展。实际上,它似乎是 MySQL 目前使用的 OpenSSL 10 中的可伸缩性问题。在我们的实验中,我们看到 OpenSSL 111 提供了更好的可伸缩性,但是您需要从链接到OpenSSL 111 的源代码中获得特殊的 MySQL 构建才能实现这一点。我没有在这里展示它们,因为我们没有生产二进制文件。

结论

1 网络性能和利用率将影响一般应用程序吞吐量。

2 检查您是否达到了网络带宽限制。

3 如果受到网络带宽的限制,协议压缩可以改善结果,但如果不是,则可能会使事情变得更糟。

4 SSL 加密在线程数量较少的情况下会有一些损失(约10%),但对于高并发工作负载,它不会扩展。

mysql

cluster

是无共享模式,即数据分布存放于每个节点中,而oracle

rac是共享存储模式,数据集中存储的,每个rac节点只是一个oracle实例,两者实现原理不同

以上就是关于如何优化因 MYSQL 读写频繁,负载过高导致的CPU高占用率全部的内容,包括:如何优化因 MYSQL 读写频繁,负载过高导致的CPU高占用率、MySQL负载高时,如何找到是由哪些SQL引起的、如何衡量mysql库的健康度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9424765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存