zoukankan      html  css  js  c++  java
  • 5、优化服务器设置

    原则:

    • 一次只改变一个设置!这是测试改变是否有益的唯一方法。
    • 大多数配置能在运行时使用SET GLOBAL改变。这是非常便捷的方法它能使你在出问题后快速撤销变更。但是,要永久生效你需要在配置文件里做出改动。
    • 一个变更即使重启了MySQL也没起作用?请确定你使用了正确的配置文件。请确定把配置放在了正确的区域内( [mysqld])
    • 服务器在改动一个配置后启不来了:请确定你使用了正确的单位。例如,innodb_buffer_pool_size的单位是MB而max_connection是没有单位的。
    • 不要在一个配置文件里出现重复的配置项。如果想追踪改动,请使用版本控制。
    • 不要用天真的计算方法,例如”现在我的服务器的内存是之前的2倍,所以我得把所有数值都改成之前的2倍“。

    基本配置

    innodb_log_file_size:这是redolog的大小。redo日志被用于确保写操作快速而可靠并且在崩溃时恢复。从MySQL 5.5之后,崩溃恢复的性能的到了很大提升,一直到MySQL 5.5,redo日志的总尺寸被限定在4GB(默认可以有2个log文件)。这在MySQL 5.6里被提高。

    一开始就把innodb_log_file_size设置成512M(这样有1GB的redo日志)会使你有充裕的写操作空间。如果你知道你的应用程序需要频繁的写入数据并且你使用的时MySQL 5.6,你可以一开始就把它设置成4G。

    max_connections:如果经常看到‘Too many connections'错误,是因为max_connections的值太低了。这非常常见因为应用程序没有正确的关闭数据库连接,需要比默认的151连接数更大的值。max_connection值被设高了(例如1000或更高)之后一个主要缺陷是当服务器运行1000个或更高的活动事务时会变的没有响应。在应用程序里使用连接池或者在MySQL里使用进程池有助于解决这一问题(我们的项目目前没有用到连接池,php需要扩展才可以)。

    InnoDB配置

    从MySQL 5.5版本开始,InnoDB就是默认的存储引擎并且它比任何其他存储引擎的使用都要多得多。那也是为什么它需要小心配置的原因。

    innodb_file_per_table:这项设置告知InnoDB是否需要将所有表的数据和索引存放在共享表空间里(innodb_file_per_table = OFF) 或者为每张表的数据单独放在一个.ibd文件(innodb_file_per_table = ON)。每张表一个文件允许在drop、truncate或者rebuild表时回收磁盘空间。这对于一些高级特性也是有必要的,比如数据压缩。但是它不会带来任何性能收益。不想让每张表一个文件的主要场景是:有非常多的表(比如10k+)。

    MySQL 5.6中,这个属性默认值是ON,因此大部分情况下什么都不需要做。对于之前的版本必需在加载数据之前将这个属性设置为ON,因为它只对新创建的表有影响。

    innodb_flush_log_at_trx_commit:默认值为1,表示InnoDB完全支持ACID特性。当你的主要关注点是数据安全的时候这个值是最合适的,比如在一个主节点上。但是对于磁盘(读写)速度较慢的系统,它会带来很巨大的开销,因为每次将改变flush到redo日志都需要额外的fsyncs。将它的值设置为2会导致不太可靠(reliable)因为提交的事务仅仅每秒才flush一次到redo日志,但对于一些场景是可以接受的,比如对于主节点的备份节点这个值是可以接受的。如果值为0速度就更快了,但在系统崩溃时可能丢失一些数据:只适用于备份节点。

    innodb_flush_method: 这项配置决定了数据和日志写入硬盘的方式。一般来说,如果你有硬件RAID控制器,并且其独立缓存采用write-back机制,并有着电池断电保护,那么应该设置配置为O_DIRECT;否则,大多数情况下应将其设为fdatasync(默认值)。

    innodb_log_buffer_size: 这项配置决定了为尚未执行的事务分配的缓存。其默认值(1MB)一般来说已经够用了,但是如果你的事务中包含有二进制大对象或者大文本字段的话,这点缓存很快就会被填满并触发额外的I/O操作。看看Innodb_log_waits状态变量,如果它不是0,增加innodb_log_buffer_size。

    其他设置

    query_cache_size: query cache(查询缓存)是一个众所周知的瓶颈,甚至在并发并不多的时候也是如此。 最佳选项是将其从一开始就停用,设置query_cache_size = 0(现在MySQL 5.6的默认值)并利用其他方法加速查询:优化索引、增加拷贝分散负载或者启用额外的缓存(比如memcache或redis)。如果已经为应用启用了query cache并且还没有发现任何问题,query cache可能有用。这是如果想停用它,那就得小心了。

    log_bin:如果想让数据库服务器充当主节点的备份节点,那么开启二进制日志是必须的。如果这么做了之后,还别忘了设置server_id为一个唯一的值。就算只有一个服务器,如果想做基于时间点的数据恢复,这(开启二进制日志)也是很有用的:

    从最近的备份中恢复(全量备份),并应用二进制日志中的修改(增量备份)。二进制日志一旦创建就将永久保存。所以如果不想让磁盘空间耗尽,可以用 PURGE BINARY LOGS 来清除旧文件,或者设置 expire_logs_days 来指定过多少天日志将被自动清除。

    记录二进制日志不是没有开销的,所以如果在一个非主节点的复制节点上不需要它的话,那么建议关闭这个选项。

    skip_name_resolve:当客户端连接数据库服务器时,服务器会进行主机名解析,并且当DNS很慢时,建立连接也会很慢。因此建议在启动服务器时关闭skip_name_resolve选项而不进行DNS查找。唯一的局限是之后GRANT语句中只能使用IP地址了,因此在添加这项设置到一个已有系统中必须格外小心。

    了解

    当然还有其他的设置可以起作用,取决于负载或硬件:在慢内存和快磁盘、高并发和写密集型负载情况下,将需要特殊的调整。然而这里的目标是可以快速地获得一个稳健的MySQL配置,而不用花费太多时间在调整一些无关紧要的MySQL设置或读文档找出哪些设置。

    [mysqld] 

    port = 3306 

    serverid = 1 

    socket = /tmp/mysql.sock 

    skip-locking 

    #避免MySQL的外部锁定,减少出错几率增强稳定性。 

    skip-name-resolve 

    #禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求! 

    back_log = 384 

    #back_log 参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。  如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自 己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。 

    key_buffer_size = 256M 

    #key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。注意:该参数值设置的过大反而会使服务器整体效率降低! 

    max_allowed_packet = 4M 

    thread_stack = 256K 

    table_cache = 128K 

    sort_buffer_size = 6M 

    #查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。 

    read_buffer_size = 4M 

    #读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。 

    join_buffer_size = 8M 

    #联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。 

    myisam_sort_buffer_size = 64M 

    table_cache = 512 

    thread_cache_size = 64 

    query_cache_size = 64M 

    # 指定MySQL查询缓冲区的大小。可以通过在MySQL控制台观察,如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的 情况;如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓 冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。

    tmp_table_size = 256M 

    max_connections = 768 

    #指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。 

    max_connect_errors = 10000000 

    wait_timeout = 10 

    #指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。 

    thread_concurrency = 8 

    #该参数取值为服务器逻辑CPU数量*2,(服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4*2=8 )

    skip-networking 

    #开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接! 

    table_cache=1024 

    #物理内存越大,设置就越大.默认为2402,调到512-1024最佳 

    innodb_additional_mem_pool_size=4M 

    #默认为2M 

    innodb_flush_log_at_trx_commit=1 

    #设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1 

    innodb_log_buffer_size=2M 

    #默认为1M 

    innodb_thread_concurrency=8 

    #服务器CPU有几个就设置为几,建议用默认一般为8 

    key_buffer_size=256M 

    #默认为218,调到128最佳 

    tmp_table_size=64M 

    #默认为16M,调到64-256最挂 

    read_buffer_size=4M 

    #默认为64K 

    read_rnd_buffer_size=16M 

    #默认为256K 

    sort_buffer_size=32M 

    #默认为256K 

    thread_cache_size=120 

    #默认为60 

    query_cache_size=32M

    Linux等环境软件安装
  • 相关阅读:
    jquery $.ajax $.get $.post的区别
    浅析JQuery中的html(),text(),val()区别
    单词统计续
    第一阶段意见评论
    学习进度9
    第一阶段SCRUM冲刺10
    第一阶段SCRUM冲刺09
    单词统计
    第一阶段SCRUM冲刺08
    学习进度8
  • 原文地址:https://www.cnblogs.com/Adam-Ye/p/14850926.html
Copyright © 2011-2022 走看看