性能指标 常见的有响应时间,并发,tps等
1. 代码优化,主要是业务上的优化;
sql优化,梳理业务,查找是否有多余业务、慢查询、简化sql查询等,避免全表扫描,正确使用索引;
缓存优化:正确的使用缓存,常用的数据类似配置项参数可放到缓存中便于获取;
日志优化:正确使用日志级别打印日志,压测过程中最好调整日志级别为ERROR运行。
慢查询日志(slow query log)记录执行时间超过long_query_time秒的所有查询,便于收集查询时间比较长的SQL语句
SQL调优 定位慢的 select 默认是关闭的。需要通过以下设置进行开启:
#开启慢查询日志
mysql>slow_query_log=ON
#慢查询的阈值
mysql>long_query_time=3
#日志记录文件如果没有给出file_name值,默认为主机名,后缀为-slow.log。如果给出了文件名,文件则写入数据目录。
mysql>low_query_log_file=file_name
#慢sql查询
mysql>show variables like 'slow_query_log%';
explain sql 查看SQL语句的执行计划 分析sql
2. 通过服务器资源如mysql配置,cpu、内存、磁盘、的使用情况等排查性能瓶颈点,一般都在高性能的机器上做压测;
如:linux top命令;查看cpu信息:cat /proc/cpuinfo;
安装插件:EasyNmon 服务器性能监控工具。
部分Mysql配置可参考:
其中事务安全配置影响性能较大:
sync_binlog=1 innodb_flush_log_at_trx_commit=1 时,安全性最高,写入性能最差
sync_binlog=N (N>1 ) innodb_flush_log_at_trx_commit=2 时,MySQL的写操作才能达到最高性能。
innodb_flush_log_at_trx_commit:提交事务的时候将 redo 日志写入磁盘文件里去的策略。
0 : 提交事务的时候,不立即把 redo log buffer 里的数据刷入磁盘文件的,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。此时可能你提交事务了,结果 mysql 宕机了,然后此时内存里的数据全部丢失。
1 : 提交事务的时候,就必须把 redo log 从内存刷入到磁盘文件里去,只要事务提交成功,那么 redo log 就必然在磁盘里了。注意,因为操作系统的“延迟写”特性,此时的刷入只是写到了操作系统的缓冲区中,因此执行同步操作才能保证一定持久化到了硬盘中。
2 : 提交事务的时候,把 redo 日志写入磁盘文件对应的 os cache 缓存里去,而不是直接进入磁盘文件,可能 1 秒后才会把 os cache 里的数据写入到磁盘文件里去。sync_binlog:控制二进制日志写入磁盘的过程。值为0 、1、N:
0:默认值。事务提交后,将二进制日志从缓冲写入磁盘,但是不进行刷新操作(fsync()),此时只是写入了操作系统缓冲,若操作系统宕机则会丢失部分二进制日志。
1:事务提交后,将二进制文件写入磁盘并立即执行刷新操作,相当于是同步写入磁盘,不经过操作系统的缓存。
N:每写N次操作系统缓冲就执行一次刷新操作。更多参考:https://blog.csdn.net/thundermeng/article/details/50448614
3. 保证多服务和压测机服务网络都在同一网段且网络情况较好,可推送文件测试速率;
scp -r myfile remote_username@remote_ip:remote_folder
如:scp -r software.tar.gz root@11.12.108.165:/home
4. Tomcat运行参数调优,可以从内存、并发、缓存、IO等方面按需配置参数。
如并发优化,在tomcat的server.xml文件的Connector中调整如下参数:
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
connectionTimeout 连接超时maxThreads 客户请求最大线程数
minSpareThreads Tomcat初始化时创建的 socket 线程数
maxSpareThreads Tomcat连接器的最大空闲 socket 线程数
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
URIEncoding URL统一编码如:acceptCount="1000" connectionTimeout="60000" maxKeepAliveRequests ="2000" keepAliveTimeout="60000" minSpareThreads="100" maxSpareThreads="500"
5. 实际排查耗时点,尤其是多服务调用的情况下,可不并发单线程多次调用,在每个服务的出入口或某个功能操作的上下打印上时间戳,一般以毫秒计算即可。
long caTime = System.currentTimeMillis();
//某方法 某执行程序
logger.error("====================== sql time " + (System.currentTimeMillis() - caTime) + "ms");
6. 熟悉jmter使用和脚本编写(开发什么都得会系列!);
7. 压测过程中:1)编写压测脚本将配置项或资源加载放到单独的初始化构造或请求中,避免第一次请求过慢;2)避免服务在压测过程中出现问题,可备份数据或服务等;3)压测一次结束后查询记录数等确认是否有丢数据情况;4)大数据压测后再次压测需清理数据库数据和服务日志文件等。
mysqldump 备份数据库
mysqldump --set-gtid-purged=off -uroot -p123456 -h11.12.107.194 -P3306 km107193 > /home/db.sql;
#备份数据库
mysql -uroot -p123456 -h11.12.107.193 -P3306 km107193 < /home/db.sql;
#恢复数据库
mysql > use db_name
mysql > source /filepath/db_name.sql
#恢复数据库2
其他后续再补充!