EC2上从PHP到MySQL的连接时间很长

我有一个间歇性的问题与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