一、优化方向
1、主机层面 五大资源+内核
2、服务层面 找到该服务在架构中的核心功能→核心优化
3、代码、业务层面 →协助/辅助方向
4、对接(tomcat connector nginx →php→fpm模块 fastCGI 9000)
二、硬件方面优化
优化服务器硬件的方法主要有以下几种:
- 配置较大的内存
- 配置高速磁盘系统,以减少读盘的等待时间,提高响应速度
- 合理分布磁盘 I/O,把磁盘 I/O 分散在多个设备上,以减少资源竞争,提高并行操作能力 选择正确的raid
- 配置多处理器,MySQL 是多线程的数据库,多处理器可同时执行多个线程
- 选择bgp网络协议 边界网关协议(BGP)是运行于 TCP上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。当然它的功能也非常强大,主要用于互联网AS之间的互连,BGP最主要的功能在于控制路由的传播和选择最优的路由。
- 选用bond网卡
三、软件配置
1、网络方面的配置,要修改/etc/sysctl.conf文件
增加tcp支持的队列数
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_fin_timeout = 30
#TIME_WAIT超时时间,默认是60s
net.ipv4.tcp_tw_reuse = 1
#1表示开启复用,允许TIME_WAIT socket重新用于新的TCP连接,0表示关闭
net.ipv4.tcp_tw_recycle = 1
#1表示开启TIME_WAIT socket快速回收,0表示关闭
net.ipv4.tcp_max_tw_buckets = 4096
#系统保持TIME_WAIT socket最大数量,如果超出这个数,系统将随机清除一些TIME_WAIT并打印警告信息
net.ipv4.tcp_max_syn_backlog = 4096
#进入SYN队列最大长度,加大队列长度可容纳更多的等待连接
2、mysql本身的一些优化mysql配置文件 /etc/my.cnf
公共参数默认值:
max_connections = 151 #同时处理最大连接数,推荐设置最大连接数是上限连接数的80%左右
sort_buffer_size = 2M #查询排序时缓冲区大小,只对order by和group by起作用,可增大此值为16M
query_cache_limit = 1M #查询缓存限制,只有1M以下查询结果才会被缓存,以免结果数据较大把缓存池覆盖
query_cache_size = 16M #查看缓冲区大小,用于缓存SELECT查询结果,下一次有同样SELECT查询将直接从缓存池返回结果,可适当成倍增加此值
open_files_limit = 1024 #打开文件数限制,如果show global status like 'open_files'查看的值等于或者大于open_files_limit值时,程序会无法连接数据库或卡死
注意 如果存在多个位置存在配置文件,则后面配置的内容会覆盖前面的内容,后面的生效,前面的会失效。
3、innodb方案
配置参数常用的 ,
innodb_buffer_pool_size ,非常重要的参数,用于配置innodb缓冲池的大小,如果数据库中只有innodb表,则推荐配置量为总内存的60-70%
innodb_buffer_pool_instances 5.5以后版本引进的,可以控制缓冲池的个数,增加个数可以增加并发性,该参数值默认为 1,推荐设置 4 个或 8个
innodb_log_buffer_size innodb log 缓冲的大小,由于日志最长每秒中就会刷新所以一般不用太da。
innodb_flush_log_at_trx_commit 关键参数决定了数据库多长时间把变更刷新到磁盘,参数有三种值,对innodb的io效率影响很大,默认值为1, 可以取0,1,2三个值,一般建议为2 ,但如果数据安全性比较高则使用默认值1
innodb_read_io_threads
innodb_write_io_threads 以上两个参数决定了innodb读写的io进程数,默认为4
innodb_file_per_table 关键参数,控制innodb每一个表使用独立的表空间,默认为off,也就是所有的表都会建立在共享表空间中,建议改为on ,使用独立的表空间,
innodb _stats_on_metadata 决定了mysql在什么情况下会刷新innodb表的统计信息,在show table时 会刷新表统计信息, 建议设置为off 这样就不会show table 刷新表统计信息。
4、MyISAM 参数配置
下面设置仅针对以 MyISAM 引擎为主的 DB。如果以 InnoDB 引擎为主的 DB则跳过此节。
4.1,设置索引缓存区大小
索引缓存区大小一般设置物理内存的 30% – **40%。
key_buffer_size = 2048M
4.2,设置读操作缓冲区大小
读操作缓冲区大小默认为 128K。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。一般设置为 2M 就足够了。
read_buffer_size = 2M
4.3,设置查询缓存功能
(1)为了加快查询语句的执行性能,从MySQL早期的版本开始就提供了一种名叫 Query Cache 的缓存技术。
Query Cache 的工作原理:当某一个客户端连接(session)进行 SQL查询并得到返回信息时,MySQL 数据库除了将查询结果返回给客户端外,还在特定的内存区域缓存这条 SQL查询语句的结果,以便包括这个客户端在内的所有客户的再次执行相同查询请求时,MySQL能够直接从缓存区返回结果。
2)下面配置将 query_cache_type设置为 1表示开启查询缓存功能,同时设置 Query Cache的缓冲区大小为 32M。
query_cache_type = 1``query_cache_size = 32M
四、架构优化
随着业务量越来越大,单台数据库服务器性能已无法满足业务需求,该考虑加机器了,该做集群了~~~。主要思想是分解单台数据库负载,突破磁盘I/O性能,热数据存放缓存中,降低磁盘I/O访问频率。
4.1 主从复制与读写分离甚至MM架构
因为生产环境中,数据库大多都是读操作,所以部署一主多从架构,主数据库负责写操作,并做双击热备,多台从数据库做负载均衡,负责读操作,主流的负载均衡器有LVS、HAProxy、Nginx。
主从复制、读写分离
4.2 增加缓存
给数据库增加缓存系统,把热数据缓存到内存中,如果缓存中有要请求的数据就不再去数据库中返回结果,提高读性能。缓存实现有本地缓存和分布式缓存,本地缓存是将数据缓存到本地服务器内存中或者文件中。分布式缓存可以缓存海量数据,扩展性好,主流的分布式缓存系统有memcached、redis,memcached性能稳定,数据缓存在内存中,速度很快,QPS可达8w左右。如果想数据持久化就选择用redis,性能不低于memcached。
redis
五、 性能状态关键指标
开启慢查询日志
MySQL开启慢查询日志,分析出哪条SQL语句比较慢,使用set设置变量,重启服务失效,可以在my.cnf添加参数永久生效。
mysql> set global slow-query-log=on #开启慢查询功能
mysql> set global slow_query_log_file='/var/log/mysql/mysql-slow.log'; #指定慢查询日志文件位置
mysql> set global log_queries_not_using_indexes=on; #记录没有使用索引的查询
mysql> set global long_query_time=1; #只记录处理时间1s以上的慢查询