《MySQL排错指南》——4.1 物理硬件限制-阿里云开发者社区

开发者社区> 异步社区> 正文

《MySQL排错指南》——4.1 物理硬件限制

简介:
+关注继续查看

本节书摘来自异步社区出版社《MySQL排错指南》一书中的第4章,第4.1节,作者:【美】Sveta Smirnova(斯维特 斯米尔诺娃),更多章节内容可以访问云栖社区“异步社区”公众号查看。

4.1 物理硬件限制

对性能有不切实际的期望是通常会犯的错。我们要求MySQL服务器在忽略硬件组件延迟的情况下进行优化。因此,理解什么导致了延迟很重要。

下面列出了影响MySQL服务器的硬件资源:

内存
CPU
内核数量
磁盘I/O
网络带宽
我们依次讨论每个细节。

4.1.1 内存

内存对于MySQL是非常宝贵的资源。服务器在没有磁盘交换的情况下运行很快。理想情况是数据驻留在内存中。因此,在物理内存的限制内合理配置缓冲区是非常重要的。关于这一点,1.6.4小节和3.9.3小节提供了更多详细的介绍和指导。

提示 提示

在Linux/UNIX上可以通过vmstat,或者Windows上的任务管理器来查看mysqld是否有大量磁盘交换。

这里列出Linux上一个磁盘交换的例子。重要的部分加粗显示。对于没有磁盘交换的服务器,这些值应该为0:
image

相关章节讨论了影响内存使用的配置变量。首先计算出MySQL服务器需要用到的最大内存量,基本原则是要保证它小于你的物理内存。当缓冲区大于实际内存时会增加MySQL服务器因为“内存不足”错误而崩溃的风险。

前面的观点可以换一种陈述方式:如果你需要更大的缓冲区,则需要购买更多内存。扩展应用程序时这始终是一个很好的做法。
使用的内存模块支持扩展错误校正(EEC),这样即使内存有一些损坏,MySQL服务器也不会因此崩溃。
关于内存使用的更多内容,可以参考MySQL参考手册中的“MySQL如何使用内存”章节。我就不在此处重复,因为它不涉及任何新排错技巧。

很重要的一点是,当查询的行包含BLOB字段时,内部缓冲区会增长到能存储该值的点,并且存储引擎在查询结束后不会释放内存。需要执行FLUSH TABLE来释放内存。

另一个要点涉及32位和64位架构的不同。虽然32位使用较小的指针大小可以节约内存,但由于操作系统的寻址受限,它在缓冲区大小设置上存在固有的约束。理论上,每个进程在32位系统上的最大可用内存为4GB,实际上在很多系统上这个数值很小。所以如果你想使用的缓冲区在32位系统上超过了这个值,考虑转换到64位架构下。

4.1.2 处理器与内核

MySQL的性能不会随着CPU的速度线性增长。这并不意味着你不能使用一块快的CPU,但不要期望提高CPU速度能像增加内存那样性能会有大幅提升。

然而,当设置一些影响内部线程并发的选项时,内核的数量很重要。如果你没有足够的内核数增加这些值是没有任何意义的。通过使用一款名叫sysbench[1]的基准工具能够轻松说明问题。表4-1显示了在四核机器上的一个测试结果。我使用具有16个线程的OLTP sysbench测试。

表4-1 不同innodb_thread_concurrency值下执行事件消耗的时间(s)

image

如你所见,在启动8个线程之前测试越运行越快,但随着数值的增加停止了增长。

4.1.3 磁盘I/O

快速磁盘对MySQL性能很重要。磁盘越快,I/O性能越好。

关于磁盘,你需要关注磁盘读延迟(每次读访问需要多长时间)和fsync延迟(每个fsync耗时多少)。

近来固态硬盘(SSD)的性能很好,但不要指望在上面出现奇迹,因为大多数存储引擎是针对硬盘读写优化的。

同样网络存储也是。可以将数据和日志文件放在网络文件系统或者存储上,但这些装置可能会慢于本地磁盘。你需要检查存储是否快速并且可靠,否则,如果由于网络故障引起数据丢失请不要感到意外。

在Linux/UNIX上使用iostat来判断磁盘I/O是否过载。向设备发起的请求平均队列长度正常情况下不会很高。出于同样的目的,你可以在Windows平台上使用perfmon。下面给出iostat的一个输出例子:

image

以上输出取自mysqld空闲并随后启动一个活跃的I/O作业时。你可以看到avgqu-sz是如何增长的。虽然还不至于带来问题,但我决定在这里通过这个例子来说明当mysqld正在处理它的作业时磁盘I/O活动是如何发生变化的。

除了速度之外,要牢记的是,存储也可能会丢失数据,可能出现只写入一部分页的情况。如果使用InnoDB,为了数据安全通过设置innodb_double_write使用双写缓冲区。同样,为磁盘准备备用电池是很重要的,它可能防止因为电源故障导致的数据丢失。

4.1.4 网络带宽

客户端几乎总是通过网络连接MySQL到服务器的,所以MySQL服务器运行在一个快速的网络环境下是很重要的。

