1,服务器硬件对性能的影响
1,CPU资源
1,MySQL不支持多CPU对同一SQL并发处理
2,mysql版本最高对CPU支持越流畅
3,需要购买64位CPU,并选择服务器系统版本位64位
2,可用内存大小
1,当热数据大于可用内存大小时就会形成瓶颈
2,当数据为100G内存为50G,可以提升内存达到优化效果
3,当数据为100G内存为200G,提升内存是没有优化效果的(可以增加其他服务性能)
4,内存主频越高速度越快,选择内存时请选择主板支持的最大内存频率
3,磁盘I/O - 延迟,吞吐量
1,传统机器磁盘 - 价格低 。使用量广。最常见。存储空间大。读,写较慢
磁盘读取过程
1,移动磁头到磁盘表面上的正确位置
2,等待磁盘旋转,使的所需的数据在磁头之下 - 访问时间
3,等待磁盘旋转过去,所有所需的数据都会 - 传输时间
选择磁盘
1,存储容量 - 单盘尽可能大
使用RAID把多个容器小磁盘组合成大磁盘 - RAID级别如下:
1,RAID 0 - 便宜,快速,危险,没有冗余,盘数随意,读快,写快
2,RAID 1 - 高速读,简单,安全,有冗余,最低2盘,读快,写慢
3,RAID 5 - 安全,成本折中,有冗余,N+1盘,读快,写取决于最慢的盘
3,RAID10 - 贵,高速,安全,有冗余,2*N盘数,读快,写快
2,传输速度 - 读取时间
3,访问时间 - 移动磁头时间
4,主轴转速 - 7.2k或者15k
5,物流尺寸 - 盘越小移动越快
2,固态硬盘 SSD - 支持并发,随机读写(容易损坏)
特点
1,使用SATA接口,可以替代传统磁盘而不需要任何改变
2,SATA接口的SSD同样支持 RAID 技术
场景
1,适用于存在大量随机I/O的场景
2,适用于解决单线程负载的I/O瓶颈
3,PCI-E SSD
特点
1,无法使用SATA接口,需要独特的驱动和配置
2,价格相对于SSD更贵,但是性能比SSD更好
4, SAN
特点
1,大量顺序读写
2,不如本地RAID磁盘
3,读写I/O
4,缓存
5,I/O合并
6,随机读写,慢
场景
数据库备份
4,网络 - 延迟,带宽
问题
1,网络带宽对性能的影响
2,网络质量对性能的影响
建议
1,采用高性能和高带宽的网络接口设备和交换机
2,对多个网卡进行绑定,增强可用性和带宽
3,尽可能的进行网络隔离。如下:
1,业务和管理平台
2,业务和外网
3,
总结如下:
CPU
1, 64位的CPU一定要工作在64位的系统下
2, 对于并发比较高的场景CPU的数量比频率重要
3,对于CPU密集性场景和复杂的SQL则频率越高越好
内存
1,选择主板所能使用的最高频率的内存
2,内存的大小对性能很重要,所以尽可能的大
I/O子系统
PCIe卡 -> SSD -> Raid10 -> 磁盘 -> SAN
2,服务器系统
Windows 大小写不敏感,Linux 大小写不敏感
CentOS系统参数优化 - 需要重启系统
内核相关优化参数(/etc/sysctl.conf)
1,每个端口监听最大的长度
net.core.somaxconn = 65535
net,core,netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
2,tcp等待处理的链接时间,加快tcp回收时间
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
3,tcp接收和发送缓冲区最小值和最大值
net.core.wmem_default = 87380
net.core.wmem_max = 16777216
net.core.rmem_default = 87380
net.core.rmem_max = 16777216
4,tcp失效链接所占用的系统资源和加快回收的效率
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 2
5,kernel.shmmax = 4294967295
这个参数应该设置的足够大,以便能在一个共享内存段下容纳下整个的Innodb缓存池的大小
这个的大小对于64位的linux系统,可取的最大值为物理内存值 -1byte
建议值为大于物理内存的一半,一般取值大于Innodb缓冲池的大小即可,可以取物理内存 -1byte
6,vm.swappiness = 0
linux内核除非虚拟内存完全占满,否则不要使用交换区
这个参数当内存不足时会对性能产生比较明显的影响
增加资源限制 (/etc/security/limit.conf)
打开文件数的限制
* soft nofile 65535
* hard nofile 65535
* 表示对所有用户有效
soft 指的是当前系统生效的设置
hard 表明系统中所能设定的最大值
nofile 表示锁限制的资源是打开文件的最大数目
65535 限制数量
磁盘调度策略 (/sys/block/devname/queue/scheduler)
查看当前磁盘调度策略
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
修改
echo deadline > /sys/block/sda/queue/scheduler
echo <schedulername > /sys/block/devname/queue/scheduler
noop (电梯式调度策略)
倾向饿死读而利于写。对于闪存设备,RAM及嵌入式系统是最好的选择
deadline (截止时间调度策略)
默认读期限短于写期限,不能被读取而饿死的现象。对数据库类应用是最好的选择
anticipatory (预料I/O调度策略)
本质上和deadline一样,但在最后一次都操作后,要等待6ms,才能继续进行对其他I/O请求进行调度
他会在每个6ms中插入新的io操作,而会将一些小写入流合并成一个大写入流,用于写入延时换区最大的写入吞吐量
AS适合于写入较多的环境,比如文件服务器,AS对数据库环境表现很差
3,文件系统对性能的影响
Windows只有 FAT 和 NTFS,只用于数据库服务器请使用 NTFS
Linux有 EXT3 和 EXT4 和 XFS
XFS 比 EXT3 和 EXT4性能更优
EXT3/4系统的挂载参数(/etc/fstab)
data = writeback | ordered | journal
noatime nodiratime
writeback 源数据写入和数据并不同步 (对 Innodb 是一个比较好的选择)
ordered 只会记录源数据,但提供了一致性的保证 (比writeback会慢一些,但是会更加安全)
journal 具有原子性,会在写入前将其写入日志 (最慢一个,相对于Innodb没什么必要)
常用挂载配置
/dev/sda1/ext4 noatime,nodiratime,data=writeback 1 1
4,MySQL体系结构 - 插件式存储引擎
客户端(PHP)
链接管理器(MySQL服务层)
存储引擎层(Innodb / myisam / CSV / XtraDB / Memory / MRG_MYISAM / archive 等等的存储引擎)
5,存储引擎
MyISAM
MyISAM: 5.5之前版本默认存储引擎
MyISAM: 不支持事务,表级锁
MyISAM: 索引存储在内存,数据存储在os
MyISAM存储引擎表由一下信息组成 frm(结构)MYD(数据)MYI(索引)
MyISAM: 特性
并发性,读写互斥
锁级别,共享锁
表损坏修复
check table tablename (检查)
repair table tablename (修复)
表支持全文索引类型
表支持数据压缩 myisampack -b -f tablename.MYI (-f 强制压缩,压缩后只读,不允许写)
MyISAM: 限制
版本 < MySQL5.0时默认表大小为4G
如存储大表则要修改 MAX_Rows 和 AVG_ROW_LENGTH ,rows * row 等于大小
版本 > MySQL5.0时默认表大小为256TB
MyISAM: 场景
非事务型应用(不需要完整性的)
只读类应用(读取时添加共享锁,不会有堵塞。对并发有不错的支持,同时可压缩)
空间类应用
Innodb
MySQL5.5及之后版本默认存储引擎
Innodb是事务性存储引擎,使用表空间进行数据存储
show variables like 'innodb_file_pre_table';
ON: 独立表空间:tablename.ibd 信息组成 frm(结构)ibd(数据)
OFF: 系统表空间:ibdataX 信息组成 frm(结构)系统表空间:ibdata(数字)
系统表空间和独立表空间要如何选择:
比较:
系统表空间无法简单的收缩文件大小,OFF:单删除数据并不会收回空间
地理表空间可以通过 optimize table 命令收缩系统文件
系统表空间冗余产生 io 瓶颈
独立表空间可以同时向多个文件刷新数据
建议:
Innodb 建议使用独立表空间( MySQL5.6后默认 )
Innodb:特性
Innodb:是一种事务性存储引擎,完全支持事务订单ACID特性
Innodb:使用的 Redo Log日志系统 和 Undo Log日志系统
Innodb:支持行级锁,可以最大程度支持并发(锁定资源更少更好支持并发)
Innodb:值得注意的是行级锁是由存储引擎层实现的
Innodb:共享锁 (读锁,不会被阻塞),独占锁 (写锁,会阻塞)
Innodb:锁的粒度较小 (表级锁,开销小)(行级锁,开销大)
Innodb:阻塞和死锁的理解
阻塞:正常操作事务中为保证ACID特性的一个正常操作
死锁:则是多个事务出现需要双方数据交叉的一种非常规性行为
Innodb状态检查:show engine innodb status
MySQL5.7后 Innodb已经支持全文索引和空间函数
Innodb:场景
3,数据库存储引擎的选择
4,数据库参数配置
5,数据库结构设计和SQL语句
InnoDB: 事务级存储引擎,完美支持行级锁,事务ACID特性
InnoDB: 索引存储在内存,数据也存储在内存
网友评论