基础问答
问题
cpu 负载高,IO 负载低
- 内存不够
- 磁盘性能差
- SQL 问题 ------>去数据库层,进一步排查 sql 问题
- IO 出问题了(磁盘到临界了、raid 设计不好、raid 降级、锁、在单位时间内 tps 过高)
- tps 过高: 大量的小数据 IO、大量的全表扫描
IO 负载高,cpu 负载低
- 大量小的 IO 写操作:
- autocommit ,产生大量小 IO
- IO/PS 磁盘的一个定值,硬件出厂的时候,厂家定义的一个每秒最大的 IO 次数。
- 大量大的 IO 写操作
- SQL 问题的几率比较大
IO 和 cpu 负载都很高
- 硬件不够了或 SQL 存在问题
方法
1. 优化思路
定位问题点:
硬件 --> 系统 --> 应用 --> 数据库 --> 架构(高可用、读写分离、分库分表)
处理方向:
明确优化目标、性能和安全的折中、防患未然
2. 硬件优化
主机方面:
- 根据数据库类型,主机 CPU 选择、内存容量选择、磁盘选择
- 平衡内存和磁盘资源
- 随机的 I/O 和顺序的 I/O
- 主机 RAID 卡的 BBU(Battery Backup Unit)关闭
cpu 的选择:
- cpu 的两个关键因素:核数、主频
- 根据不同的业务类型进行选择:
- cpu 密集型:计算比较多,OLTP 主频很高的 cpu、核数还要多
- IO 密集型:查询比较,OLAP 核数要多,主频不一定高的
内存的选择:
- OLAP 类型数据库,需要更多内存,和数据获取量级有关。
- OLTP 类型数据一般内存是 cpu 核心数量的 2 倍到 4 倍,没有最佳实践。
存储方面:
- 根据存储数据种类的不同,选择不同的存储设备
- 配置合理的 RAID 级别(raid 5、raid 10、热备盘)
- 对与操作系统来讲,不需要太特殊的选择,最好做好冗余(raid1)(ssd、sas 、sata)
raid 卡:主机 raid 卡选择:
- 实现操作系统磁盘的冗余(raid1)
- 平衡内存和磁盘资源
- 随机的 I/O 和顺序的 I/O
- 主机 RAID 卡的 BBU(Battery Backup Unit)要关闭
网络设备方面:
使用流量支持更高的网络设备(交换机、路由器、网线、网卡、HBA 卡)
注意:以上这些规划应该在初始设计系统时就应该考虑好。
3. 服务器硬件优化
- 1、物理状态灯:
- 2、自带管理设备:远程控制卡(FENCE 设备:ipmi ilo idarc),开关机、硬件监控。
- 3、第三方的监控软件、设备(snmp、agent)对物理设施进行监控
- 4、存储设备:自带的监控平台。EMC2(hp 收购了), 日立(hds),IBM 低端 OEM hds,高端存储是自己技术,华为存储
4. 系统优化
Cpu:
基本不需要调整,在硬件选择方面下功夫即可。
内存:
基本不需要调整,在硬件选择方面下功夫即可。
SWAP:
MySQL 尽量避免使用 swap。阿里云的服务器中默认 swap 为 0
IO :
- raid、no lvm、 ext4 或 xfs、ssd、IO 调度策略
- Swap 调整(不使用 swap 分区)
理论
- 1 核 CPU同一时刻只能执行一个线程,然后操作系统切换上下文,CPU 核心快速调度,执行另一个线程的代码,不停反复,给我们造成了所有进程同时运行假象。
- 在1 核 CPU 的机器上,顺序执行A和B永远比通过时间分片切换“同时”执行A和B要快,其中原因,学过操作系统这门课程的成员应该很清楚。一旦线程的数量超过了 CPU 核心的数量,再增加线程数系统就只会更慢,而不是更快,因为这里涉及到上下文切换耗费的额外的性能。
- 连接数 = ((核心数 * 2) + 有效磁盘数) ,CPU 是 4核 i7 的,连接池大小应该为 ((4*2)+1)=9,这里算作10线程,我们可以保证,它能轻松支撑 3000 用户以 6000 TPS 的速率并发执行简单查询的场景。
- 连接池中的连接数量大小应该设置成:数据库能够有效同时进行的查询任务数(通常情况下来说不会高于 2*CPU核心数)。假设说你有 10000 个并发访问,你仅仅需要一个大小为 10 数据库连接池,然后让剩下的业务线程都在队列里等待就可以了。
- tps:该设备每秒的传输次数。“一次传输”意思是“一次 I/O 请求”。多个逻辑请求可能会被合并为“一次 I/O 请求”。
- iops :硬件出厂的时候,厂家定义的一个每秒最大的 IO 次数,"一次传输"请求的大小是未知的。
- KB_read/s:每秒从设备(drive expressed)读取的数据量;
- KB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
- KB_read:读取的总数据量;
- KB_wrtn:写入的总数量数据量;这些单位都为 Kilobytes。