高性能MySQL(第三版)第九章:操作系统和硬件优化

第九章 操作系统和硬件优化

  • 1. CPU 那个更好,更快的CPU还是更多的CPU?
  • 2. 平衡内存和磁盘资源
  • 3. 随机的I/O和顺序的I/O
  • 4.  使用固态硬盘(闪存)
  • 5. raid的性能优化:不做过多的记录
  • 6. 优化网络以提升mysql性能
  • 7. 选择磁盘队列的调度策略 (noop,deadline,,anticipatory,cfg(默认))
  • 8.线程
  • 9. 虚拟机内存
  • 10. 操作系统的状态

1. CPU 那个更好,更快的CPU还是更多的CPU?

当遇到CPU密集型的工作时候,mysql通常可以从更快的CPU中获益.
而,备库的话,一般是i/o密集型,因为主库和从库之间是单线程
多CPU在联机事务处理(OLTP)系统中非常有用.

2. 平衡内存和磁盘资源


配置大量内存原因其实不是因为可以在内存中保存大量数据,而最终目的是避免磁盘I/O
当所有数据放到内存中,此时服务器"热"起来,所有的读取操作都会缓存命中,换句话说,缓存可延迟写入此时便会出现缓存命中率,可以使用CPU利用率来判断缓存命中

3. 随机的I/O和顺序的I/O

顺序操作的执行速度比随机操作的块,无论在内存还是磁盘
所以增加内存是解决随机I/O读取问题的最好办法,如果有足够的内存,就可以完全避免磁盘的读取请求.存储引擎的顺序读比随机读快。

4.  使用固态硬盘(闪存)

什么情况下使用闪存?
有着大量随机I/O工作负载场景下,造成大量随机I/O的情况是由于数据大于服务器内存导致的.
优化固态硬盘上的mysql
1,增加innoDB的I/O容量 增加I/O线程数到10-15
2,增加innodb的日志文件,以帮助提升和稳定性能(4G)
3,把一些存储从闪存转移到RAID,并且ibdata1也适合放到raid卷上,而且可以利用percona server 特性使用4kb的块写事务日志,而不是默认的521字节。因为这会匹配大部分的闪存本身的块大小,以获得更好的效果
4,限制插入缓冲大小,innoDB中变更为change buffer,而不是无限增大,并避免ibdata1变得非常大。在MYSQL 5.6会有此变量

5. raid的性能优化:不做过多的记录

1,raid5 本身的优化已经可以达到raid10的性能。没钱用raid5 有钱用raid10
2,做raid阵列的监控。以便提醒硬盘或者raid卷降级或者失效

6. 优化网络以提升mysql性能

1,DNS配置 尽量使用skip-name-resolve来减少因解析带来的不必要麻烦、
2,检查网络的ping 丢包率、
3,通过优化/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分钟

7. 选择磁盘队列的调度策略 (noop,deadline,,anticipatory,cfg(默认))

mysql,oracle最好的的选择是deadline

[root@mysql-master ~]# cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 
#echo deadline > /sys/block/sda/queue/scheduler   临时修改为deadline
[root@mysql-master ~]# cat /sys/block/sda/queue/scheduler 
noop anticipatory [deadline] cfq 

永久修改方式:http://www.2cto.com/os/201307/228389.html

8.线程

新版的mysql默认都使用了新的原生的POSIX线程库(NPTL)

9. 虚拟机内存

虚拟内存是一个很糟糕的问题,可以使用vmstat 来监控内存交换,最好查看si,so,列报告内存的交换I/O活动,太多的内存交换很可能导致操作系统的交换空间溢出。甚至有些人完全禁用交换文件,这样其实不仅降低了操作系统的性能,而且还是很危险,因为禁用了内存交换就相当于给内存设置了一个不可动摇的限制,如果mysql需要很大的一块内存,或者耗内存的进程在同一台机器,mysql可能溢出,奔溃,或者被杀死。所以,操作系统会对内存的I/O进行一些控制,告诉内核,虚拟内存完全满了,否咋不要使用交换分区
cat /proc/sys/vm/swappiness     操作系统默认为0
60
但是对于服务器来说,这个值是很糟糕的,服务器应该设置为 0
echo 0 >/proc/sys/vm/swappiness

10. 操作系统的状态

vmstat 可以查看服务器的状态,是CPU密集型还是I/O密集型
CPU密集型  进程队列有等待(R),us ,sy 列有很高的值 
I/O密集型   很多处理器在非中断的休眠(b列),而且wa这一列值很高


 


你可能感兴趣的:(数据库)