在高负荷下薄挂

时间:2012-02-21 19:59:16

标签: ruby-on-rails postgresql load thin

我们有一个Thin + RoR和ActiveRecord + memcached + Postgres应用程序,它使用pg gem来访问Postgres数据库。

我们观察到,在高负载下,精简过程突然变得无法响应,并且在负载消退时永远不会恢复。与此同时,我们的数据库服务器运行良好 - 我们可以查询数据并在预期时间内获得响应。

我们观察到的事情:

  • 在我们处于不良状态之前,我们看不到响应时间的缓慢增加 - 过渡是突然的。
  • 我们可以通过一个或多个精简进程进入该状态,这似乎消除了它们在负载下彼此死锁的可能性。
  • 当负载消退时,精简流程无法恢复并继续无响应。
  • 挂起后,精简进程似乎不向DB发出任何请求。
  • gdp指出当处于挂起状态时,我们在sleep_forever状态下有细线程:在sleep_forever中的0x00007f75c78c85d2(arg =)在thread.c:848

请记住,这是95%的读取应用程序,具有或多或少的积极缓存策略(即我们没有可能导致死锁的数据库事务),我们正在寻找关于在哪里查看的建议。

非常感谢你的帮助!额外信息:

宝石:

  • gem'trail','2.3.11'
  • 宝石'瘦','1.2.7'
  • gem'pg'

环境:

  • psql(PostgreSQL)9.1.2
  • Thin 1.2.7
  • Ruby 1.9.2-p290
  • Rails 2.3.11
  • Apache 2.2.14(详情如下)
Server version: Apache/2.2.14 (Ubuntu)
Server built:   Feb 14 2012 16:42:27
Server's Module Magic Number: 20051115:23
Server loaded:  APR 1.3.8, APR-Util 1.3.9
Compiled using: APR 1.3.8, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/worker"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT=""
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
root@a17:~# /usr/sbin/apache2 -v
Server version: Apache/2.2.14 (Ubuntu)
Server built:   Feb 14 2012 16:42:27

2 个答案:

答案 0 :(得分:2)

这是ruby中TCP堆栈的问题: http://bugs.ruby-lang.org/issues/5343

尝试升级到ruby 1.9.3或更高版本。

答案 1 :(得分:1)

我们最终从Thin转向Unicorn。问题消失了。