为了发现系统瓶颈
benchmarking是为了确定系统性能表现究竟怎么样
profiling是为了了解为什么系统会表现成这样
benchmark的作用:
测试应用当前的性能
验证系统的可伸缩性
减少系统将来扩展的风险
测试系统在变化的环境下的表现
测试系统在不同硬件、软件配置下的表现
benchmark的策略
测试整个应用,或仅仅测试MySQL
what to measure?
Transactions per time unit(throughput)
response time or latency
scalability
concurrency: 不同于前面几项,concurrency不是测试的结果,而是测试设置的一个属性。我们通常是验证系统在不同并发下的性能表现,而不是去测试系统能达到多大的并发。
常见benchmark的错误:
使用真实数据的一个子集:实际应用会用到几百G的数据,而测试时只用几个G的数据
数据分布不正确:测试数据均衡分布,但真实环境中会存在许多“hot spots”
使用不真实的参数
用单用户场景来测试多用户的应用
在单server上测试分布式的应用
没有匹配真实的用户行为,例如忽略了用户浏览网页时观看网页的时间
在循环中使用了同样的查询,真实情况不会这样,缓存会失效
忽略错误,这样benchmark的结果会变得毫无意义
忽略了系统在没有预热的情况下的表现。因为有时候需要关心系统在刚重启后的性能。同样的,如果需要测试系统一般状况的表现,也不能在刚重启后就立即测试
使用默认的server设置。实际情况往往会进行优化
Profiling
需要对应用进行profiling,同时也需要MySQL server进行profiling
MySQL Server的profiling可以分析mysql的log。log分为general log和slow log。
另外可以使用SHOW STATUS命令,检查query究竟执行了哪些操作,有助于优化query。
例如,mysql> SHOW SESSION STATUS LIKE 'Select%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Select_full_join | 0 |
| Select_full_range_join | 0 |
| Select_range | 0 |
| Select_range_check | 0 |
| Select_scan | 2 |
+------------------------+-------+
等等,诸如此类。
另外可以SHOW PROFILE,查看mysql执行某个query究竟把时间耗费在什么地方。