我正在使用InnoDB连接到数据库从站时出现间歇性问题.间歇性地我连接时间超过2秒.这些服务器托管在亚马逊的EC2上.
应用服务器是在Ubuntu上运行的PHP 5.2 / Apache. DB slave在Ubuntu 9.10上运行Percona的XtraDB 5.1.它使用EBS Raid阵列进行数据存储.
我们已经使用skip name resolve并绑定到地址0.0.0.0.
$tmp = MysqLi_init(); $start_time = microtime(true); $tmp->options(MysqLI_OPT_CONNECT_TIMEOUT,2); $tmp->real_connect($DB_SERVERS[$server]['server'],$DB_SERVERS[$server]['username'],$DB_SERVERS[$server]['password'],$DB_SERVERS[$server]['schema'],$DB_SERVERS[$server]['port']); if(MysqLi_connect_errno()){ $timer = microtime(true) - $start_time; mail($errors_to,'DB connection error',$timer); }
数据库服务器上有超过300Mb用于新连接,服务器远不及最大允许值(1,200中的60个).在两台服务器上加载< 2个核心m1.xlarge实例上的2个. 来自MysqL配置的一些亮点
max_connections = 1200 thread_stack = 512K thread_cache_size = 1024 thread_concurrency = 16 innodb-file-per-table innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 13G
任何有关追踪减速来源的帮助都表示赞赏.
[编辑]我一直在更新网络的sysctl值,但他们似乎没有解决问题.我对数据库和应用程序服务器进行了以下调整.
net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_sack = 0 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_fin_timeout = 20 net.ipv4.tcp_keepalive_time = 180 net.ipv4.tcp_max_syn_backlog = 1280 net.ipv4.tcp_synack_retries = 1 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 87380 16777216
[编辑]根据jaimieb的建议,我添加了一些跟踪并使用时间捕获了以下数据.此服务器在一天的这个时间处理大约51个查询/秒.在下面概述的3分钟窗口期间,连接错误被提升一次(在13:06:36).由于有1次失败和大约9,200次成功连接,我认为这不会产生任何有意义的报告.
脚本:
date >> /root/database_server.txt (time MysqL -h database_Server -D schema_name -u appuser -p apppassword -e '') > /dev/null 2>> /root/database_server.txt
结果:
=== Application Server 1 === Mon Feb 22 13:05:01 EST 2010 real 0m0.008s user 0m0.001s sys 0m0.000s Mon Feb 22 13:06:01 EST 2010 real 0m0.007s user 0m0.002s sys 0m0.000s Mon Feb 22 13:07:01 EST 2010 real 0m0.008s user 0m0.000s sys 0m0.001s === Application Server 2 === Mon Feb 22 13:05:01 EST 2010 real 0m0.009s user 0m0.000s sys 0m0.002s Mon Feb 22 13:06:01 EST 2010 real 0m0.009s user 0m0.001s sys 0m0.003s Mon Feb 22 13:07:01 EST 2010 real 0m0.008s user 0m0.000s sys 0m0.001s === Database Server === Mon Feb 22 13:05:01 EST 2010 real 0m0.016s user 0m0.000s sys 0m0.010s Mon Feb 22 13:06:01 EST 2010 real 0m0.006s user 0m0.010s sys 0m0.000s Mon Feb 22 13:07:01 EST 2010 real 0m0.016s user 0m0.000s sys 0m0.010s
[编辑]根据LinkedIn问题收到的建议,我尝试将back_log值设置得更高.我们一直在运行默认值(50)并将其增加到150.我们还在应用程序和数据库服务器上将内核值/ proc / sys / net / core / somaxconn(最大套接字连接)从默认值128提高到256我们确实看到了处理器利用率的一些提升,但仍然收到连接超时.
解决方法
@H_404_35@ 如果从等式中消除PHP,它的效果如何?使用CLI MysqL客户端连接到服务器.从数据库服务器本身和应用服务器尝试:time MysqL -h localhost -D dbname -u username -ppassword -e ''