我有一个间歇性的问题与InnoDB连接到一个数据库从属。 间歇性地我得到的连接时间超过2秒。 这些服务器托pipe在亚马逊的EC2上。
应用程序服务器是在Ubuntu上运行的PHP 5.2 / Apache。 DB slave在Ubuntu 9.10上运行Percona的XtraDB 5.1。 它使用EBS Raidarrays来存储数据。
我们已经使用跳过名称parsing并绑定到地址0.0.0.0。
这是失败的PHP代码的一个存根
$ tmp = mysqli_init();
$ start_time = microtime(true);
$ tmp-> options(MYSQLI_OPT_CONNECT_TIMEOUT,2);
$ TMP-> real_connect($ DB_SERVERS [$服务器] [ '服务器'],
$ DB_SERVERS [$服务器] [ '用户名']
$ DB_SERVERS [$服务器] [ '密码'],
$ DB_SERVERS [$服务器] [ '模式'],
$ DB_SERVERS [$服务器] [ '端口']);
如果(mysqli_connect_errno()){
$ timer = microtime(true) - $ start_time;
($ errors_to,'DB connection error',$ timer);
}
数据库服务器上有超过300Mb的新连接,而且服务器距离允许的最大值(1200个中的60个)还远远不够。 在两个服务器上加载4个核心m1.xlarge实例<2。
从MySQLconfiguration的一些亮点
max_connections = 1200 thread_stack = 512K thread_cache_size = 1024 thread_concurrency = 16 InnoDB的文件,每个表 innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 13G
任何帮助追踪放缓的来源,赞赏。
[编辑]我一直在更新networking的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的build议,我添加了一些跟踪,并使用时间捕获以下数据。 这台服务器在这个时间处理约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
结果:
===应用程序服务器1 === 星期一2月22日13:05:01东部标准时间2010年 实际0m0.008s 用户0m0.001s sys 0m0.000s 星期一2月22日13:06:01东部标准时间2010年 实际0m0.007s 用户0m0.002s sys 0m0.000s 星期一2月22日13:07:01东部标准时间2010年 实际0m0.008s 用户0m0.000s sys 0m0.001s ===应用程序服务器2 === 星期一2月22日13:05:01东部标准时间2010年 实际0m0.009s 用户0m0.000s sys 0m0.002s 星期一2月22日13:06:01东部标准时间2010年 实际0m0.009s 用户0m0.001s sys 0m0.003s 星期一2月22日13:07:01东部标准时间2010年 实际0m0.008s 用户0m0.000s sys 0m0.001s ===数据库服务器=== 星期一2月22日13:05:01东部标准时间2010年 真正的0m0.016s 用户0m0.000s sys 0m0.010s 星期一2月22日13:06:01东部标准时间2010年 实际0m0.006s 用户0m0.010s sys 0m0.000s 星期一2月22日13:07:01东部标准时间2010年 真正的0m0.016s 用户0m0.000s sys 0m0.010s
[编辑]根据在LinkedIn问题上收到的build议,我试图设置back_log值更高。 我们一直运行默认值(50)并将其提高到150.我们还将应用程序和数据库服务器上的内核值/ proc / sys / net / core / somaxconn(最大套接字连接)从默认值128我们看到处理器利用率有所提升,但仍然收到连接超时。
如果从等式中消除PHP,它有多好? 使用CLI mysql客户端连接到服务器。 尝试从数据库服务器本身和应用程序服务器:
time mysql -h localhost -D dbname -u username -ppassword -e ''
检查你的DNS服务器,我认为MySQL可能试图parsing连接主机的反向DNS。 还要确保/ etc / hosts是合理的,并且有“127.0.0.1 localhost”
这可能不是很接近,但是你能等待刷新到磁盘吗? 也许超时?
请记住,您最多可能会失败1分钟的数据。
innodb_flush_log_at_trx_commit = 0(默认是1)
这将导致InnoDB每秒只写入和刷新一次日志缓冲区。 : http : //dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit