Mysql在使用时不仅会受到自己的配置参数影响, 服务器硬件设施, 内核参数也会对性能有影响.
服务器硬件
先看下服务器硬件对Mysql性能的影响, 这里主要介绍下CPU, 内存, 磁盘IO三个方面的影响.
CPU
影响CPU性能的主要是主频和核数, 根据运行服务的不同, CPU的选取重点也会有侧重点,
CPU密集型
运行需要更快的CPU, 主频越高越好
吞吐量优先型
WEB服务使用的数据库对并发量, 吞吐量要求较高, 需要并发处理SQL的能力更高, CPU核数越多越好;
在选择mysql时, 需要注意在5.6以后的版本, 对多核CPU支持比较好.
注意: 在64位主机运行在了32位操作系统, 会导致资源的严重浪费.
内存
因为数据会缓存到内存中, 内存会直接影响性能.
MyISAM引擎会将索引数据缓存到内存中, 数据信息从磁盘中读取.
InnoDB引擎会将索引和数据信息都会缓存到内存中.
同时, 内存越大, 数据写入会更快, 因为大量的数据可缓存到内存中, 批量写入磁盘.
在选择内存时, 尽量选择主板能支持最高主频CPU; 也应选择主板能支撑的型号; 单条内存也要足够大;
磁盘
现在磁盘一般都会选用固态磁盘, 相比SAAS磁盘除了读写速度快以外, 还有另外两个优点:
1.磁盘对随机读写支持比较好;
数据库使用场景中, 随机读写是比较多的.
2. 固态磁盘能更好支持并发;
内核参数调整
除了需要选择合适的硬件支撑外, 调整合适的内核参数也很重要.
调整TCP监听队列
net.core.somaxconn = 65535
socket监听(listen) 的backlog(socket监听队列)上限.
net.core.netdev_max_backlog = 262144
当网络接口接收数据包的速率比内核处理包的速率快时, 允许发送到队列的数据包的最大数量
net.ipv4.tcp_max_syn_backlog = 262144
尚未收到客户端确认信息的连接请求的最大值
timeout时, 加快tcp连接回收
net.ipv4.tcp_tw_reuse = 1
允许将TIME-WAIT 的sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle = 1
允许TCP连接中TIME-WAIT状态的 sockets快速回收
net.ipv4.tcp_fin_timeout = 10
Socket 4次握手关闭时, 保持FIN-WAIT-2状态的时间
Tcp连接缓冲区
net.core.rmem_default = 262144
默认接收socket缓冲区大小值
net.core.rmem_max = 16777216
接收socket缓冲区的最大值
net.core.wmem_default = 262144
默认发送socket缓冲区大小值
net.core.wmem_max = 16777216
发送socket缓冲区最大值
减少失效连接占用系统资源
net.ipv4.tcp_keepalive_time = 1800 表示当keepalive起用的时候, TCP发送keepalive消息的频度. 缺省是2小时, 改为30分钟. net.ipv4.tcp_keepalive_probes = 3 对方不应答时, 探测包的发送次数 net.ipv4.tcp_keepalive_intvl = 15 探测包的发送间隔
共享内存设置
kernel.shmmax
定义共享内存段的最大值.
在64位系统中, 可取的最大值为物理内存值-1b. 应设置的足够大, 以便能在一个共享内存段中容纳整个Innodb缓存池大小; 一般为物理内存的一半.
交互内存设置
vm.swappiness=0
当物理内存完全满了之后, 使用交互内存.
系统的最大文件打开数
修改配置文件: /etc/security/limits.conf
代码语言:javascript复制cat > /etc/security/limits.conf <
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
EOF
磁盘I/O调度策略
代码语言:javascript复制echo"deadline" > /sys/block/sda/queue/scheduler
Linux提供了cfq, deadline和noop三种磁盘IO调度策略
cfq
是Complete Fairness Queueing的缩写, 是一个复杂的调度策略, 按进程创建多个队列, 试图保持对多个进程的公平, 但没考虑读操作和写操作不同耗时的情况;
deadline
这个策略比较简单, 只分了读和写两个队列, 内核会为每个I/O操作都设置一个超时时间;
noop
这个策略最简单, 只有单个队列, 只有一些简单合并操作;
Mysql这种数据库存储系统一般都会选用deadline