服务器性能参数文档,系统参数优化
[TOC]
http://tools.percona.com/wizard
这个网站根据信息填写会给出相应的配置建议
# centos系统参数优化
## 内核相关参数优化 ( /etc/sysctl.conf )
通常服务器与数据库之间通过tcp3次握手来建立网络连接,同时有个端口会在监听,监听的端口会有多个监听队列
~~~
net.core.somaxconn=65535 #每个端口最大监听的长度
net.core.netdev_max_backlog=65535 #在每个网络接收速率比内核接收快的时候,允许发送到队列数据包的最大速率
net.ipv4.tcp_max_syn_backlog=65535 #允许未获得对方请求可保存在队列中的最大的连接数目
net.ipv4.tcp_fin_timeout=10 #用来控制tcp连接的等待时间,对于经常访问,通常会有大量连接处于等待状态的,而这个参数就是加快tcp等待时间,加快回收速度
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1 #主要加快tcp回收速度
#tcp接收和发送数据的缓冲区默认值和最大值
net.core.wmem_default=87380
net.core.wmem_max=16777216
net.core.rmem_default=87380
net.core.rmem_max=16777216
#tcp失效连接占用系统资源,加快资源回收
net.ipv4.tcp_keepalive_time=120#表示tcp发送keepalive探测消息的时间间隔,单位为秒
net.ipv4.tcp_keepalive_intvl=30 #控制发送keepalive探测消息没有消息时候,重发的间隔,单位为秒
net.ipv4.tcp_keepalive_probes=3 #失效之前重发的次数
#这个参数应该设置的足够大,以便能在一个共享内存段下容纳下整个Innodb缓冲池大小
#这个参数设置过低,会造成需要在系统中创建出多个共享内存段
#这个值的大小对于64位系统linux,可取的最大值为物理内存值-1byte,建议值为物理内存的一半,一般取值大于Innodb缓冲池的大小即可,可以取物理内存值-1byte
kernel.shmmax=4294967295
#这个参数当内存不足时会对性能产生比较明显的影响
#内存不足的时候会用到linux交换分区swap,将虚拟内存写到磁盘的交换区,来发生内存交换
#当这对mysql性能会是严重下降(free -m 命名看交换分区),建议mysql配置参数不使用交换分区
#这个参数告诉系统除非内存满了,否则不要用交换分区
vm.swappiness=0
~~~
## 增加资源限制 (/etc/security/limit.conf)
这个文件其实就是linux PAM也就是插入式认证模块的配置文件
打开文件数的限制
打开最大文件数的配置
~~~
#把这2个参数加到limit.conf文件的末尾就行了
* soft nofile 65535
* hard nofile 65535
*表示对所有用户生效
soft 表示当前系统生效的设置,soft限制不能比hard高
hard 声明系统中所能设定的最大值
nofile 表示所限制的资源是打开文件的最大数目
65535 就是限制的数量
# 注意需要重启操作系统才可生效
~~~
## 磁盘调度策略 (/sys/block/devname/queue/scheduler)
~~~
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline[cfq]
~~~
linux系统下对磁盘块设备的调度,实际上是块设备发送到底层设备的顺序,默认情况用的是cfq
上面命令显示用的是cfq,cfq一般系统用是可以的,但是对mysql的话性能不是很好
noop(电梯式调度策略)
NOOP实现了一个FIFO队列,它像电梯的工作方法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质.NOOP倾向饿死读而利于写,因此NOOP对于闪存设备,RAM,嵌入式系统是最好的选择
deadline(截止时间调度)
Deadline保证了在一个截止时间内服务的请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象,Deadline对数据库类应用是最好的选择
anticipatory(预料I/O调度策略)
本质上与Deadline一样,但在最后一次读操作后,要等待6ms,才能继续进行对其他I/O请求进行调度.它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延迟换取最大的写入吞吐量.AS适合写入较多的环境,比如文件服务器,AS对数据库环境表现很差
我们可以通过这个命令把磁盘调度策略改为deadline
~~~
echo /sys/block/devname/queue/scheduler
如 echo deadline > /sys/block/devname/queue/scheduler
~~~
## 文件系统对性能的影响
windows有FAT和NTFS,实际可选择就只有NTFS
linux有EXT3,EXT4,XFS,这3个都是有日志功能,这3个表现好的是XFS
如果是EXT3/4系统的挂载参数(/etc/fstab)
~~~
data=writeback | ordered | journal # 3个参数表示不同的日志策略
# writeback表示源数据写入和数据写入不是同步的,这是最快的日志
# ordered保证一致,在写源数据的时候先写数据
# journal 更安全,最慢的
还有2个参数,noatime, nodiratime
表示禁止访问时间和读取时间,禁用2个选项,有利于写的速度
例子:
/dev/sda1/ext4 noatime,nodiratime,data=writeback11
~~~
# Mysql服务器参数
## 内存配置参数
* 确定可以使用的内存的上限
* 确定Mysql每个连接使用的内存
~~~
sort_buffer_size
排序缓冲区内存,规定了每个线程使用排序缓冲区大小,不是在连接初始化的时候就分配的,而是在有查询要做排序操作的时候才会分配内存,需要注意的是当查询做排序操作的时候就会立即分配该排序这么多内存,不管他是否需要这么大的内存,如果我们给他设置100M,当10个连接进来做排序的时候,mysql就会占用1G内存
join_buffer_size
关联缓冲区大小,每个线程使用关联缓冲区大小.当一个连接关联多张表的时候,为每个关联分配一个缓冲,所以一个关联会有多个缓冲
read_buffer_size
每个线程当对myisam表全表扫描时,读使用的缓冲区大小,有查询需要的时候才会分配,这个参数的大小一定要是4K的倍数
read_rnd_buffer_size
排序操作时将表的row pointer读入sort buffer,然后读取sort buffer中的row pointer并排序,按排序后的row pointer将行读入read_rnd_buffer中
每个线程当需要的时候,mysql会分配,不是全部给设置的大小
Innodb_buffer_pool_size
innodb所使用的缓冲池的大小,不仅缓存索引还会缓存数据,插入缓冲,锁等等,innodb还能利用缓存池来帮助写入,然后一起顺序的写入磁盘
总内存-(每个线程所需要的内存*连接数)-系统保留内存 这样就是这个大小了
需要注意的是,如果给他分配很大的内存,当关闭的时候,innodb也需要很长的时候把内存中的一些东西写到磁盘上
key_buffer_size 这个是给myisam用的,用来缓存索引,myisam表只能缓存索引,数据是由操作系统缓存的,mysql的系统表还在使用myisam存储引擎
~~~
## I/O相关的配置参数
这部分决定了,修改的数据如何同步到磁盘上,对数据做持久化保存,这部分参数对性能影响也是比较大的
## innodb I/O相关配置
他是事务存储引擎,他为了节省I/O开销,他是每次事务都写入事务日志中而不是每次修改都写到磁盘中,为了提高I/O性能,因为每次事务都要把数据写到对应表的随机位置,这样会产生大量的随机I/O,而记录事务日志是顺序I/O相比刷新脏数据要快的多,写到事务日志就算成功
即使服务器宕机,我们也能从事务日志中恢复以及提交的事务
~~~
Innodb_log_file_size 控制单个事务日志的大小
Innodb_log_files_in_group 控制事务日志文件的个数
事务日志总大小 = Innodb_log_files_in_group*Innodb_log_file_size
事务日志是循环使用的,当这个使用满了才会使用下一个
一般来说事务日志的总大小可以记录服务器一个小时的事务总信息
事务不是先写入到事务日志文件中的,而是先写入事务日志的缓冲区,然后在刷新到磁盘中
Innodb_log_buffer_size 用来控制日志缓冲区大小,至少一秒就会刷新到磁盘,32M-128M不要设置太大,而刷新频率影响还是比较大的
Innodb_flush_log_at_trx_commit
值有0和1,2
0:每秒进行一次log写入cache,并flush log到磁盘,当mysql崩溃至少丢失1秒的数据
1 [默认]:在每次事务提交执行log写入到cache,并flush log到磁盘
2[建议]:每次事务提交,执行log数据写入到cache,每秒执行一次flush log到磁盘,mysql进程崩溃不会丢失数据,但是服务器宕机才可能丢失至少一秒数据
Innodb_flush_method=O_DIRECT
innodb刷新方式,innodb的数据文件和日志文件如何和系统进行交互,影响innodb怎么写数据和怎么读数据,设置为这个值就是建议操作系统不要缓存数据也不要预读,完全关闭操作系统缓存
Innodb_file_per_table=1
Innodb_doublewrite=1 控制innodb是否启用双写缓存,避免没有写完整造成数据丢失,增加数据安全性,对性能有一些影响,影响不会太大
~~~
## MyISAM I/O相关配置
~~~
delay_key_write 控制关键字缓冲的脏块什么时候刷新到磁盘中
OFF:每次写操作后刷新键缓冲中的脏块到磁盘中,关闭延迟写入,最安全的选项,性能比较差
ON:只对键表时指定了delay_key_write选项的表使用延迟刷新
ALL:对所有MYISAM表都使用延迟键写入
注意:如果当mysql崩溃,脏块中数据没有写入就会造成myisam索引的损坏,这样就要对myisam表进行修复了
~~~
## 安全相关配置参数
~~~
expire_logs_days指定自动清理binlog的天数
开启了binlog就要开启这个,清理旧的binlog日志,避免日志太大,设置至少2次全备的间隔
max_allowed_packet控制mysql可以接收的包的大小,也控制用户定义变量最大的大小,配置了主从的话要保持一致,从小于主否则会导致主从失败
skip_name_resolve 禁用DNS查找,但是禁用的话只能对ip或者ip段或者host文件中出现的进行授权了
sysdate_is_now确保了sysdate()返回确定性日期
read_only 禁止非super权限的用户写权限,建议在主从复制中的从库使用,这样就只接受主库中的写入
skip_slave_start 禁止slave自动恢复,在主从上从库使用的,从库崩溃会自动恢复,但是这个恢复一般是危险的,一般要我们检查通过才允许恢复
sql_mode 设置mysql所使用的SQL模式
~~~
## 其他常用的配置参数
~~~
sync_binlog 控制mysql如何向磁盘刷新binlog
默认为0,mysql不会写,操作系统会根据情况来写
1,就是每次事务提交都会写到binlog,最安全的,建议主库上使用
tmp_table_size和max_heap_table_size
一起设置的,控制内存临时表大小,不要设置太大
max_connections控制允许的最大连接数,默认是100
~~~