从大的几个方面来看一下,

第一方面是数据库服务器的硬件,cpu 内存 磁盘io ,

第二方面服务器所用的操作系统,

第三个方面是数据库的存储引擎,比如myisam 不支持事务的,同时使用的是表级锁,而innodb ,是事物级存储引擎,完美的支持行级锁,事务ACID特性。

第四个方面是,数据库参数配置,mysql有上百项的参数配置,

第五方面就是数据库表结构设计和SQL语句,数据库优化的重点,就是数据库表结构设计、sql语句的编写和优化,

计算密集的应用时,硬件资源 cpu和内存可用大小,当热数据可用大小远远超出了可用内存的大小,这时候io就成为了我们瓶颈,网络大量数据被查询,特别在使用memcache缓存层的时候,当缓存大量失效的时候,就会产生大量的网络传输,从而影响服务器的性能,网络和IO是第二个硬件的影响。

1、如何选择cpu, 看我们的应用是否是cpu密集型的,cpu密集型,我们需要更好的cpu,而不是更多的cpu,当前的mysql,不支持多cpu对同一sql并发处理,就是一个cpu只能处理一个sql,不管sql多复杂,我们都只能用一核cpu做处理,接下来我们要看我们系统的并发量如何,mysql通常应用在web类应用中,这类中并发量通常是比较大的,这种情况下,cpu核数量比频率就更重要了,同时考虑mysql使用的版本,现在5.6 5.7 可以更好的支持多核cpu,可以放心使用16核32核这样的多核cpu。注意,64位使用32位的服务器版本,32位系统意味不能使用大量内存

2、如何选择内存的大小直接影响数据库的性能,目前内存的效率远远高于磁盘,就和高速磁盘SSD 和Fushion-io相比,也快很多,所以把数据缓存的内存中进行读取,可以大大提高数据库的性能。选择内存选择注意,内存的主频与cpu的主频是类似的,频率越高读写的就越快,主板支持的最大内存频率,还有服务器内存,是组成购买升级的,所以每个通道的内存,要相同的品牌、颗粒,频率、电压、校验技术和型号的,单条的内存尽可能大。

常用的mysql存储引擎中,Myisam 会把索引缓存到内存中,把数据通过操作系统来缓存
而InnoDB 会把索引和数据同时缓存到内存中,从而提高数据库的效率,
提示 ,内存越多越好,但是对性能也是有限的,并不能无限的增加性能,数据库利用的内存是有限的,当缓存的数据和磁盘中的数据是一样的时候,也就是所有数据都被缓存的内存后,增加内存也没有意义,

关于缓存一个常见的误区是,只有读会在缓存中受益,如果有足够的内存,就可以完全避免磁盘读取的请求,如果所有的数据文件都可以放在内存中,一旦服务器缓存热起来,也就是所有数据都被缓存起来之后,所有的读操作都会在缓存中命中,但是写入是不同的问题,写入可以在内存中完成,但是迟早呢会写入的磁盘中,但缓存还是对写入磁盘有好处的,把一次写入磁盘变成,多次一起写入磁盘。数据就提供了类似的一些功能,可以在缓存池中,把同一数据的多次写操作呢,变成一次写操作,写入到磁盘。

3、磁盘的配置和选择 性能的限制是 延迟和吞吐量, 使用传统机器磁盘、使用RAID增强传统机器硬盘的性能、使用固态存储SSD和PCIe卡、使用网络存储NAS和SAN。

传统磁盘读取数据的过程,1>移动磁头到磁盘表面上的正确位置 2>等待磁盘旋转,使得所需要的数据在磁头之下3>等待磁盘旋转过去,所有所需的数据都被磁头读出。磁盘操作这些有多快,也就决定了磁盘的读写速度 ,有两个数字来衡量,第二部分称之为1和2访问时间,第三部 称之为传输速度,.如何选择传统磁盘,1、存储容量,2、传输速度,3、访问时间,4、主轴转速1万转或1.5万转 5、物理的尺寸。

使用RAID增加传统机器硬盘的性能,什么是RAID 是磁盘冗余队列的简称,简单来说RADI的作用就是把多个容量较小的磁盘,组成一组容量更大的磁盘,并提供数据冗余来保证数据完整性的技术。RAID解决了传统磁盘的损坏而导致的数据的丢失,RAID 0 级别,最早出现的RAID模式,也称之为数据条带。是组建磁盘阵列中最简单的一种形式,只需要2块以上的磁盘即可,成本低,可以提高真个磁盘的性能和吞吐量。RAID0 没有提供冗余或错误修复能力,但是实现成本是最低的。RAID0 的实现方式,简单来说就是多个独立的磁盘串联到了一起,从而形成了一个更大的磁盘,比如有三个300G的磁盘,组合在一起就可以组合成900G的磁盘。并且在写入数据的时候,可以同时向三个磁盘并发的写入,这样写入的速度就是单个磁盘写入的速度的三倍,RAID 0 其中任何一个磁盘损坏都会造成整个磁盘的数据丢失。 

