我正在使用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我们确实看到了处理器利用率的一些提升,但仍然收到连接超时.