2012-02-21 46 views
2

我们有一个使用pg gem访问Postgres数据库的ActiveRecord + memcached + Postgres应用程序的Thin + RoR。在高负载下轻薄挂起

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

事情我们已经观察到:

  • 我们没有看到在响应时间缓慢增加之前,我们在一个糟糕的状态让 - 的过渡是突然的。
  • 我们可以用一个或多个细化进程进入该状态,这似乎消除了它们在负载下彼此死锁的可能性。
  • 当负载消退时,精简进程不会恢复,并继续无响应。
  • 一旦挂起,精简进程似乎不会向数据库发出任何请求。
  • GDP指出,当在挂起状态,我们在sleep_forever状态细线:在thread.c 0x00007f75c78c85d2在sleep_forever(ARG =):848

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

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

宝石:

  • 宝石 '轨道', '2.3.11'
  • 宝石 '薄', '1.2.7'
  • 宝石 'PG'

环境:

  • PSQL(PostgreSQL的)9.1.2
  • 薄1.2.7
  • 红宝石1.9.2-P290
  • 滑轨2.3.11
  • 阿帕奇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" 
[email protected]:~# /usr/sbin/apache2 -v 
Server version: Apache/2.2.14 (Ubuntu) 
Server built: Feb 14 2012 16:42:27 

回答

2

这与在TCP堆栈的一个问题红宝石: http://bugs.ruby-lang.org/issues/5343

尝试升级到红宝石1.9.3或更好。

+0

非常感谢。这看起来非常相关 - 堆栈跟踪是相同的 - 但是在我们升级ti 1.9.3之后,问题仍然存在。 – 2012-02-22 01:14:35

+0

我们最终从瘦身换成了独角兽,完全避免了这种情况 - 也许它在1.9.3中仍然是个问题? – Brett 2012-02-23 17:53:02

+0

这实际上正是我们最终做的。我们切换到独角兽,这个问题不再为我们重新审视。 – 2012-02-25 00:34:34

1

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

+0

这可能表明这是一个线程安全问题。 – mtkd 2014-01-05 11:27:55