RAID 1 又称 磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下,最大限度的保证系统的可靠性和可修复型性。RAID1 适合存放日志。 

RAID 5又称分布奇偶校验磁盘阵列,通过分布式奇偶校验块把数据分散到多个磁盘上,这样如果任何一个盘数据失效,都可以从奇偶校验块中重建,但是如果两块磁盘失效,则整个卷的数据都无法恢复。适合已读为主的业务,

RAID 10 对数据库最好的选择,它是对磁盘先做RAID1 之后对两组RAID 1的磁盘再做RAID 0,所以对读写都有良好的性能,相对于RAID 5 重建起来更简单,速度也更快。

固态存储ssd 或是pci e卡,固态存储的特点,相比机械磁盘固态磁盘有更好的随机读写性能,相比机械磁盘固态磁盘有更好的支持并发,相比机械磁盘固态磁盘更容易损坏。常用的SSD 固态磁盘,特点如下,使用SATA接口,可以替换传统的磁盘而不需要任何改变,直接插在sata 接口上就可以使用。sata接口的ssd同样支持RAID技术。PCI-E卡 Fusion-io,特点无法使用SATA接口,需要独特的驱动和配置, 价格相对于SSD要贵,但是性能比SSD更好,pcie 还要使用服务器内存,固态存储的使用场景,适用于存在大量随机IO 的场景,适用于解决单线程负载io 瓶颈。

网络存储 SAN 和NAS  ,SAN 和NAS 是两种外部文件存储设备加载到服务器上的方法,SAN设备通过光纤连接到服务器,设备通过块接口访问,服务器可以将其当做硬盘使用,SAN 设备可以承受大量顺序读写,并且这些读写可以缓冲,并且合并,但是随即读写,慢。NAS 设备使用网络连接,通过基于文件的协议如NFS 或SMB来访问,网络存储使用的场景,顺序io 可以,但是随机io 比较慢,所以不适用存储数据库文件,适用数据库备份文件。

影响数据库另一个硬件设备网络,网络性能的限制也体现在 延迟和吞吐量称之为带宽,数据库服务器和和web服务器之间是通过网络连接的,当带宽不足的时候,就会产生阻塞。网络质量对性能的影响,如网络质量不好经常丢包,网络配置提供一下建议, 采用高性能和高带宽的网络接口设备和交换机,对多个网卡进行绑定,增强可用性和带宽,尽可能的进行网络隔离。

总结服务器硬件对性能的影响  

cpu 64的cpu一定要工作在64位的系统下, 对于并发比较高的场景cpu数量比频率重要,对于cpu密集型场景和复杂sql则频率越高越重要

内存 选择主板所能使用的最高频率的内存,内存的大小对性能很重要,所以尽可能的大,内存越大可以把,随即io变成顺序io,并且把读写数据进行缓存,把多次写合并成一次写,所以内存越多越好的。

IO子系统 足够的内存可以减少随机IO ,较小服务器性能,但并不能避免随机io的发生,数据库一旦遇到随机io的读写,就会对性能,产生很大影响,造成性能下降,对于io子系统,使用pcie 卡>SSD > Raid 10>磁盘>SAN网络存储

操作系统对性能的影响

mysql适合的操作系统

windows 书籍 linux系统优化大师

linux centos 系统参数优化

1、内核相关参数(/etc/sysctl.conf)

网络的链接参数,对于一个tcp链接来说,服务器与客户端就要进行三次握手,来建立网络的链接,当三次握手成功之后,我们可以通过netstat可以看到端口的状态呢,由监听转为连接,接下来这条链路上就可以传输这条数据了,对于一处于监听状态的端口呢,都会有自己的监控队列,这个参数是指每个端口监听队列最大的长度,net.core.somaxconn = 65535 ,这个参数默认值比较小,修改成2048或更大的值,net.core.netdev_max_backlog=65535   net.ip4.tcp_max_syn_backlog=65535,其中backlog参数呢,在每个网络接口接收数据包速率比内核处理数据包处理速率快的时候,允许被发送队列中的数据包最大数目,另个参数决定了这些还未获得对方的链接的请求,保存在队列中的最大数目,对于超过这个大小的链接可能会被抛弃,所以要同时跳大一些,

