对性能的认识起点: 最近在处理艾格的项目,客户一直反映网站的性能有问题。经过分析,发现客户的所反映的性能问题大多出现在DB层(读与写).
艾格网站使用的是MAGENTO,因此DB的默认引擎是INNODB.
INNODB所集中产生的问题:
连接以及thread
读
在前台以及后台读取速度慢
读取时,解析失败
exception 'PDOException' with message 'SQLSTATE[70100]: <<Unknown error>>: 1317 Query execution was interrupted'
写
晚上并发插入数据出现大量的事务以及锁
报错提示:
Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction'
外键约束导致写入表失败
Next exception 'Zend_Db_Statement_Exception' with message
'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`sales_flat_quote_shipping_rate`, CONSTRAINT `FK_SALES_QUOTE_SHIPPING_RATE_ADDRESS` FOREIGN KEY (`address_id`) REFERENCES `sales_flat_quote_address` (`address_id`) ON DELETE CASC)'
出现死锁
Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction'
INNODB所生成的临时表生成失败
Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'catalog_category_flat_store_1' doesn't exist'
在写入数据表时,临时表写入失败
exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 126 Incorrect key file for table '/tmp/#sql_6bf7_1.MYI'; try to repair it'
写入数据时,出现ACID事务隔离失败
'SQLSTATE[23000]:
Integrity constraint violation: 1452 Cannot add or update a child row:
a foreign key constraint fails (`sales_flat_quote_shipping_rate`, CONSTRAINT `FK_SALES_QUOTE_SHIPPING_RATE_ADDRESS`
FOREIGN KEY (`address_id`) REFERENCES `sales_flat_quote_address` (`address_id`) ON DELETE CASC)'
Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction'
Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1'
提高Performance之前需要准备的数据信息
包括几个方面: 整合WEB应用层的性能的测试数据
硬件承载量的测试
MYSQL数据库层的性能测试数据
整合WEB应用层的性能的测试数据
并发量(某一段时间内,用户的访问量是多少)
什么时间段是访问的高峰期以及读取写入期
网站各个功能的测试:
在开发之间,就应该完成性能分析功能
1.各种action,URL执行的执行时间(最好记录到数据库中,以知道在整个系统中,哪个功能以及模块在正常PV量访问也有问题)
2.WEB页面的整体访问速度
3.每一个查询的时间
4. 应用程序与数据库的连接时间
5. 对于外部资源的调用时间(JS,CSS,前端的加载速度)
6. 潜在的高性能开销处理----XML的处理
额外测试
对于splider(invisible)的执行时间(Splider在固定页面数的grap时间)
硬件的测试(系统的整体性测试)
CPU (sysbench)
IO设备的测试
硬盘等存储设备的IO读写速度(sysbench)
连续写的性能(测试CPU的高速缓存)
MYSQL数据库层的性能测试数据
基本的数据信息获取
读取
MYSQL访问最多的数据表(如电子商务中的订单,商品表等)
执行最多的查询种类(连接查询,子查询,单表查询)
查询或者是使用最多的子系统或者是模块
mysqlslap
sysbench
Database Test suite
MySql Benchmarck suite
super smack
慢日志
---正常的数据:: 排除 锁 日志等
事务
OLTP(每单位时间内的事务处理量)----sysbench来测试
事务数总计
每秒事务处理量(最大,最小响应时间)
写入
1.正常单个插入(并且开户bin log,log),服务器的正常响应时间(应该包括有两个数据: 客户端--终端显示的响应时间 以及 真正的数据库的响应时间)
2.并发同时插入,如同时有100条SQL插入时,服务器的正常响应时间.
IO读写的测试
使用方式: vmstat, iostat, mpstat, strace 在操作系统层面中的测试
测试所需要得到的数据
1. 硬件,磁盘(特别是数据库文件)在正常访问量情况下的读写速度是多少
2. 在高峰期(不同时段,以秒为单位,不同的日期内), 读取,写入,等待的时间各是多少
3. 分别获得在普通正常访问量下,高访问量(或者是写入量)的情况下,对于数据库文件,bin log, error log, slow query log等写入的时间
网络情况
对于网络流量来进行监控
INNODB 状态的即时监控
show INNODB STATUS (自动的写入到新的数据表中)
即时查看时, FLUSH STATUS;
SHOW SESSION STATUS LIKE 'Select%';
查看硬件消耗
SHOW PROFILE
SQL语句的性能以及测试
慢日志查询
服务器端参数的分析
connection与thread
thread
thread_cache_size
thread_connected
INNODB
索引
查询缓存
表缓存
写入
MYISAM
读