什么限制了mysql的性能
内存,磁盘,cpu,网络等都有可能,最常见的两个是:
cpu:当有大量数据可以足够快的读取时cpu可能会
磁盘i/o:当数据比内存的时磁盘可能出现瓶颈。
选择合适cpu
高吞吐:多核cpu
低延时:高速cpu
平衡内存和io资源
- 数据集: 单位时间内所需数据和总数据占比;
- 配置大内存: 配置大量内存使得数据集保存在内存中可以避免随机I/O;
- 缓存读写:
- 读:一旦缓存所有数据就不会再有磁盘i/0;
- 写:相同数据多次写入到缓存中然后一次刷新到磁盘,不同数据可以i/o合并写入提高了写入效率。
- 随机顺序I/O: 随机I/O慢因为可能读取的是一整页的数据;
固态存储
- 什么时候使用固态
有大量随机I/O的时候。 - 固态的类型
闪存:闪存读写很快但是写寿命短,可以两台机器连接一个闪存一个库挂了可以用另一个。
ssd:建议对ssd做raid。
PCie卡:读写最快价格最贵。 - 优化固态上的mysql
- 增加innoDB的I/O容量 增加I/O线程数到10-15(固态使并发得到增加)
- 调大innodb的日志为4g
- 禁止预读
- 把日志文件和ibdata1(双写缓冲)从闪存转移到RAID(避免很小的写入 大量小写入影响闪存寿命)而且可以利用percona server 特性使用4kb的块写事务日志,而不是默认的521字节。因为这会匹配大部分的闪存本身的块大小,以获得更好的效果
raid
-
raid0
就是把多个硬盘合并成1个逻辑盘使用,数据读写时对各硬盘同时操作,不同硬盘写入不同数据,速度快。
最少需要2块硬盘 -
raid1
同时对2个硬盘读写(同样的数据)。强调数据的安全性。损坏一块不会有影响,一般服务器系统会装在raid1上。
最少两块硬盘。 -
raid5
把多个硬盘合并成1个逻辑盘使用,数据读写时会建立奇偶校验信息,
并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,
利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。
最少3块硬盘。做raid5硬盘不宜太多,对性能有影响。 -
RAID10
把2块硬盘组成一个RAID1,然后两组RAID1组成一个RAID0,就是RAID10。
最少4块硬盘。 -
raid50
把两块raid5做成raid0,每个raid5卷有自己的校验盘,这样总共需要2个校验盘。浪费两块磁盘的空间。
允许坏掉两块磁盘,但不能是一个raid5里的两块。
最少需要6块硬盘。
类型 | 特性 | 亢余 | 盘数 | 读 | 写 |
---|---|---|---|---|---|
raid0 | 便宜快速危险 | 无 | N个 | 快 | 快 |
raid1 | 高速读取简单安全 | 有 | 2N个 | 快 | 慢 |
raid5 | 成本速度折中 | 有 | 1+2n | 快 | 依赖最慢的磁盘 |
raid10 | 昂贵高速安全 | 无 | 2*2N个 | 快 | 快 |
raid50 | 为极大数据存储服务 | 无 | 2*(1+2N)个 | 快 | 快 |
注意:
- raid的读缓存,预读缓存没必要开启因为mysql已经开了缓存,raid的缓存应该全部用到raid的写中。
- 禁用磁盘缓存因为其不带电池宕机会丢失数据:当raid把缓存写入磁盘的时候如果磁盘有缓存此时可能写入的是磁盘。(raid 卡是有带电池的)
优化网络配置
- DNS配置 尽量使用skip-name-resolve来减少因解析带来的不必要麻烦.
- 检查网络的ping 丢包率.
- 通过优化/etc/sysctl.cnf 中的网络参数,提升性能,以下便是参考值
- net.ipv4.ip_local_port_range = 1024 65535 改变本地的端口范围
- net.ipv4.tcp_max_syn_backlog = 4096 允许更多的连接进入队列
- net.ipv4.tcp_fin_timeout = 30 对于只在本地使用的数据库服务器,可以缩短tcp保持状态的超时时间、默认1分钟