除了网络带宽之外,往返时间(RTT)和往返次数也很重要。RTT指的是客户端发送网络包到服务端返回应答所消耗的时间。主机间隔的距离越长,RTT越高。

也正是因为存在网络带宽和RTT这些原因,如果可以,推荐将客户端和服务器放在同一个本地网络中。

复制也推荐在本地网络中进行。连接到从服务器时可以使用因特网来替代本地内联网,但预期会出现延迟,甚至中继日志数据损坏带来的报错。上面的错误应该在bug #26489 bug修复之后会自动修复,前提是你在5.5版本中配置了relay-log-recovery选项,或者从5.6版本开始使用二进制日志校验和。但由于网络故障主从服务器之间仍然会在重发包上消耗时间。

4.1.5 延迟效应的例子

为了结束本章内容,我用一个小例子来说明硬件延迟是如何影响一条普通的UPDATE查询的。我们使用InnoDB表并将自动提交打开,同时打开二进制日志文件。

image

这个简单的查询会在下面的情况下遭遇延迟:

  客户端发送命令到服务端历经半个RTT。

  执行UPDATE的WHERE子句,mysqld读磁盘。

  由于自动提交开启mysqld会对此事务做一个fsync调用。

  为写入二进制日志文件Mysqld做一次fsync调用。

  为提交改变mysqld做一次fsync调用。

  客户端收到来自服务器的结果,这是RTT的另一半。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java编程——Redis详解
  Redis简介   Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。   Redis 与其他 key - value 缓存产品有以下三个特点:   Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。Redis 优势:性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。丰富的数据类型 –
5 0
Java教程:Nginx静态资源配置命令介绍
  Nginx静态资源的配置指令   listen指令   listen:用来配置监听端口。   语法   listen address[:port] [default_server]...; listen port [default_server]...;   默认值   listen *:80 | *:8000   位置   server   listen的设置比较灵活,我们通过几个例子来把常用的设置方式熟悉下:   listen 127.0.0.1:8000; // listen localhost:8000 监听指定的IP和端口   listen 127.0.0
9 0
java结合android和ios的三端非对称接口加密讲解
  算法:有rsa及aes算法   Java端处理方式:   入参处理方式   1、参数通过request.getParameter获取的话,可以通过自己定义一个filter来进行处理。   定义两个类,分别继承HttpServletRequestWrapper及Filter,将该filter配置到web.xml里面,在其他filter前面,以免影响程序获取参数的调用   public class SafeTextRequestWrapper extends HttpServletRequestWrapper {   public SafeTextRequestWrapper(H
9 0
Java-Redis笔记
  Redis   1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库   1.1.什么是NOSQL   NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。   随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
7 0
Java高级软件工程师面试考纲
  如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构、算法、网络、操作系统等知识。因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对Java高级开发工程师职位的考核纲要,希望可以帮助到需要的人。   当前,市面上有《Java XX宝典》类似的图书,而且图书中的内容都着重在讲解Java最为基础的部分,最严重的是,里面有着大量错误的内容,极具误导性。另外,网上也有各种各样的Java面试题,很多也是着重在Java语言基础上。实际上,如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不
8 0
C#之数据库操作类
  平时在进行C#开发时,需要对数据库进行操作,下面介绍几种常见的操作数据库的方法:   一、操作类DataAccess   using System;   using System.Collections.Generic;   using System.Linq;   using System.Text;   using System.Data;   using System.Data.SqlClient;   using DevExpress.XtraEditors;   using System.Windows.Forms;   //自己写的解密数据库链接dll,可
5 0
centos7.3部署MongoDB4.0.1 实际教程
  Centos7.3安装MongoDB   上传软件包   1. 解包   tar zxvf mongodb-linux-x86_64-rhel70-4.0.1.tgz   2. 把解压出来的包更改名称   mv mongodb-linux-x86_64-rhel70-4.0.1 mongodb4.0.1   3. 在/usr/local下创建目录并把包移动过去
8 0
SpringBoot 如何在日志中增加 trace id 用于链路追踪
SpringBoot 如何在日志中增加 trace id 用于链路追踪
10 0
Java 并发与高并发知识学习
  一、并发与高并发基本概念   并发:   从业务上简单解释就是多个用户(编码层面就是多个线程)共同竞争(修改或读取)一个资源,并发问题更多体现在业务代码操作数据上,例如:秒杀场景,瞬间会有大量用户共同抢购一个商品,这时候如果没有并发控制,则极有可能出现超卖情况,即库存被扣成了负数。   从操作系统以及硬件层面解释并发:有多个线程运行在CPU上,当在单核处理上运行的时候,多个线程在单核处理上交替执行(伪并行),不断的从内存中换入换出,在多核处理器上每个线程会被分配到某一个内核上运行(并行),我觉得更适合叫并行计算。
8 0
Django model字段类型解析
  Model字段认识   V=models.CharField(max_length=None<, **options>)    #varchar   V=models.EmailField()    #varchar   V=models.URLField()    #varchar   V=models.FileField(upload_to=None<, max_length=100, **options>)    #varchar #upload_to指定保存目录可带格式,   V=models.ImageField(upload_to=None<, height_fie
6 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
11939
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载