net.ipv4.tcp_fin_timeout=10,这个参数呢用于控制tcp链接处理的等待状态的时间,对于链接比较频繁的系统,通常是有大量的链接是处于等待状态的,而这个参数,就是用于减少这个状态timeout的时间,加快tcp链接回收的速度,net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle =1 ,以上这三个参数是用于加快tcp连接的回收,这在一个高负载的系统下是很重要的,如果有大量的数据库连接请求,而这时tcp连接又被沾满了,就会出现数据库无法链接的错误。

net.core.wmen_default=87380

net.core.wmen_max=16777216

net.core.rmem_default=87380

net.core.rmen_max=16777216

以上四个参数决定了tcp连接,接收和发送,缓冲区大小的默认值和最大值,对于数据库应用来说,应该调整的也是大一些。

net.ipv4.tcp_keepalive_time = 120

net.ipv4.tcp_keepalive_intvl=30

net.ipv4.tcp_keepalive_probes=3

以上参数用于减少失效连接所占用的tcp系统资源的数量,加快资源回收的效率,tcp_keepalive_time表示tcp发送keepalive探测消息的时间间隔,单位为秒,用于确认tcp连接是否有效,而tcp——keepalive_intvl 当探测消息未获得响应时,重发消息的时间间隔,单位也是秒,tcp_keepalive_probes表示在认定tcp连接失效之前,多发送多少keepalive的消息,这三个参数的默认值,对一个频繁系统来说都有些大,这里改的稍微小一些。

以上就是centos对于网络性能的一些参数优化,

再看一下内存相关的参数,

kernel.shmmax=4294967295 

linux 内核参数中最重要的参数之一,用于定义单个共享内存段的最大值,注意:1、这个参数应该设置的足够大,以便能在一个共享内存段下容纳下整个的Innodb缓存池的大小。如果设置的过低,需要创建多个共享内存段,这样会导致系统的性能下降,而导致系统性能下降的主要原因呢,实际起的过程时候,多个小的共享内存段,可能会导致当时轻微的系统性能下降,但是其他的时候都不会有影响,2、这个值得大小对于64位Linux系统,可取的最大值为物理内存值-1byte,建议值为大于物理内存的一半,一般取值大于Innodb缓冲池的大小即可,可以取物理内存-1byte,上面的值是4g的大小。

vm.swappiness = 0这个参数当内存不足时会对性能产生比较明显的影响。linux系统内存交换区:在linux系统安装时都会有一个特殊的磁盘分区,称之为系统交换分区,如果我们使用free-m在系统中查看可以看到类似下面的内容其中swap就是交换分区。当操作系统因为没有足够的内存时,就会将一些虚拟内存写到磁盘的交换区中这样就会发生内存交换。一旦发生内存交换就会影响mysql的性能,结论,在mysql服务器上保留交换区还是必要的,但是要控制何时使用交换分区,这个vm.swappiness这个参数就是作用于这个控制的,=0就是告诉linux内核除非虚拟内存完全满了,否则不要使用交换区。

2、增加资源限制调整(/etc/security/limits.conf)

这个文件实际上是linux PAM也就是插入式认证模块的配置文件,这里面比较重要的是打开文件数的限制。

*soft nofile 65535 

* hard nofile 65535

以上两个参数用于控制打开文件的数量的限制,把他们加到limit.conf文件的末尾就可以了

* 表示对所有用户有效

soft 指的是当前系统生效的设置

hard 表明系统中所能设定的最大值

nofile 表示所限制的资源是打开文件的最大数目

65535 就是限制的数量

对于同一资源soft的值不能比hard高,结论 :把可打开的文件数量增加到65535个以保证可以打开足够多的文件句柄。注意:这个文件的修改需要重启系统才可以生效。

3、磁盘性能有影响的配置(/sys/block/sr0/queue/scheduler)

在linux系统上,队列调度的算法决定了块设备请求,实际上是发送到底层设备的顺序,默认情况下呢使用CFQ

完全公平队列这种策略,可以使用这个命令查看cat /sys/block/sr0/queue/scheduler 目前磁盘所使用的调度策略

noop deadline [cfq] ,用于mysql服务就不合适了, 在mysql的工作负载下,cfq由于会在队列中插入一些不必要的请求,所以会导致很差的响应时间。

其他的调度策略

影响mysql性能因素硬件、操作系统_数据

影响mysql性能因素硬件、操作系统_数据_02

影响mysql性能因素硬件、操作系统_数据_03