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

前端之家收集整理的这篇文章主要介绍了linux – 在EC2上从PHP到MySQL的连接时间很长前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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.

这是PHP代码的存根失败

  1. $tmp = MysqLi_init();
  2. $start_time = microtime(true);
  3. $tmp->options(MysqLI_OPT_CONNECT_TIMEOUT,2);
  4. $tmp->real_connect($DB_SERVERS[$server]['server'],$DB_SERVERS[$server]['username'],$DB_SERVERS[$server]['password'],$DB_SERVERS[$server]['schema'],$DB_SERVERS[$server]['port']);
  5. if(MysqLi_connect_errno()){
  6. $timer = microtime(true) - $start_time;
  7. mail($errors_to,'DB connection error',$timer);
  8. }

数据库服务器上有超过300Mb用于新连接,服务器远不及最大允许值(1,200中的60个).在两台服务器上加载< 2个核心m1.xlarge实例上的2个. 来自MysqL配置的一些亮点

  1. max_connections = 1200
  2.  
  3. thread_stack = 512K
  4. thread_cache_size = 1024
  5. thread_concurrency = 16
  6.  
  7. innodb-file-per-table
  8. innodb_additional_mem_pool_size = 16M
  9. innodb_buffer_pool_size = 13G
  10.  

任何有关追踪减速来源的帮助都表示赞赏.

[编辑]我一直在更新网络的sysctl值,但他们似乎没有解决问题.我对数据库和应用程序服务器进行了以下调整.

  1. net.ipv4.tcp_window_scaling = 1
  2. net.ipv4.tcp_sack = 0
  3. net.ipv4.tcp_timestamps = 0
  4. net.ipv4.tcp_fin_timeout = 20
  5. net.ipv4.tcp_keepalive_time = 180
  6. net.ipv4.tcp_max_syn_backlog = 1280
  7. net.ipv4.tcp_synack_retries = 1
  8. net.core.rmem_max = 16777216
  9. net.core.wmem_max = 16777216
  10. net.ipv4.tcp_rmem = 4096 87380 16777216
  11. net.ipv4.tcp_wmem = 4096 87380 16777216

[编辑]根据jaimieb的建议,我添加了一些跟踪并使用时间捕获了以下数据.此服务器在一天的这个时间处理大约51个查询/秒.在下面概述的3分钟窗口期间,连接错误被提升一次(在13:06:36).由于有1次失败和大约9,200次成功连接,我认为这不会产生任何有意义的报告.

脚本:

  1. date >> /root/database_server.txt
  2. (time MysqL -h database_Server -D schema_name -u appuser -p apppassword -e '') > /dev/null 2>> /root/database_server.txt

结果:

  1.  
  2. === Application Server 1 ===
  3. Mon Feb 22 13:05:01 EST 2010
  4. real 0m0.008s
  5. user 0m0.001s
  6. sys 0m0.000s
  7.  
  8. Mon Feb 22 13:06:01 EST 2010
  9. real 0m0.007s
  10. user 0m0.002s
  11. sys 0m0.000s
  12.  
  13. Mon Feb 22 13:07:01 EST 2010
  14. real 0m0.008s
  15. user 0m0.000s
  16. sys 0m0.001s
  17.  
  18. === Application Server 2 ===
  19. Mon Feb 22 13:05:01 EST 2010
  20. real 0m0.009s
  21. user 0m0.000s
  22. sys 0m0.002s
  23.  
  24. Mon Feb 22 13:06:01 EST 2010
  25. real 0m0.009s
  26. user 0m0.001s
  27. sys 0m0.003s
  28.  
  29. Mon Feb 22 13:07:01 EST 2010
  30. real 0m0.008s
  31. user 0m0.000s
  32. sys 0m0.001s
  33.  
  34. === Database Server ===
  35. Mon Feb 22 13:05:01 EST 2010
  36. real 0m0.016s
  37. user 0m0.000s
  38. sys 0m0.010s
  39.  
  40. Mon Feb 22 13:06:01 EST 2010
  41. real 0m0.006s
  42. user 0m0.010s
  43. sys 0m0.000s
  44.  
  45. Mon Feb 22 13:07:01 EST 2010
  46. real 0m0.016s
  47. user 0m0.000s
  48. sys 0m0.010s
  49.  

[编辑]根据LinkedIn问题收到的建议,我尝试将back_log值设置得更高.我们一直在运行默认值(50)并将其增加到150.我们还在应用程序和数据库服务器上将内核值/ proc / sys / net / core / somaxconn(最大套接字连接)从默认值128提高到256我们确实看到了处理器利用率的一些提升,但仍然收到连接超时.

解决方法

如果从等式中消除PHP,它的效果如何?使用CLI MysqL客户端连接到服务器.从数据库服务器本身和应用服务器尝试:
  1. time MysqL -h localhost -D dbname -u username -ppassword -e ''

猜你在找的Linux相关文章